下のようなプログラムでゲームのタイトル画像を表示したいのですが「 0xC0000005: 場所 0xFFFFFFBA への書き込み中にアクセス違反が発生しました。」というエラーが出て失敗します。プログラムの大まかな内容は、Textureクラスでテクスチャ作成、Spriteクラスで描画、Titleクラスでタイトル画面を描画、Renderで実行って感じです。Titleクラスの中でTextureクラスとSpriteクラスを使っているのですが、使い方がおかしいでしょうか。
ちなみに実行が止まるのはSpriteクラスのDraw関数内
// テクスチャセット
pDevice3D->SetTexture(0,pTexture);
の部分です。ここでアクセス違反というものが起こっているのでしょうか?
解答お願いします。(winmain、ウィンドウプロシージャ、d3dデバイスの初期化コードは省略
してます)
class Texture
{
public:
IDirect3DTexture9* pTexture;
// コンストラクタ
Texture();
// デストラクタ
~Texture();
// 画像データ読み込み
bool Load(IDirect3DDevice9* pDevice3D,TCHAR* FileName);
};
Texture::Texture(){
pTexture = NULL;
}
Texture::~Texture()
{
// 読み込まれていたら破棄
if(pTexture != NULL)
pTexture->Release();
}
bool Texture::Load(IDirect3DDevice9* pDevice3D,TCHAR* FileName)
{
// 画像読み込み
// DirextXやWindowsAPIの関数はHRESULTを結果に返す関数が多い
// FAILEDマクロで関数が失敗したかわかる
// SUCEEDEDマクロで関数が成功したかわかる
if(FAILED(D3DXCreateTextureFromFile(pDevice3D,FileName,&pTexture)))
return false; // 画像読み込み失敗(ファイルがない可能性あり)
// 画像読み込み成功
return true;
};
class Sprite
{
public:
struct Vertex{
float x,y,z;
float rhw1;
float u1,v1;
};
static const DWORD SPRITE_FVF = D3DFVF_XYZRHW | D3DFVF_TEX1;
D3DXVECTOR2 pos;
int width;
int height;
Sprite();
~Sprite();
void SetPos(int x,float y);
void SetWidth(int Width,int Height);
void Draw(IDirect3DDevice9* pDevice3D,IDirect3DTexture9* pTexture);
};
Sprite::Sprite()
{
pos.x=pos.y=0.0f;
width = 0;
height = 0;
}
Sprite::~Sprite(){}
void Sprite::SetPos(int x,float y)
{
pos.x = x;
pos.y = y;
}
void Sprite::SetWidth(int Width,int Height)
{
width = Width;
height = Height;
}
void Sprite::Draw(IDirect3DDevice9* pDevice3D,IDirect3DTexture9* pTexture)
{
// 頂点情報セット
Vertex vtx[4]={
{ pos.x + width/2, pos.y - height/2, 0.0f, 1.0f, 1.0f, 0.0f},
{ pos.x + width/2, pos.y + height/2, 0.0f, 1.0f, 1.0f, 1.0f},
{ pos.x - width/2, pos.y - height/2, 0.0f, 1.0f, 0.0f, 0.0f},
{ pos.x - width/2, pos.y + height/2, 0.0f, 1.0f, 0.0f, 1.0f}
};
// テクスチャセット
pDevice3D->SetTexture(0,pTexture);
// 頂点構造体宣言セット
pDevice3D->SetFVF(SPRITE_FVF);
// スプライト描画
pDevice3D->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,vtx,sizeof(Vertex));
}
class Title
{
public:
Texture GAZO;
Sprite sprite[1];
Title();
~Title();
void TitleDraw();
};
Title::Title(){
GAZO.Load(g_pd3dDevice,_T("title.png"));
sprite[0].SetPos(160,300);
sprite[0].SetWidth(64,64);
}
Title::~Title(){}
void Title::TitleDraw(){
sprite[0].Draw( g_pd3dDevice,jiki1.pTexture);
}
VOID Render(HWND hWnd)
{
if( NULL == g_pd3dDevice )
return;
Title title;
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0, 0, 0 ), 1.0f, 0 );
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
title.TitleDraw();
g_pd3dDevice->EndScene();
}
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
LPDIRECTINPUT8 g_pDInput = NULL;
VOID Cleanup()
{
g_pTexture->Release();
g_pSprite->Release();
/*if(g_pVB != NULL)
g_pVB->Release();*/
if(g_pd3dDevice != NULL)
g_pd3dDevice->Release();
if(g_pD3D != NULL)
g_pD3D->Release();
}
DirectX アクセス違反について
-
- 記事: 85
- 登録日時: 10年前
- 住所: 日本
- 連絡を取る:
Re: DirectX アクセス違反について
プログラムソースはBBCodeのcodeタグで囲っていただけるととっても見やすいです。
恐らく、此処らへんでメモリの操作ミスがあるのでしょう。
因みに、↑系でよくあるミスは・・・。
→ポインタがNULLだった。
→ポインタに間違えてインクリメントとかデクリメントをしている。
2番目は多分無いと思うので、この関数を呼び出しているところの引数をチェックすれば分かるかもしれません。
// テクスチャセット
pDevice3D->SetTexture(0,pTexture);
// 頂点構造体宣言セット
pDevice3D->SetFVF(SPRITE_FVF);
// スプライト描画
pDevice3D->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,vtx,sizeof(Vertex));
因みに、↑系でよくあるミスは・・・。
→ポインタがNULLだった。
→ポインタに間違えてインクリメントとかデクリメントをしている。
2番目は多分無いと思うので、この関数を呼び出しているところの引数をチェックすれば分かるかもしれません。