2009.06.04 Thursday | 12:10

  3年前に作った2Dゲームサンプルコードの再公開 ふるいむかし

Easygame

ブラウザでダウンロード

最新のDXライブラリを同梱して、ライセンス表示を付加して再公開です。

Visual Studio 2005 で最終テストしていますが、
元々 VC6 で作成したものをそのまま変更しただけで動いています。

※ 得点システム等は無く、ゲームとしては弾を撃って敵に当てるだけです

とりあえず以下は、クラス以外のメインのソースコードです
// ********************************************************
// EasyGame Ver 061105
// ********************************************************

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

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

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

// ********************************************************
// ショットクラス
// ********************************************************
Shot shot_s;
Shot shot_a;

// ********************************************************
// アニメーションクラス
// ********************************************************
Animation ani1[4];
Animation ani2[4];

// ********************************************************
// ショットクラス( 敵 )
// ********************************************************
Shot bad;

// ********************************************************
// 背景用の星描画クラス
// ********************************************************
Star ginga1;
Star ginga2;

int back,parts1;
int px = 0;
int py = 0;
int gw,gh;

// ********************************************************
// Callback 関数宣言
// ********************************************************
int GameLoop( Game & );
int PlayCheck( Game &, Play & );
int ShotLoop1( int curIndex, Game &, Play &, Shot & );
int ShotLoop2( int curIndex, Game &, Play &, Shot & );
int BadLoop( int curIndex, Game &, Play &, Shot & );

// ********************************************************
// ユーザー関数宣言
// ********************************************************
void NumberFormat( char *Target );
void ShotedScroll( );

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

	// ********************************************************
	// ウインドウモード設定( SHIFT を押してたらフルスクリーン )
	// ( API を利用したキーの処理 )
	// ********************************************************
	WORD nRet;
	nRet = (WORD)::GetKeyState( VK_SHIFT );
	if( nRet & 0x1000 ) {
	}
	else {
		env.WindowMode();
	}
	///////////////////////////////////////////////////////////

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

	// ********************************************************
	// ディスプレイの色を 16 にして下さい
	// ********************************************************
	SetGraphMode( 800 , 600 , 16 ) ;

	// ********************************************************
	// プレイヤー画像のロード
	// ********************************************************
	me.Image( "play" );

	// ********************************************************
	// プレイヤー初期位置
	// ********************************************************
	me.Position( 390, 520 );

	// ********************************************************
	// ショット初期化(画面内最大4つ発射)
	// ********************************************************
	shot_s.CreateShot( 4, PAD_INPUT_M, "saveshot.dat" );	// スペースキー
	shot_a.CreateShot( 4, PAD_INPUT_X );	// A キー
	bad.CreateShot( 4, -1, "badshot.dat" );	// 敵

	// ********************************************************
	// ショット画像のロード
	// ********************************************************
	shot_s.Image( "shot1" );
	shot_a.Image( "shot2" );
	bad.Image( "shot2" );

	// ********************************************************
	// 爆発アニメーションのロード (対応ショットと数を合わせる)
	// ********************************************************
	ani1[0].Image( "ani1", 4 );
	ani1[1] = ani1[0];
	ani1[2] = ani1[0];
	ani1[3] = ani1[0];
	ani2[0].Image( "ani1", 4 );
	ani2[1] = ani2[0];
	ani2[2] = ani2[0];
	ani2[3] = ani2[0];

	// ********************************************************
	// 銀河エフェクト
	// ********************************************************
	env.GetState();
	ginga1.CreateStarMemory( 250 );
	// 3つ目は、3D 効果を出すかどうか
	ginga1.CreateSeeds( 2, env.ScreenX, env.ScreenY, true );
	// 回転させるかどうか
	ginga1.OptionSpin = true;
	ginga1.inc = 0.01;
//  回転の中心
//	ginga1.SpinX = 100;
//	ginga1.SpinY = 200;
//  3D効果中心
//	ginga1.BaseX = 600;
//	ginga1.BaseY = 200;
//  オプションの結果を次の処理に加算する
//	ginga1.NoRestore = true;

	ginga2.CreateStarMemory( 250 );
	ginga2.CreateSeeds( 1, env.ScreenX, env.ScreenY, true );
	ginga2.OptionSpin = true;
	ginga2.inc = 0.01;
	ginga2.rad = ginga2.endRad / 2;
	ginga2.endRad += ginga2.rad;

	back = LoadGraph( "field.bmp" );
	parts1 = LoadGraph( "parts1.bmp" );
	GetGraphSize( back, &gw, &gh );
	py = gh;

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

	return 0;
}

