DirectXを使用し、スプライト機能を使用して画像を表示しようとしているのですがうまくいきません。
塗りつぶしは出来たのですが、画像を表示しようとすると、塗りつぶしもできなくなってしまいます。
以下がコードになります。
宜しくお願い致します。
#define NAME "DirectX勉強中"
#include <Windows.h>
#include <d3dx9.h>
// ライブラリのリンク
#pragma once
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
// #define & 構造体の定義
#define SAFE_RELEASE(x) if(x) { x->Release(); x=NULL; }
HWND g_hWnd = NULL; // Window Handle
LPDIRECT3D9 g_pD3D = NULL; //インターフェイスの取得のためのポインタの作成(構造体)
LPDIRECT3DDEVICE9 g_pDEV = NULL; // 描写用デバイス(インターフェイス)
LPDIRECT3DTEXTURE9 pTexture;//背景のテクスチャハンドル
LPD3DXSPRITE pSprite;//スプライトハンドル
LPDIRECT3DTEXTURE9 pSrcTexture; //スプライトに使うテクスチャ
D3DDISPLAYMODE d3ddm;//画面モード
D3DPRESENT_PARAMETERS d3dpp;//インターフェイスの取得のためのポインタの作成
//テクスチャの作成
HRESULT textureCreate()
{
HRESULT hr;//ハンドル
/*簡易版のテクスチャの作成~
1.使用するデバイス、
2.使用する画像ファイル、
3.作成されたテクスチャを受け取るポインタ*/
hr = D3DXCreateTextureFromFile(g_pDEV,"背景.png",&pTexture);
if(FAILED(hr))
return false;
return S_OK;
}
//スプライトの作成
HRESULT spriteCreate()
{
HRESULT hr;//ハンドル
hr = D3DXCreateSprite(g_pDEV,&pSprite);//1.使用するデバイス、2.受け取る変数
if(FAILED(hr))
return false;
return S_OK;
}
//スプライトの描画
HRESULT drawsprite()
{
//塗りつぶし
g_pDEV->Clear(0, NULL, (D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER),
D3DCOLOR_RGBA(200,100,255,0), 1.0f, 0);
HRESULT hr;//ハンドル
g_pDEV->BeginScene();//スプライトシーンの開始
///////////////////////////////////////////////////////////////////////////////////////////////
//スプライトの描画開始--これがあると塗りつぶしが無効になる
pSprite->Begin(D3DXSPRITE_ALPHABLEND|D3DXSPRITE_DONOTSAVESTATE);//
RECT SrcRect = {0,0,128,32}; //テクスチャ内の使用範囲
D3DXVECTOR3 Center(64,49,0); //スプライト内の中心
D3DXVECTOR3 Position(320,240,0);//スプライトを表示する位置
hr = pSprite->Draw(pSrcTexture,
&SrcRect,
&Center,
&Position,
D3DCOLOR_ARGB(128,128,128,128));
if(FAILED(hr))
return false;
pSprite->End();//スプライトを描画して終了
////////////////////////////////////////////////////////////////////////////////
g_pDEV->EndScene();//シーンを終了
return g_pDEV->Present(NULL, NULL, NULL, NULL);
return S_OK;
}
//初期化処理
HRESULT Init3DDev()
{
//構造体の設定
//インターフェイスの取得
if (NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION))) return E_FAIL;
if (FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm))) return E_FAIL;
//D3DPRESENT_PARAMETERS構造体の設定
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed = TRUE; // ウィンドウモード
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // 映像信号に同期してフリップする
d3dpp.BackBufferFormat = d3ddm.Format;// カラーモードの指定
d3dpp.EnableAutoDepthStencil = TRUE; // デプスバッファ(Zバッファ)とステンシルバッファを作成
d3dpp.AutoDepthStencilFormat = D3DFMT_D16; // デプスバッファとして16bitを使う
//デバイスの作成:CreateDeviceの実行
if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,g_hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pDEV)))
return E_FAIL;
return S_OK;
}
//ビューポートの作成
HRESULT Viewport()
{
HRESULT hr;//ハンドル
//ビューポートの作成
D3DVIEWPORT9 vp;
vp.X = 0;
vp.Y = 0;
vp.Width = d3dpp.BackBufferWidth;
vp.Height = d3dpp.BackBufferHeight;
vp.MinZ = 0.0f;
vp.MaxZ = 1.0f;
hr = g_pDEV -> SetViewport(&vp);
if(FAILED(hr))
return false;
return S_OK;
}
// DirectX Graphics の終了処理
void Cleanup(void)
{
SAFE_RELEASE(g_pDEV);
SAFE_RELEASE(g_pD3D);
}
// ウィンドウ処理(自分で処理したときは 0 を返す)
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, UINT wParam, LONG lParam)
{
switch(msg)
{ case WM_DESTROY:
Cleanup();
PostQuitMessage(0);
break;
case WM_KEYDOWN:
switch(wParam)
{ case VK_ESCAPE:
DestroyWindow(hWnd);
break;
}
break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}
//★ WinMain()
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
WNDCLASSEX wc = { sizeof(WNDCLASSEX),CS_CLASSDC,WndProc,0,0,
hInst,NULL,NULL,NULL,NULL,NAME,NULL
};
if (!RegisterClassEx(&wc)) return FALSE;
g_hWnd= CreateWindowEx(0,NAME,NAME,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULL);
if (!g_hWnd) return FALSE;
// DirectX Graphics の初期化
if (FAILED(Init3DDev())) return FALSE;
// ウインドウ表示
ShowWindow(g_hWnd, SW_SHOWNORMAL);
UpdateWindow(g_hWnd);
// メッセージ・ループ
ZeroMemory(&msg,sizeof(msg));
textureCreate();//テクスチャの作成
spriteCreate();//スプライトの作成
Viewport();//ビューポートの作成
//ループ
while(msg.message!=WM_QUIT)
{
//プロシージャ
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{ TranslateMessage(&msg);
DispatchMessage(&msg);
}
else drawsprite();
}
UnregisterClass(NAME, hInst);
return TRUE;
}