DirectXでの画像

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
NONT

DirectXでの画像

#1

投稿記事 by NONT » 3年前

また、分からないところがあったので質問させてもらいます。
背景画像とアニメーションしている画像の2枚を表示したいのですが、バッファロックの最後の引数のところでエラーが出ます。
どこがダメなのでしょうか?(プログラムはほとんどコピーしただけです)

コード:

//*********************************//
//*                               *//
//*   ポリゴン処理[polygon.cpp]   *//
//*                               *//
//*********************************//

//**********************//
//*   ヘッダファイル   *//
//**********************//
#include "main.h"
#include "polygon.h"

//******************//
//*   マクロ定義   *//
//******************//
#define POLYGON_TEXTURENAME "data/TEXTURE/画像名

// ポリゴン表示位置X
#define POLYGON_POS_X ( 300 )
// ポリゴン表示位置Y
#define POLYGON_POS_Y ( 80 )
// ポリゴン幅
#define POLYGON_WIDTH ( 130 )
// ポリゴン高さ
#define POLYGON_HEIGHT ( 250 )

//************************//
//*   プロトタイプ宣言   *//
//************************//
HRESULT MakeVertexPolygon ( LPDIRECT3DDEVICE9 pDevice );          // 頂点の作成

//**********************//
//*   グローバル変数   *//
//**********************//
VERTEX_2D g_aVertex [ NUM_VERTEX ];
LPDIRECT3DTEXTURE9 g_pTexturePolygon = NULL;
LPDIRECT3DVERTEXBUFFER9 g_pVtxBufferPolygon = NULL;
float g_fOffset = 0.0f;
static int nTime = 0;                                                                       // アニメーション用タイマ
float Animation [] = { 0.0f , 0.2f , 0.4f , 0.6f , 0.8f };                                  // アニメーションX座標用配列
float Animation2 [] = { 0.0f , 0.0f, 0.0f, 0.0f, 0.0f , 0.5f, 0.5f, 0.5f, 0.5f, 0.5f };     // アニメーションY座標用配列

//******************//
//*   初期化処理   *//
//******************//
void InitPolygon ( void )
{
	LPDIRECT3DDEVICE9 pDevice = GetDevice();

	MakeVertexPolygon ( pDevice );

	// テクスチャの設定
	D3DXCreateTextureFromFile ( pDevice , POLYGON_TEXTURENAME , &g_pTexturePolygon );

	if ( FAILED ( D3DXCreateTextureFromFile ( pDevice , POLYGON_TEXTURENAME , &g_pTexturePolygon ) ) )
	{
		// エラーだったら
		MessageBox ( NULL , "テクスチャファイル読み込み失敗" , "ERROR" , MB_OK );
	}

	pDevice -> SetTexture ( 0 , g_pTexturePolygon );
	
	if ( FAILED ( pDevice -> SetTexture ( 0 , g_pTexturePolygon ) ) )
	{
		// エラーだったら
		MessageBox ( NULL , "ポリゴンへのテクスチャ設定失敗" , "ERROR" , MB_OK );
	}
}

//****************//
//*   終了処理   *//
//****************//
void UninitPolygon ( void )
{
	if ( g_pTexturePolygon != NULL )
	{
		// テクスチャポリゴンの解放
		g_pTexturePolygon -> Release ();
		g_pTexturePolygon = NULL;
	}
}

//****************//
//*   更新処理   *//
//****************//
void UpdatePolygon ( void )
{
	VERTEX_2D* pVtx;

	//バッファをロックし仮想アドレスを取得する
	g_pVtxBufferPolygon -> Lock( 
		                        0 , 
								0 , 
								( void** )&pVtx , 
								0 );

	// 座標更新(アニメーション)
	pVtx [ 0 ].tex = D3DXVECTOR2 ( Animation [ nTime % 5 ] , Animation2 [ nTime % 10 ] );
	pVtx [ 1 ].tex = D3DXVECTOR2 ( 0.2f + Animation [ nTime % 5 ] , Animation2 [ nTime % 10 ] );
	pVtx [ 2 ].tex = D3DXVECTOR2 ( Animation [ nTime % 5 ] , 0.5f + Animation2 [ nTime % 10 ]  );
	pVtx [ 3 ].tex = D3DXVECTOR2 ( 0.2f + Animation [ nTime % 5 ] , 0.5f + Animation2 [ nTime % 10 ]  );
	
	Sleep ( 50 );                      // アニメーション速度調整

	nTime++;                          // アニメーション用タイマ更新

	g_pVtxBufferPolygon -> Unlock();  //これ以降触れてはいけない
}

