進級製作で苦戦しています
Posted: 2006年12月20日(水) 01:18
初めまして、こんにちは。
実は、進級製作でドンキーコングを作っているのですが、
マリオを動かすプログラムがよくわからないので、どなたか教えていただけないでしょうか?
とりあえず、一枚の画像で動くようにはしたのですが、走っているときは走っている画像、
止まっているときは止まっている画像、はしごを上っているときは上っている画像といったようにしたいんですが・・・。
よろしくお願いします。
今のところ、プログラムはこんな感じです。
#pragma warning(disable : 4995) // 警告除去
#include <tchar.h>
#include "dxstdafx.h"
// 関数プロトタイプ宣言
void CALLBACK FrameRender( LPDIRECT3DDEVICE9 pd3dDevice , double fTime , float fElapsedTime ); // 関数を作成
void CALLBACK FrameMove( LPDIRECT3DDEVICE9 pd3dDevice , double fTime , float fElapsedTime );
void CALLBACK DeviceDestroyed( void ); // デバイス削除時
void CALLBACK DeviceLost( void ); // デバイス消失時
// グローバル関数
LPDIRECT3DTEXTURE9 pTexture; // テクスチャへのポインタ
LPDIRECT3DTEXTURE9 pTexture2;
LPDIRECT3DTEXTURE9 pTexture3;
LPDIRECT3DTEXTURE9 pTexture4;
LPDIRECT3DTEXTURE9 pTexture5;
LPD3DXSPRITE pSprite; // スプライトへのポインタ
LPD3DXFONT pFont; // フォントオブジェクト
D3DXVECTOR3 pos = D3DXVECTOR3(200,200,0);
D3DXVECTOR3 dpos = D3DXVECTOR3(40,-13,0);
D3DXVECTOR3 tpos = D3DXVECTOR3(20,51,0);
D3DXVECTOR3 ppos = D3DXVECTOR3(160,35,0);
// メイン関数
int APIENTRY _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
DXUTSetCallbackFrameRender( FrameRender ); // コールバック関数の登録 (描画関数)
DXUTSetCallbackFrameMove( FrameMove ); // (更新関数)
DXUTSetCallbackDeviceDestroyed( DeviceDestroyed ); // (削除時関数)
DXUTSetCallbackDeviceLost( DeviceLost ); // (消失時関数)
DXUTInit();
DXUTCreateWindow(_T("DirectX 9.0 Graphice Sample05"));
DXUTCreateDevice(D3DADAPTER_DEFAULT, true, 512, 450);
D3DXCreateSprite( DXUTGetD3DDevice(), &pSprite );
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("stage1.bmp"), &pTexture ); // テクスチャのロード
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("mario_1.png"), &pTexture2 );
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("donkey_1.png"), &pTexture3 );
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("taru-s.png"), &pTexture4 );
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("peach_1.png"), &pTexture5 );
DXUTMainLoop();
return DXUTGetExitCode();
}
// 描画用コールバック関数
void CALLBACK FrameRender( LPDIRECT3DDEVICE9 pd3dDevice , double fTime , float fElapsedTime )
{
pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0); // クリアと背景色
DXUTGetD3DDevice()->BeginScene(); // シーンの開始
pSprite->Begin( D3DXSPRITE_ALPHABLEND ); // スプライトの開始
D3DXVECTOR3 center = D3DXVECTOR3(0,3,0); // 中心位置の指定
//
pSprite->Draw( pTexture, NULL, center, NULL, D3DCOLOR_ARGB(255,255,255,255));
pSprite->Draw( pTexture2, NULL, NULL, &pos, D3DCOLOR_ARGB(255,255,255,255));
pSprite->Draw( pTexture3, NULL, NULL, &dpos, D3DCOLOR_ARGB(255,255,255,255));
pSprite->Draw( pTexture4, NULL, NULL, &tpos, D3DCOLOR_ARGB(255,255,255,255));
pSprite->Draw( pTexture5, NULL, NULL, &ppos, D3DCOLOR_ARGB(255,255,255,255));
pSprite->End(); // スプライトの終了
DXUTGetD3DDevice()->EndScene(); // シーンの終了
}
// 更新用コールバック関数
void CALLBACK FrameMove( LPDIRECT3DDEVICE9 pd3dDevice , double fTime , float fElapsedTime )
{
if( DXUTIsKeyDown( VK_RIGHT ) ){
pos.x += fElapsedTime*100.0f; // x座標を1秒間に100増やす
}
if( DXUTIsKeyDown( VK_LEFT ) ){
pos.x -= fElapsedTime*100.0f;
}
if( DXUTIsKeyDown( VK_UP ) ){
pos.y -= fElapsedTime*100.0f;
}
if( DXUTIsKeyDown( VK_DOWN ) ){
pos.y += fElapsedTime*100.0f;
}
}
// デバイス削除時コールバック関数
void CALLBACK DeviceDestroyed( void )
{
SAFE_RELEASE(pTexture); // テクスチャの解放
SAFE_RELEASE(pTexture2);
SAFE_RELEASE(pTexture3);
SAFE_RELEASE(pTexture4);
SAFE_RELEASE(pTexture5);
SAFE_RELEASE(pSprite); // スプライトの解放
}
// デバイスの消失時コールバック関数
void CALLBACK DeviceLost( void )
{
pSprite->OnLostDevice(); // テクスチャの復旧
}
実は、進級製作でドンキーコングを作っているのですが、
マリオを動かすプログラムがよくわからないので、どなたか教えていただけないでしょうか?
とりあえず、一枚の画像で動くようにはしたのですが、走っているときは走っている画像、
止まっているときは止まっている画像、はしごを上っているときは上っている画像といったようにしたいんですが・・・。
よろしくお願いします。
今のところ、プログラムはこんな感じです。
#pragma warning(disable : 4995) // 警告除去
#include <tchar.h>
#include "dxstdafx.h"
// 関数プロトタイプ宣言
void CALLBACK FrameRender( LPDIRECT3DDEVICE9 pd3dDevice , double fTime , float fElapsedTime ); // 関数を作成
void CALLBACK FrameMove( LPDIRECT3DDEVICE9 pd3dDevice , double fTime , float fElapsedTime );
void CALLBACK DeviceDestroyed( void ); // デバイス削除時
void CALLBACK DeviceLost( void ); // デバイス消失時
// グローバル関数
LPDIRECT3DTEXTURE9 pTexture; // テクスチャへのポインタ
LPDIRECT3DTEXTURE9 pTexture2;
LPDIRECT3DTEXTURE9 pTexture3;
LPDIRECT3DTEXTURE9 pTexture4;
LPDIRECT3DTEXTURE9 pTexture5;
LPD3DXSPRITE pSprite; // スプライトへのポインタ
LPD3DXFONT pFont; // フォントオブジェクト
D3DXVECTOR3 pos = D3DXVECTOR3(200,200,0);
D3DXVECTOR3 dpos = D3DXVECTOR3(40,-13,0);
D3DXVECTOR3 tpos = D3DXVECTOR3(20,51,0);
D3DXVECTOR3 ppos = D3DXVECTOR3(160,35,0);
// メイン関数
int APIENTRY _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
DXUTSetCallbackFrameRender( FrameRender ); // コールバック関数の登録 (描画関数)
DXUTSetCallbackFrameMove( FrameMove ); // (更新関数)
DXUTSetCallbackDeviceDestroyed( DeviceDestroyed ); // (削除時関数)
DXUTSetCallbackDeviceLost( DeviceLost ); // (消失時関数)
DXUTInit();
DXUTCreateWindow(_T("DirectX 9.0 Graphice Sample05"));
DXUTCreateDevice(D3DADAPTER_DEFAULT, true, 512, 450);
D3DXCreateSprite( DXUTGetD3DDevice(), &pSprite );
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("stage1.bmp"), &pTexture ); // テクスチャのロード
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("mario_1.png"), &pTexture2 );
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("donkey_1.png"), &pTexture3 );
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("taru-s.png"), &pTexture4 );
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("peach_1.png"), &pTexture5 );
DXUTMainLoop();
return DXUTGetExitCode();
}
// 描画用コールバック関数
void CALLBACK FrameRender( LPDIRECT3DDEVICE9 pd3dDevice , double fTime , float fElapsedTime )
{
pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0); // クリアと背景色
DXUTGetD3DDevice()->BeginScene(); // シーンの開始
pSprite->Begin( D3DXSPRITE_ALPHABLEND ); // スプライトの開始
D3DXVECTOR3 center = D3DXVECTOR3(0,3,0); // 中心位置の指定
//
pSprite->Draw( pTexture, NULL, center, NULL, D3DCOLOR_ARGB(255,255,255,255));
pSprite->Draw( pTexture2, NULL, NULL, &pos, D3DCOLOR_ARGB(255,255,255,255));
pSprite->Draw( pTexture3, NULL, NULL, &dpos, D3DCOLOR_ARGB(255,255,255,255));
pSprite->Draw( pTexture4, NULL, NULL, &tpos, D3DCOLOR_ARGB(255,255,255,255));
pSprite->Draw( pTexture5, NULL, NULL, &ppos, D3DCOLOR_ARGB(255,255,255,255));
pSprite->End(); // スプライトの終了
DXUTGetD3DDevice()->EndScene(); // シーンの終了
}
// 更新用コールバック関数
void CALLBACK FrameMove( LPDIRECT3DDEVICE9 pd3dDevice , double fTime , float fElapsedTime )
{
if( DXUTIsKeyDown( VK_RIGHT ) ){
pos.x += fElapsedTime*100.0f; // x座標を1秒間に100増やす
}
if( DXUTIsKeyDown( VK_LEFT ) ){
pos.x -= fElapsedTime*100.0f;
}
if( DXUTIsKeyDown( VK_UP ) ){
pos.y -= fElapsedTime*100.0f;
}
if( DXUTIsKeyDown( VK_DOWN ) ){
pos.y += fElapsedTime*100.0f;
}
}
// デバイス削除時コールバック関数
void CALLBACK DeviceDestroyed( void )
{
SAFE_RELEASE(pTexture); // テクスチャの解放
SAFE_RELEASE(pTexture2);
SAFE_RELEASE(pTexture3);
SAFE_RELEASE(pTexture4);
SAFE_RELEASE(pTexture5);
SAFE_RELEASE(pSprite); // スプライトの解放
}
// デバイスの消失時コールバック関数
void CALLBACK DeviceLost( void )
{
pSprite->OnLostDevice(); // テクスチャの復旧
}