// ********************************************************
// 【ゲーム用ループ】
// 終わる時は return false;
// ESC で強制終了
// ********************************************************
int GameLoop( Game &g )
{
	// ********************************************************
	// 背景描画 ( 最初に描画 )
	// ********************************************************
	// 左上
	DrawRectGraph( 0, 0, gw-px, py, px, gh-py, back, false, false ) ;
	// 右上
	DrawRectGraph( px, 0, 0, py, gw, gh-py, back, false, false ) ;
	// 左下
	DrawRectGraph( 0, gh-py, gw-px, 0, px, gh, back, false, false ) ;
	// 右下
	DrawRectGraph( px, gh-py, 0, 0, gw, gh, back, false, false ) ;

	// プレイヤーの処理
	me.Check( PlayCheck, g );

	// ********************************************************
	// 銀河エフェクト ( 最後に描画 )
	// ********************************************************
	ginga1.Draw();
	ginga2.Draw();

	return true;
}

// ********************************************************
// 【プレイヤー処理関数】
// ********************************************************
int PlayCheck( Game &g, Play &p )
{

	double toRad;

	// 左上

	if ( px > 800 ) {
		toRad = atan2( (double)(p.y+32 - (gh - py - 200)), (double)(p.x+32 - (px - gw + 40)) );
		toRad -= 3.14/2;
		DrawRotaGraph( px - gw + 40, gh - py - 200,
				1, toRad,
				parts1, true , false ) ;
	}
	else {
		toRad = atan2( (double)(p.y+32 - (gh - py - 200)), (double)(p.x+32 - (px + 40)) );
		toRad -= 3.14/2;
		DrawRotaGraph( px + 40, gh - py - 200,
				1, toRad,
				parts1, true , false ) ;
	}


	py--;
	if ( py < 0 ) {
		py = gh;
	}

	// 右へ移動
	if ( p.right ) {
		p.Move( PAD_INPUT_RIGHT, 3 );
		px -= 3;
		if ( px < 0 ) {
			px = gw;
		}
	}
	// 左へ移動
	if ( p.left ) {
		p.Move( PAD_INPUT_LEFT, 3 );
		px += 3;
		if ( px > gw ) {
			px = 0;
		}
	}

	// 自分自身を描画
	p.Draw();

	// 味方のショット処理
	shot_s.Action( ShotLoop1, g, p );	// ---> Call Back へジャンプ
	shot_a.Action( ShotLoop2, g, p );	// ---> Call Back へジャンプ

	// 敵のショット処理
	bad.Action( BadLoop, g, p );		// ---> Call Back へジャンプ

	// 味方の弾と、敵の弾の当り判定
	shot_s.HitCheck( bad, ani1 );
	shot_a.HitCheck( bad, ani2 );

	int i;

	// 爆発アニメーション
	for( i = 0; i < ani1[0].nArrayCount; i++ ) {
		ani1[i].Do();
	}
	for( i = 0; i < ani2[0].nArrayCount; i++ ) {
		ani2[i].Do();
	}

	return true;
}

// ********************************************************
// ショット処理関数(有効インデックスしか Call されない)
// 味方の弾( SPACE キー )
// ********************************************************
int ShotLoop1( int i, Game &g, Play &p, Shot &s )
{

	// ショットの移動パターンをデータで決定
	s.SaveShot( i );

	s.Draw( i );

	return true;
}

// ********************************************************
// ショット処理関数(有効インデックスしか Call されない)
// 味方の弾( A キー )
// ********************************************************
int ShotLoop2( int i, Game &g, Play &p, Shot &s )
{

	// ショットの移動パターンをデータによらず、手動設定
	s.ShotY[ i ] -= 6 ;
	s.ShotX[ i ] -= 4 ;

	s.Draw( i );

	return true;
}

// ********************************************************
// ショット処理関数(有効インデックスしか Call されない)
// 敵弾の描画
// ********************************************************
int BadLoop( int i, Game &g, Play &p, Shot &s )
{

	// ショットの移動パターンをデータで決定
	s.SaveShot( i );

	s.Draw( i );

	return true;
}