|
分類:[C/C++]
#include "StdAfx.h" #include "resource.h" #include "ModifyMe.h" #include "virgo19\\virgo19.h"
//#include <shlwapi.h> // PathFileExists()のために必要。 //#pragma comment(lib, "shlwapi.lib") // PathFileExists()のために必要、PrivateProfile.cppで行っているのでここで行う必要はない。
namespace { // プライベートプロファイル int fps = 0; std::string message; std::string backgroundPath;
// テクスチャ int buf = 0; LPDIRECT3DTEXTURE9 background = nullptr; LPDIRECT3DTEXTURE9 sakura = nullptr;
// フォント LPD3DXFONT statusFont = nullptr; LPD3DXFONT messageFont = nullptr;
// フレームカウンタ DWORD changeGameDataCount = 0; }
BOOL Initialize(const HINSTANCE /*hInstance*/, const LPCSTR /*lpCmdLine*/, const int /*nShowCmd*/) { virgo19::setAllocHook(); // この関数の最初に実行
// プライベートプロファイルの存在確認 const std::string profile("Virgo19.ini");
//if (!PathFileExists(profile.c_str())) { // WriteErrorLog(__FUNCTION__, "PathFileExists()", static_cast<HRESULT> (GetLastError())); // return false; //}
// プライベートプロファイルの読み込み char path[MAX_PATH + 1]; ZeroMemory(path, sizeof(path)); GetCurrentDirectory(sizeof(path), path); lstrcat(path, "\\"); lstrcat(path, profile.c_str());
fps = GetPrivateProfileInt("PARAMETERS", "FPS", 60, path); char buf[1024]; GetPrivateProfileString("STRINGS", "MESSAGE", "hello, world", buf, sizeof(buf), path); message = buf; GetPrivateProfileString("TEXTURES", "BACKGROUND", "Graphics\\燕子花.png", buf, sizeof(buf), path); backgroundPath = buf;
// FPSの設定 if (!SetFramesPerSecond(fps)) { WriteErrorLog(__FUNCTION__, "SetFramesPerSecond()"); return false; }
return true; }
BOOL Finalize(void) { virgo19::removeAllocHook(); // この関数の最後に実行
return true; }
BOOL CreateObject(const LPDIRECT3DDEVICE9 lpd3dDevice, const BOOL bResetDevice, const BOOL /*bChangingMode*/) { // フォントのリセット処理 if (bResetDevice) { bool ret = true; HRESULT hr = statusFont->OnResetDevice(); if (FAILED(hr)) { WriteErrorLog(__FUNCTION__, "statusFont->OnResetDevice()", hr); ret = false; } hr = messageFont->OnResetDevice(); if (FAILED(hr)) { WriteErrorLog(__FUNCTION__, "messageFont->OnResetDevice()", hr); ret = false; } return ret; }
// テクスチャの作成 // CreateTexture()の最後の引数をtrueにすると縮小用のフィルターが設定されます。今回は縮小しないのでfalseでよいのですが、 // 2012年度に縮小用のフィルターを設定しないとテクスチャを正しく描画できないパソコンがありましたので、 // この引数は必ずtrueにすることにします。
if (!CreateTexture(backgroundPath.c_str(), &background, nullptr, nullptr, false, true)) { WriteErrorLog(__FUNCTION__, "CreateTexture(background)"); return false; }
if (!CreateTexture("Graphics\\桜もち.png", &sakura, nullptr, nullptr, false, true)) { WriteErrorLog(__FUNCTION__, "CreateTexture(桜もち)"); return false; }
// フォントの作成 D3DXFONT_DESC fdesc; ZeroMemory(&fdesc, sizeof(fdesc)); fdesc.Height = 15; fdesc.CharSet = SHIFTJIS_CHARSET; lstrcpy(fdesc.FaceName, "MS ゴシック"); HRESULT hr = D3DXCreateFontIndirect(lpd3dDevice, &fdesc, &statusFont); if (FAILED(hr)) { WriteErrorLog(__FUNCTION__, "D3DXCreateFontIndirect(statusFont)", hr); return false; }
ZeroMemory(&fdesc, sizeof(fdesc)); fdesc.Height = 120; fdesc.CharSet = ANSI_CHARSET; lstrcpy(fdesc.FaceName, "Times New Roman"); hr = D3DXCreateFontIndirect(lpd3dDevice, &fdesc, &messageFont); if (FAILED(hr)) { WriteErrorLog(__FUNCTION__, "D3DXCreateFontIndirect(messageFont)", hr); return false; }
return true; }
BOOL DestroyObject(const BOOL bResetDevice, const BOOL /*bChangingMode*/) { // フォントのロスト処理 if (bResetDevice) { bool ret = true; HRESULT hr = statusFont->OnLostDevice(); if (FAILED(hr)) { WriteErrorLog(__FUNCTION__, "statusFont->OnLostDevice()", hr); ret = false; } hr = messageFont->OnLostDevice(); if (FAILED(hr)) { WriteErrorLog(__FUNCTION__, "messageFont->OnLostDevice()", hr); ret = false; } return ret; }
// テクスチャとフォントの破棄 bool ret = true;
if (!DestroyTexture(&background)) { WriteErrorLog(__FUNCTION__, "DestroyTexture(background)"); ret = false; }
if (!DestroyTexture(&sakura)) { WriteErrorLog(__FUNCTION__, "DestroyTexture(sakura)"); ret = false; }
if (statusFont != nullptr) { const ULONG cnt = statusFont->Release(); if (cnt != 0) { WriteErrorLog(__FUNCTION__, "statusFont->Release()", cnt); ret = false; } statusFont = nullptr; }
if (messageFont != nullptr) { const ULONG cnt = messageFont->Release(); if (cnt != 0) { WriteErrorLog(__FUNCTION__, "messageFont->Release()", cnt); ret = false; } messageFont = nullptr; }
return ret; }
BOOL InitializeGameData(const BOOL bResetDevice, const BOOL /*bChangingMode*/, const BOOL /*bReset*/) { if (bResetDevice) { return true; }
// フレームカウンタのリセット changeGameDataCount = 0;
return true; }
BOOL ChangeGameData(void) { // フレーム更新回数のカウント changeGameDataCount++;
return true; }
BOOL DrawBackBuffer(const LPD3DXSPRITE lpSprite) { bool ret = true;
// テクスチャの描画 HRESULT hr = lpSprite->Draw(background, nullptr, nullptr, nullptr, 0xFFFFFFFF); if (FAILED(hr)) { WriteErrorLog(__FUNCTION__, "lpSprite->Draw(background)", hr); ret = false; }
hr = lpSprite->Draw(sakura, nullptr, nullptr, nullptr, 0xFFFFFFFF); if (FAILED(hr)) { WriteErrorLog(__FUNCTION__, "lpSprite->Draw(sakura)", hr); ret = false; }
// メッセージの描画 RECT rc = {0, 0, nClientWidth, nClientHeight}; if (messageFont->DrawText(lpSprite, message.c_str(), -1, &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER, D3DCOLOR_XRGB(255, 0, 0)) == 0) { WriteErrorLog(__FUNCTION__, "messageFont->DrawText()"); ret = false; }
// フレームカウンタの描画 std::ostringstream oss;
//oss.str(""); // 内部バッファ(文字列ストリーム内の文字列)をクリアします。描画後ossを再利用する場合に実行する必要があります。 oss.fill('0'); oss << std::setw(10) << changeGameDataCount;
if (statusFont->DrawText(lpSprite, oss.str().c_str(), -1, &rc, DT_RIGHT | DT_BOTTOM, D3DCOLOR_XRGB(0, 0, 0)) == 0) { WriteErrorLog(__FUNCTION__, "statusFont->DrawText()"); ret = false; }
return ret; } 黒い部分を除去するにはテクスチャの基になった画像の幅と高さが必要です。 では ModifyMe.cpp の無名名前空間に燕子花 ( background ) と桜もち ( sakura ) の基になった画像の幅と高さ格納するための変数を int 型で定義します。 全部で変数は4つになります。初期値はゼロにしておきましょう。 どのようにすればいいんでしょうか。
|