3年前に作った2Dゲームサンプルコードの再公開 ふるいむかし
ブラウザでダウンロード
最新の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; }