ゲーム制作講座1−2

2.自機を操作できるようにしよう


 さて、前回はキャラクターを複数同時に動かす方法を得ました。
 今回は前回登場した2つのキャラクター、『ボール君』と『四角君』をそれぞれ自機と
敵に見たてて、ボール君をプレイヤーが操作できるように、四角君は画面外に出ないように
したいと思います。

 とりあえずそんなこんなで完成したプログラムは以下の通りです。

#include "DxLib.h" // WinMain関数 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int BallX , BallY , BallGraph ; int SikakuX , SikakuY , SikakuMuki , SikakuGraph ; // 画面モードの設定 SetGraphMode( 640 , 480 , 16 ) ; // DXライブラリ初期化処理 if( DxLib_Init() == -1 ) return -1; // グラフィックの描画先を裏画面にセット SetDrawScreen( DX_SCREEN_BACK ) ; // ボール君のグラフィックをメモリにロード&表示座標をセット BallGraph = LoadGraph( "Ball.png" ) ; BallX = 288 ; BallY = 400 ; // 四角君のグラフィックをメモリにロード&表示座標をセット SikakuGraph = LoadGraph( "Sikaku.png" ) ; SikakuX = 0 ; SikakuY = 50 ; // 四角君の移動方向をセット SikakuMuki = 1 ; // 移動ルーチン while( 1 ) { // 画面を初期化(真っ黒にする) ClearDrawScreen() ; // ボール君の操作ルーチン { // ↑キーを押していたらボール君を上に移動させる if( CheckHitKey( KEY_INPUT_UP ) == 1 ) BallY -= 3 ; // ↓キーを押していたらボール君を下に移動させる if( CheckHitKey( KEY_INPUT_DOWN ) == 1 ) BallY += 3 ; // ←キーを押していたらボール君を左に移動させる if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) BallX -= 3 ; // →キーを押していたらボール君を右に移動させる if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) BallX += 3 ; // ボール君が画面左端からはみ出そうになっていたら画面内の座標に戻してあげる if( BallX < 0 ) BallX = 0 ; // ボール君が画面右端からはみ出そうになっていたら画面内の座標に戻してあげる if( BallX > 640 - 64 ) BallX = 640 - 64 ; // ボール君が画面上端からはみ出そうになっていたら画面内の座標に戻してあげる if( BallY < 0 ) BallY = 0 ; // ボール君が画面下端からはみ出そうになっていたら画面内の座標に戻してあげる if( BallY > 480 - 64 ) BallY = 480 - 64 ; // ボール君を描画 DrawGraph( BallX , BallY , BallGraph , FALSE ) ; } // 四角君の移動ルーチン { // 四角君の座標を移動している方向に移動する if( SikakuMuki == 1 ) SikakuX += 3 ; if( SikakuMuki == 0 ) SikakuX -= 3 ; // 四角君が画面右端からでそうになっていたら画面内の座標に戻してあげ、移動する方向も反転する if( SikakuX > 576 ) { SikakuX = 576 ; SikakuMuki = 0 ; } // 四角君が画面左端からでそうになっていたら画面内の座標に戻してあげ、移動する方向も反転する if( SikakuX < 0 ) { SikakuX = 0 ; SikakuMuki = 1 ; } // 四角君を描画 DrawGraph( SikakuX , SikakuY , SikakuGraph , FALSE ) ; } // 裏画面の内容を表画面にコピーする ScreenFlip() ; // Windows 特有の面倒な処理をDXライブラリにやらせる // -1 が返ってきたらループを抜ける if( ProcessMessage() < 0 ) break ; // もしESCキーが押されていたらループから抜ける if( CheckHitKey( KEY_INPUT_ESCAPE ) ) break ; } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }

<実行図>

ボール君の絵  四角君の絵

 実行してみてキーボードのカーソルキーを押してみてください、ボール君を自由自在に
動かせるはずです。そして四角君が画面上部を左右行ったり来たりしているはずです。

 まずボール君を操作するためのプログラム部分ですが、見た目の量のわりにやっている事は
基礎編第4回『キーボードで絵を動かそう』と同じです。→キーが押されたらボール君のX座標
を増やし、↑キーが押されたらボール君のY座標を減らす、といった具合です。
 ただ一つ違いがあります。それはボール君が画面外にでそうになっていたら座標を補正して
画面の中に戻してあげている事です。
 処理は単純です、ボール君は BallX , BallY をボール君の絵を表示する起点となっているので
BallX0 より値が小さくなるか、( 画面の幅(640) - ボール君の絵の幅(64) ) よりも値が大きく
なるか、 BallY0 より値が小さくなるか、( 画面の高さ(480) - ボール君の絵の高さ ) より
も値が大きくなったら画面からはみ出る事になります。
 ですので単純に BallX0 より小さくなった場合は BallX0 に、BallX( 640 - 64 )
よりも大きくなった場合は BallX( 640 - 64 ) にしてやっています。BallY も同様です。

 次に四角君ですが、こちらは一つ変数が増えています。四角君の移動方向を決定する変数
SikakuMuki
です。四角君は今度は画面上部を左右行ったり来たりしなくてはならなくなった
ので、『四角君が現在どっちに移動しているか』を記憶しておかなくてはならなくなりました。
 そんなわけで SikakuMuki を追加したわけです。
 四角君は SikakuMuki1 の時は右に移動、0 の時は左に移動していると定義します、はい
私が勝手に定義します、自分でこの変数を使うのですから勝手に決めていいのです。(^^;
 そして四角君の移動ルーチンでおもむろに SikakuMuki の値が 10 か調べ、1 の時は
四角君のX座標を増やし、0 の時は減らします。これで SikakuMuki の値によって四角君の
移動方向を変更するプログラムは完成です。
 さてそうとなれば次は画面端にぶつかったら移動方向を反転してあげなければなりません、
これも簡単、SikakuX0 以下になっていたら四角君は画面左端にぶつかっていることに
なりますので、とりあえず SikakuX0 に、そして SikakuMuki右方向を示す 1 を代入
してやります。画面右端である ( 640 - 四角君の幅(64) ) よりも SikakuX の値が大きく
なってしまった場合は四角君は画面右端にぶつかった事になりますので、SikakuX( 640 - 64 )に、
SikakuMuki左方向を示す 0 を代入してあげます。
 これで四角君が画面上部を左右行ったり来たりするプログラムは完成です。あとは裏画面に
描画した内容を ScreenFlip でプレイヤーに見せてあげるだけです。

 忘れていましたが今回はプレイヤーが終らせようという意志が働くまでソフトを実行
しつづけなければならないので、ループは while( 1 ) で無限ループに、そして ESCキー
が押されたらループから抜けるようになっていることに気を付けてください。(この事に付いても
基礎編第4回『キーボードで絵を動かそう』と同じですので詳しくはこちらをご覧下さい。

 さて、なんとか『自機と敵』的な構成が出来ました。次は自機が弾を撃てるようにしたいと
思います。


戻る