2006.08.24 Thursday | 21:25

  左右に動くだけの世界 ふるいむかし


Game.h
#include "windows.h"
#include "DxLib.h"

typedef int (__cdecl *LOOPPROC)( int );

class Game  
{
public:
	int Start( LOOPPROC );
	BOOL Init( void );
	void WindowMode( void );
	void SetTitle( LPTSTR lpTitle );
	Game();
	virtual ~Game();

	BOOL err;
	int keypad;
};

typedef int (__cdecl *PLAYPROC)( void );

class Play  
{
public:
	void Draw( void );
	void Position( int x, int y );
	int Check( PLAYPROC, Game &env );
	void Image( LPTSTR lpPath );
	Play();
	virtual ~Play();

	int ImgHandle;
	BOOL left;
	BOOL right;
	int x;
	int y;

};


メイン
#include "DxLib.h"
#include "Game.h"
#include "Play.h"

// ゲーム環境クラス
Game env;

// プレイヤークラス
Play me;

// ループ Callback 関数
int GameLoop( int keypad );
// プレイヤー処理 Callback 関数
int PlayCheck( void );

// ********************************************************
// 開始処理
// ********************************************************
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
						LPSTR lpCmdLine, int nCmdShow )
{
	
	// タイトル設定
	env.SetTitle( "ゲームプログラミング" );
	// ウインドウモード設定
	env.WindowMode();

	// 初期化
	if ( !env.Init( ) ) {
		return -1 ;
	}

	// プレイヤー画像のロード
	me.Image( "play.bmp" );
	// プレイヤー初期位置
	me.Position( 300, 400 );

	// 処理開始
	int ret;
	ret = env.Start( (LOOPPROC)GameLoop );

	return 0;
}

// ********************************************************
// ゲーム用ループ
// 終わる時は return false;
// ********************************************************
int GameLoop( int keypad )
{
	// プレイヤーの処理
	me.Check( (PLAYPROC)PlayCheck, env );

	return true;
}

// ********************************************************
// プレイヤー処理関数
// ********************************************************
int PlayCheck( void )
{
	// 右へ移動
	if ( me.right ) {
		me.x += 3;
	}
	// 左へ移動
	if ( me.left ) {
		me.x -= 3;
	}

	me.Draw();
	
	return 0;
}


Game クラス
#include "Game.h"

// ********************************************************
// コンストラクタ
// ********************************************************
Game::Game()
{
}
// ********************************************************
// デストラクタ
// ********************************************************
Game::~Game()
{
	if ( !Game::err ) {
		// DXライブラリ使用の終了処理
		DxLib_End() ;				
	}
}

// ********************************************************
// 開始直前処理
// ********************************************************
void Game::SetTitle( LPTSTR lpTitle )
{
	SetMainWindowText( lpTitle ) ;
}
void Game::WindowMode( void )
{
	ChangeWindowMode( true ) ;
}

// ********************************************************
// 開始処理
// ********************************************************
BOOL Game::Init( void )
{
	this->err = false;
 	if( DxLib_Init() == -1 ) {
		this->err = true;
		return false;
	}
	return true;
}

// ********************************************************
// 開始処理
// ********************************************************
int Game::Start( LOOPPROC loop )
{
	// 描画先画面を裏画面にセット
	SetDrawScreen( DX_SCREEN_BACK ) ;

	while( 1 ) {
		// Windows Message 処理
		if ( ProcessMessage() != 0 ) {
			return 0;
			break;
		}
		// ESC で強制終了
		if ( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 ) {
			return 1;
		}
		// 画面を初期化する
		ClearDrawScreen() ;

		this->keypad = GetJoypadInputState( DX_INPUT_KEY_PAD1 );
		if ( loop( keypad ) == false ) {
			return 2;
		}

		// 裏画面の内容を表画面に反映させる
		ScreenFlip() ;
	}

	return 0;
}


Play クラス
#include "Game.h"

Play::Play()
{

}

Play::~Play()
{

}

void Play::Image( LPTSTR lpPath )
{
	this->ImgHandle = LoadGraph( lpPath );
}


int Play::Check( PLAYPROC play, Game &env )
{
	this->right = false;
	if( env.keypad & PAD_INPUT_RIGHT ) {
		this->right = true;
	}

	this->left = false;
	if( env.keypad & PAD_INPUT_LEFT ) {
		this->left = true;
	}
	
	return play();
}

void Play::Position( int x, int y )
{
	this->x = x;
	this->y = y;
}

void Play::Draw( void )
{
	DrawGraph( this->x , this->y , this->ImgHandle , TRUE );
}