X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。
修訂 | 73 (tree) |
---|---|
時間 | 2015-03-24 02:49:43 |
作者 | xops-mikan |
OpenGLにてシステムフォントへの対応を試みる(不完全)、DirectXのマップデータ描画処理を修正
@@ -1006,6 +1006,10 @@ | ||
1006 | 1006 | pd3dDevice->SetFVF(D3DFVF_XYZ|D3DFVF_DIFFUSE); |
1007 | 1007 | pd3dDevice->SetTexture(0, NULL); |
1008 | 1008 | } |
1009 | + else if( ptextures[ mapTextureID[textureID] ] == NULL ){ | |
1010 | + pd3dDevice->SetFVF(D3DFVF_XYZ|D3DFVF_DIFFUSE); | |
1011 | + pd3dDevice->SetTexture(0, NULL); | |
1012 | + } | |
1009 | 1013 | else{ |
1010 | 1014 | pd3dDevice->SetFVF(D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1); |
1011 | 1015 | pd3dDevice->SetTexture(0, ptextures[mapTextureID[textureID]] ); |
@@ -1553,6 +1557,11 @@ | ||
1553 | 1557 | hGLRC = NULL; |
1554 | 1558 | width = 0; |
1555 | 1559 | height = 0; |
1560 | + SystemFont = NULL; | |
1561 | + now_SystemFontUStr = new WCHAR [1]; | |
1562 | + now_SystemFontUStr[0] = NULL; | |
1563 | + SystemFontListIdx = 0; | |
1564 | + SystemFontListIdxSize = 0; | |
1556 | 1565 | now_textureid = -1; |
1557 | 1566 | |
1558 | 1567 | camera_x = 0.0f; |
@@ -1580,8 +1589,19 @@ | ||
1580 | 1589 | CleanupTexture(i); |
1581 | 1590 | } |
1582 | 1591 | |
1592 | + if( SystemFont != NULL ){ | |
1593 | + DeleteObject(SystemFont); | |
1594 | + } | |
1595 | + if( now_SystemFontUStr != NULL ){ | |
1596 | + delete [] now_SystemFontUStr; | |
1597 | + } | |
1598 | + if( SystemFontListIdx != 0 ){ | |
1599 | + glDeleteLists(SystemFontListIdx, SystemFontListIdxSize); | |
1600 | + } | |
1601 | + | |
1583 | 1602 | if( hGLRC != NULL ){ wglDeleteContext(hGLRC); } |
1584 | 1603 | |
1604 | + //libjpeg解放 | |
1585 | 1605 | jpeg_destroy_decompress(&cinfo); |
1586 | 1606 | } |
1587 | 1607 |
@@ -1660,7 +1680,11 @@ | ||
1660 | 1680 | //デバイスコンテキスト解放 |
1661 | 1681 | ReleaseDC(hWnd, hDC); |
1662 | 1682 | |
1683 | + //システムフォント用意 | |
1684 | + //フォント名:MS ゴシック サイズ:18 | |
1685 | + SystemFont = CreateFont(18, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, "MS ゴシック"); | |
1663 | 1686 | |
1687 | + | |
1664 | 1688 | //テクスチャフォント用画像のファイル名を設定 |
1665 | 1689 | strcpy(TextureFontFname, TextureFontFilename); |
1666 | 1690 |
@@ -3109,10 +3133,76 @@ | ||
3109 | 3133 | //! @param y y座標 |
3110 | 3134 | //! @param str 文字列 (改行コード:可) |
3111 | 3135 | //! @param color 色 |
3112 | -//! @warning <b>本関数の処理は実装されていません。</b> | |
3136 | +//! @warning <b>描画は非常に低速です。</b>画面内で何度も呼び出すとパフォーマンスに影響します。 | |
3137 | +//! @warning「改行コードを活用し一度に描画する」「日本語が必要ない文字はテクスチャフォントを活用する」などの対応を講じてください。 | |
3138 | +//! @attention フォントの種類やサイズは固定です。 文字を二重に重ねて立体感を出さないと見にくくなります。 | |
3139 | +//! @todo 文字を二重に重ねると、上下関係が正しく処理されない。 | |
3140 | +//! @todo 1文字目が欠ける場合がある。 | |
3113 | 3141 | void D3DGraphics::Draw2DMSFontText(int x, int y, char *str, int color) |
3114 | 3142 | { |
3115 | - // | |
3143 | + int len = strlen(str); | |
3144 | + WCHAR *ustr; | |
3145 | + | |
3146 | + Start2DRender(); | |
3147 | + | |
3148 | + //テクスチャ無効 | |
3149 | + glDisable(GL_TEXTURE_2D); | |
3150 | + | |
3151 | + //Unicode文字列へ変換 | |
3152 | + ustr = new WCHAR [len+1]; | |
3153 | + MultiByteToWideChar(CP_ACP, 0, str, -1, ustr, len + 1); | |
3154 | + | |
3155 | + //新たな文字列なら、リソースを作り直す | |
3156 | + if( lstrcmpW(ustr, now_SystemFontUStr) != 0 ){ | |
3157 | + GLuint listIdx; | |
3158 | + HDC hDC; | |
3159 | + | |
3160 | + //古いデータを削除 | |
3161 | + glDeleteLists(SystemFontListIdx, SystemFontListIdxSize); | |
3162 | + delete [] now_SystemFontUStr; | |
3163 | + | |
3164 | + //デバイスコンテキスト設定 | |
3165 | + hDC = GetDC(hWnd); | |
3166 | + wglMakeCurrent(hDC, hGLRC); | |
3167 | + SelectObject(hDC, SystemFont); | |
3168 | + | |
3169 | + //ディスプレイリストを作成 | |
3170 | + listIdx = glGenLists(len); | |
3171 | + for(int i=0; i<lstrlenW(ustr); i++){ | |
3172 | + wglUseFontBitmapsW(hDC, ustr[i], 1, listIdx+i); | |
3173 | + } | |
3174 | + | |
3175 | + //デバイスコンテキスト廃棄 | |
3176 | + ReleaseDC(hWnd, hDC); | |
3177 | + | |
3178 | + //設定を記録 | |
3179 | + now_SystemFontUStr = new WCHAR [len+1]; | |
3180 | + lstrcpyW(now_SystemFontUStr, ustr); | |
3181 | + SystemFontListIdx = listIdx; | |
3182 | + SystemFontListIdxSize = len; | |
3183 | + } | |
3184 | + | |
3185 | + //座標と色を設定 | |
3186 | + glBitmap(0, 0, 0, 0, 10, 0, NULL); | |
3187 | + glRasterPos2i(x, y); | |
3188 | + glColor4ub((color>>24)&0xFF, (color>>16)&0xFF, (color>>8)&0xFF, color&0xFF); | |
3189 | + | |
3190 | + for(int i=0; i<lstrlenW(ustr); i++){ | |
3191 | + if( ustr[i] == '\n' ){ | |
3192 | + //改行する | |
3193 | + y += 19; | |
3194 | + glRasterPos2i(x, y); | |
3195 | + } | |
3196 | + else{ | |
3197 | + //ディスプレイリスト描画 | |
3198 | + glCallList(SystemFontListIdx + i); | |
3199 | + } | |
3200 | + } | |
3201 | + | |
3202 | + //Unicode文字列の廃棄 | |
3203 | + delete [] ustr; | |
3204 | + | |
3205 | + End2DRender(); | |
3116 | 3206 | } |
3117 | 3207 | |
3118 | 3208 | //! @brief 文字を中央揃えで描画(システムフォント使用) |
@@ -3122,10 +3212,10 @@ | ||
3122 | 3212 | //! @param h 縦の大きさ |
3123 | 3213 | //! @param str 文字列 (改行コード:可) |
3124 | 3214 | //! @param color 色 |
3125 | -//! @warning <b>本関数の処理は実装されていません。</b> | |
3215 | +//! @warning <b>正しく中央揃えになりません。</b> | |
3126 | 3216 | void D3DGraphics::Draw2DMSFontTextCenter(int x, int y, int w, int h, char *str, int color) |
3127 | 3217 | { |
3128 | - // | |
3218 | + Draw2DMSFontText(x, y, str, color); | |
3129 | 3219 | } |
3130 | 3220 | |
3131 | 3221 | //! @brief 2D描画用設定 |
@@ -200,6 +200,10 @@ | ||
200 | 200 | MODELDATA pmodel[MAX_MODEL]; //!< モデルデータを格納 |
201 | 201 | TEXTUREDATA ptextures[MAX_TEXTURE]; //!< テクスチャを格納 |
202 | 202 | GLuint textureobjname[MAX_TEXTURE]; //!< テクスチャオブジェクト |
203 | + HFONT SystemFont; //!< システムフォント用の論理フォント | |
204 | + WCHAR *now_SystemFontUStr; //!< 現在表示中のシステムフォントによる文字列(Unicode) | |
205 | + GLuint SystemFontListIdx; //!< システムフォントのディスプレイリスト | |
206 | + int SystemFontListIdxSize; //!< システムフォントのディスプレイリストのサイズ | |
203 | 207 | int now_textureid; //!< 現在設定中のテクスチャ番号 |
204 | 208 | |
205 | 209 | float camera_x; //!< カメラ座標 |