DirectX アクセス違反について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
フイ
記事: 11
登録日時: 11年前

DirectX アクセス違反について

#1

投稿記事 by フイ » 10年前

下のようなプログラムでゲームのタイトル画像を表示したいのですが「 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();
}

Aozora0630
記事: 85
登録日時: 10年前
住所: 日本
連絡を取る:

Re: DirectX アクセス違反について

#2

投稿記事 by Aozora0630 » 10年前

プログラムソースはBBCodeのcodeタグで囲っていただけるととっても見やすいです。

コード:

// テクスチャセット
pDevice3D->SetTexture(0,pTexture);
// 頂点構造体宣言セット
pDevice3D->SetFVF(SPRITE_FVF);
// スプライト描画
pDevice3D->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,vtx,sizeof(Vertex));
恐らく、此処らへんでメモリの操作ミスがあるのでしょう。

因みに、↑系でよくあるミスは・・・。
→ポインタがNULLだった。
→ポインタに間違えてインクリメントとかデクリメントをしている。
2番目は多分無いと思うので、この関数を呼び出しているところの引数をチェックすれば分かるかもしれません。

フイ
記事: 11
登録日時: 11年前

Re: DirectX アクセス違反について

#3

投稿記事 by フイ » 10年前

解決しました!ありがとうございます

コード:

sprite[0].SetPos(480,300);
sprite[0].SetWidth(64,64);
sprite[1].SetPos(320,240);
sprite[1].SetWidth(10,480);
配列の数字が間違ってたみたいです(笑)

閉鎖

“C言語何でも質問掲示板” へ戻る