前回の記事 でゲームプログラムの骨組みは作ったので、もうちょっと肉付けしていきたいと思います。
この記事はよくあるサイト様のプログラムを参考にさせていただいています。
上記のサイトでは前回ばらばらに書いていた初期化処理を一つのinit(); という関数にまとめているようですね。
この辺を分けるかまとめるかはおそらく好みの問題だと思います。分けるメリットはどこに何を書いているかが一目瞭然ってところですかね。逆にまとめるメリットはプログラムがすっきりして見通しが良くなるってことですかね。
さて、今回はイベント処理の関数を実装することを目標とします。
イベント処理をうまく使う事で、プログラムはユーザーの入力を受け取れるようになります。
詳しくはリファレンスを読みましょう。
まず、GAMEMainクラスのpublicメンバで、
イベント処理用の関数を作成します。
関数の中でイベント用の共用体SDL_Eventを宣言します。どんなイベントが起こったかという情報はこの共用体に格納されるので、この共用体を使ってイベント処理を行っていくようなプログラムにします。
その後、main関数のwhileループの条件文のところで今作ったイベント処理用の関数を使います。
閉じるボタンを押されたときなど、quitだったならばwhileループを抜け出して終了化処理に移ります。
このループを抜け出すためにrunflagのような、ループを続けるかどうかのbool型のフラグを使う方もいると思いますが、
終了化処理は何よりも優先されるべきなので、関数の戻り値でループを抜け出してもよいと思います。
たぶんその方がすっきりしますし。
以下のプログラムは自分用のメモなのでかなり見づらいと思いますが、ご了承ください。
class GAMEMain{
private:
(略)
public:
bool Loop_EventCheck();//メインループの条件判定で、未処理のイベントがあるかどうかを確認する。//quitなら0が返される。
(略)
}
bool GAMEMain::Loop_EventCheck(){
SDL_Event event;
while (SDL_PollEvent(&event) == 1) { //未処理のイベントがある間はループする。
if (event.type == SDL_QUIT) { // 終了処理
return 0;
}
/*例えばキー入力の処理など、行いたいイベントの処理をを書く。*/
}
return 1;
}
int main(int argc, char** argv) {
(略)//初期化処理
while(GMain.Loop_EventCheck()){
(略)//ゲームのメインループでの処理
}
(略)//終了化処理
}
コメント