//****************//
//*   描画処理   *//
//****************//
void DrawPolygon ( void )
{
	LPDIRECT3DDEVICE9 pDevice = GetDevice();

	// ストリームを通す
	pDevice -> SetStreamSource ( 0 , 
		                         g_pVtxBufferPolygon ,
		                         0 ,
		                         sizeof ( VERTEX_2D )
		                       );

	// 頂点フォーマットの設定
	pDevice -> SetFVF ( FVF_VERTEX_2D );

	// ポリゴン描画
	pDevice -> DrawPrimitive ( D3DPT_TRIANGLESTRIP ,
		                      0 ,
							  NUM_POLYGON
							 );
}

//********************//
//*                  *//
//*   頂点作成関数   *//
//*                  *//
//********************//
HRESULT MakeVertexPolygon ( LPDIRECT3DDEVICE9 pDevice )
{
	// 頂点バッファの生成
	pDevice -> CreateVertexBuffer ( sizeof ( VERTEX_2D ) * NUM_VERTEX ,
		                            D3DUSAGE_WRITEONLY ,
									FVF_VERTEX_2D ,
									D3DPOOL_MANAGED ,
									&g_pVtxBufferPolygon ,
									NULL
		                           );
	
	// FAILEDマクロでエラーチェック
	if ( FAILED ( pDevice -> CreateVertexBuffer ( sizeof ( VERTEX_2D ) * NUM_VERTEX , D3DUSAGE_WRITEONLY , FVF_VERTEX_2D , D3DPOOL_MANAGED , &g_pVtxBufferPolygon , NULL ) ) )
	{
		return E_FAIL;
	}

	// 構造体のポインタ宣言
	VERTEX_2D* pVtx;

	// バッファをロックし、仮想アドレスを取得
	g_pVtxBufferPolygon -> Lock ( 0 ,
		                          0 ,
								  ( void** )&pVtx ,
								  0 );

	// 頂点座標の設定(x,y,z座標)
	pVtx [ 0 ].pos = D3DXVECTOR3 ( POLYGON_POS_X , POLYGON_POS_Y , 0.0f );
	pVtx [ 1 ].pos = D3DXVECTOR3 ( POLYGON_POS_X + POLYGON_WIDTH , POLYGON_POS_Y , 0.0f );
	pVtx [ 2 ].pos = D3DXVECTOR3 ( POLYGON_POS_X , POLYGON_POS_Y + POLYGON_HEIGHT , 0.0f );
	pVtx [ 3 ].pos = D3DXVECTOR3 ( POLYGON_POS_X + POLYGON_WIDTH , POLYGON_POS_Y + POLYGON_HEIGHT , 0.0f );

	pVtx [ 0 ].rhw = 1.0f;
	pVtx [ 1 ].rhw = 1.0f;
	pVtx [ 2 ].rhw = 1.0f;
	pVtx [ 3 ].rhw = 1.0f;

	// 頂点色の設定
	pVtx [ 0 ].color = D3DCOLOR_RGBA ( 255 , 255 , 255 , 255 );
	pVtx [ 1 ].color = D3DCOLOR_RGBA ( 255 , 255 , 255 , 255 );
	pVtx [ 2 ].color = D3DCOLOR_RGBA ( 255 , 255 , 255 , 255 );
	pVtx [ 3 ].color = D3DCOLOR_RGBA ( 255 , 255 , 255 , 255 );

	g_pVtxBufferPolygon -> Unlock();

	return S_OK;

}

///////////////   EOF   ///////////////
[hr]
[code]
//********************************//
//*                              *//
//*     背景処理[bg.cpp]     *//
//*                              *//
//********************************//

//**********************//
//*   ヘッダファイル   *//
//**********************//
#include "main.h"
#include "bg.h"

//******************//
//*   マクロ定義   *//
//******************//
#define bg_TEXTURENAME "data/TEXTURE/画像名"

// 背景表示位置X
#define bg_POS_X ( 0 )
// 背景表示位置Y
#define bg_POS_Y ( 0 )
// 背景幅
#define bg_WIDTH ( 800 )
// 背景高さ
#define bg_HEIGHT ( 600 )

//************************//
//*   プロトタイプ宣言   *//
//************************//
HRESULT MakeVertexbg ( LPDIRECT3DDEVICE9 pDevice );          // 頂点の作成

//**********************//
//*   グローバル変数   *//
//**********************//
VERTEX_2D g_aVertex2 [ NUM_VERTEX ];
LPDIRECT3DTEXTURE9 g_pTexturebg = NULL;
LPDIRECT3DVERTEXBUFFER9 g_pVtxBufferbg = NULL;

