ブラウザでダウンロード
最新の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;
}