ゲーム制作講座1−1

1.2つ以上のキャラクタを同じに動かすには


 さて今回から少しづつシューティングゲーム用のプログラム知識に特化して行きたいと
思います。

 ではまずはなにを覚えるべきか?
 とりあえずシューティングゲームと言うゲームを想像してみましょう。自機がいて、
敵がいて、背景があって、様々な手段で攻撃しあう…
 とにかく沢山のキャラクタや物が同時に動いています。どうやら基本は『同時に動く
のようです。それではまずは複数のキャラクターを同時に動かす方法を考えましょう。

 コンピューターは一度に1つのことしかできません。ですからソフトも上から下に書き
連ねられた1つのプログラムを順順に実行してゆく事しか出来ず、キャラクターを動かす
2つのプログラムを同時に実行する、という方法によって今回の目的を達成させる事は出来ません。
 ではどうすれば良いか、ですが。、
 動かす対象が1つだった時はどうしていたか思い出して見ましょう。そうです、『少し
動かして表示、少し動かして表示
』を繰り返す事によってキャラクターを動いているように
見せていたのでした。ならば『2つのキャラを少し動かして表示』をすれば2つのキャラが
同時に動いているように見えるのではないでしょうか?いえ同時に動かす事は出来ないので
実質的には『2つのキャラを交互に少しづつ動かして表示』になりますが。
 ですが問題があります。人間一人で、片手だけで2つの人形に対して『少し動かす』を交互に
繰り返し行い、動いているように見せようとしているところを想像した場合、明らかに片方が
動いている時はもう片方は止まっている状態になり、まるでサイコロゲームのように『順番待ち
の状態が発生してしまいます。コンピューターは大丈夫なのでしょうか?
 ここで基礎編3、『ダブルバッファリング』のことを思い出してみましょう、『ダブル
バッファリング
』とは画像を消したり描いたりしている所がプレイヤーが見えるととても
見苦しい
ので画面が完成するまで『裏画面』というプレイヤーが見えない画面に描画をして
完成したらプレイヤーが見える『表画面』にコピーしよう。と言うものでした。どうやら
この機能を使えばとりあえず『順番待ち』が起きている状態はプレイヤーには見せずに
済みそうです。例え順番に動かしていても『動かす』作業が1巡するまでプレイヤーに
見せなければいい
のですから…

 さてではとりあえず2つのキャラが同時に動くプログラムを組んでみましょう。
 というか組みましたので下のプログラムをごらんください。

#include "DxLib.h" // WinMain関数 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int BallX , BallY , BallGraph ; int SikakuX , SikakuY , SikakuGraph ; int i ; // 画面モードの設定 SetGraphMode( 640 , 480 , 16 ) ; // DXライブラリ初期化処理 if( DxLib_Init() == -1 ) return -1; // グラフィックの描画先を裏画面にセット SetDrawScreen( DX_SCREEN_BACK ) ; // ボール君のグラフィックをメモリにロード&表示座標をセット BallGraph = LoadGraph( "Ball.png" ) ; BallX = -64 ; BallY = 0 ; // 四角君のグラフィックをメモリにロード&表示座標をセット SikakuGraph = LoadGraph( "Sikaku.png" ) ; SikakuX = 640 ; SikakuY = 300 ; // 移動ルーチン for( i = 0 ; i < 400 ; i ++ ) { // 画面を初期化(真っ黒にする) ClearDrawScreen() ; // ボール君の座標を少しずらす BallX += 3 ; // ボール君を描画 DrawGraph( BallX , BallY , BallGraph , FALSE ) ; // 四角君の座標を少しずらす SikakuX -= 3 ; SikakuY -= 2 ; // 四角君を描画 DrawGraph( SikakuX , SikakuY , SikakuGraph , FALSE ) ; // 裏画面の内容を表画面にコピーする ScreenFlip() ; // Windows 特有の面倒な処理をDXライブラリにやらせる // -1 が返ってきたらループを抜ける if( ProcessMessage() < 0 ) break; } // DXライブラリ使用の終了処理 DxLib_End() ; // ソフトの終了 return 0 ; }

<実行図>

ボール君の絵  四角君の絵

 こんな感じです。2つのキャラ、『ボール君』と『四角君』の座標とグラフィックハンドル
をそれぞれ BallX,BallY BallGraph SikakuX,SikakuY SikakuGraph とし、移動ルーチン内で
ボール君から順番に『座標を少しずらして描画』を行っています。
 実行してみていただければわかると思いますが、この方法で十分同時に動いているように
見えると思います。いえこの方法しかないのですが…(^^;

 目的が達成できたので今回はこれで終了です。
 次はボール君をプレイヤーが操作できるようにし、四角君は画面外に出ないようにしてみま
しょう。



戻る