//******************//
//*   初期化処理   *//
//******************//
void Initbg ( void )
{
	LPDIRECT3DDEVICE9 pDevice = GetDevice();

	MakeVertexbg ( pDevice );

	// テクスチャの設定
	D3DXCreateTextureFromFile ( pDevice , bg_TEXTURENAME , &g_pTexturebg );

	if ( FAILED ( D3DXCreateTextureFromFile ( pDevice , bg_TEXTURENAME , &g_pTexturebg ) ) )
	{
		// エラーだったら
		MessageBox ( NULL , "テクスチャファイル読み込み失敗" , "ERROR" , MB_OK );
	}

	pDevice -> SetTexture ( 0 , g_pTexturebg );
	
	if ( FAILED ( pDevice -> SetTexture ( 0 , g_pTexturebg ) ) )
	{
		// エラーだったら
		MessageBox ( NULL , "ポリゴンへのテクスチャ設定失敗" , "ERROR" , MB_OK );
	}
}

//****************//
//*   終了処理   *//
//****************//
void Uninitbg ( void )
{
	if ( g_pTexturebg != NULL )
	{
		// テクスチャポリゴンの解放
		g_pTexturebg -> Release ();
		g_pTexturebg = NULL;
	}
}

//****************//
//*   更新処理   *//
//****************//
void Updatebg ( void )
{
}

//****************//
//*   描画処理   *//
//****************//
void Drawbg ( void )
{
	LPDIRECT3DDEVICE9 pDevice = GetDevice();

	// ストリームを通す
	pDevice -> SetStreamSource ( 0 , 
		                         g_pVtxBufferbg ,
		                         0 ,
		                         sizeof ( VERTEX_2D )
		                       );

	// 頂点フォーマットの設定
	pDevice -> SetFVF ( FVF_VERTEX_2D );

	// ポリゴン描画
	pDevice -> DrawPrimitive ( D3DPT_TRIANGLESTRIP ,
		                      0 ,
							  NUM_BG
							 );
}

//********************//
//*                  *//
//*   頂点作成関数   *//
//*                  *//
//********************//
HRESULT MakeVertexbg ( LPDIRECT3DDEVICE9 pDevice )
{
	// 頂点バッファの生成
	pDevice -> CreateVertexBuffer ( sizeof ( VERTEX_2D ) * NUM_VERTEX ,
		                            D3DUSAGE_WRITEONLY ,
									FVF_VERTEX_2D ,
									D3DPOOL_MANAGED ,
									&g_pVtxBufferbg ,
									NULL
		                           );
	
	// FAILEDマクロでエラーチェック
	if ( FAILED ( pDevice -> CreateVertexBuffer ( sizeof ( VERTEX_2D ) * NUM_VERTEX , D3DUSAGE_WRITEONLY , FVF_VERTEX_2D , D3DPOOL_MANAGED , &g_pVtxBufferbg , NULL ) ) )
	{
		return E_FAIL;
	}

	// 構造体のポインタ宣言
	VERTEX_2D* pVtx;

	// バッファをロックし、仮想アドレスを取得
	g_pVtxBufferbg -> Lock ( 0 ,
		                          0 ,
								  ( void** )&pVtx ,
								  0 );

	// 頂点座標の設定(x,y,z座標)
	pVtx [ 0 ].pos = D3DXVECTOR3 ( bg_POS_X , bg_POS_Y , 0.0f );
	pVtx [ 1 ].pos = D3DXVECTOR3 ( bg_POS_X + bg_WIDTH , bg_POS_Y , 0.0f );
	pVtx [ 2 ].pos = D3DXVECTOR3 ( bg_POS_X , bg_POS_Y + bg_HEIGHT , 0.0f );
	pVtx [ 3 ].pos = D3DXVECTOR3 ( bg_POS_X + bg_WIDTH , bg_POS_Y + bg_HEIGHT , 0.0f );

	pVtx [ 0 ].rhw = 1.0f;
	pVtx [ 1 ].rhw = 1.0f;
	pVtx [ 2 ].rhw = 1.0f;
	pVtx [ 3 ].rhw = 1.0f;

	// 頂点色の設定
	pVtx [ 0 ].color = D3DCOLOR_RGBA ( 255 , 255 , 255 , 255 );
	pVtx [ 1 ].color = D3DCOLOR_RGBA ( 255 , 255 , 255 , 255 );
	pVtx [ 2 ].color = D3DCOLOR_RGBA ( 255 , 255 , 255 , 255 );
	pVtx [ 3 ].color = D3DCOLOR_RGBA ( 255 , 255 , 255 , 255 );

	// テクスチャ座標の設定
	pVtx [ 0 ].tex = D3DXVECTOR2 ( 0.0f , 0.0f );
	pVtx [ 1 ].tex = D3DXVECTOR2 ( 1.0f , 0.0f );
	pVtx [ 2 ].tex = D3DXVECTOR2 ( 0.0f , 1.0f );
	pVtx [ 3 ].tex = D3DXVECTOR2 ( 1.0f , 1.0f );
	
	g_pVtxBufferbg -> Unlock();

	return S_OK;

}

///////////////   EOF   ///////////////

[/code]

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