AndEngine講座‎ > ‎

第3回:ゲームループとシーン


作成日時:2014/12/31

動画版

Youtube版

AndEngineでAndroid2Dゲーム開発 part3 ゲームループとシーン


ニコニコ版

AndEngineでAndroid2Dゲーム開発 part3 ゲームループとシーン

前回のあらすじと概要

前回:第2回:AndEngineでHello world!

前回はAndEngineで文字を表示するアプリを作ってみました。 今回はプログラミングはお休みして、
AndEngineの核となるゲームループ、Engine、Sceneについての説明をしたいと思います。
狙いはAndEngineでゲームを開発するのに必要な手順をイメージしてもらうことです。
文字だらけで眠くなってしまいそうですが、知っておくとこれからの開発が楽になるので、ぜひ見てみてください。

注意

これからの説明は、

  • AndEngineでしかゲームを作ったことがない
  • ゲームプログラミングはかじった程度

の人間の説明ですので、常識的なこととか、間違ったこともあるかもしれません。
(オブジェクト指向一般の話だったりゲームエンジン一般の話をAndEngine特有の話のようにしてしまってたりします。)
また、簡単のために意識的に単純化した話もあります。 ご注意ください。

ゲームループ

まずゲームプログラミングの基本となるゲームループについて説明します。

ゲームプログラムを作ることを考えます。 ゲームジャンルに関わらずプログラムの流れは大体以下の流れになります。
(ゲームの開始、終了に関しては今回は無視します。あくまでメインの部分を見ていきます。)

  • 以下を繰り返し
    • 入力( input )
    • 更新( update )
    • 描画( draw )

この繰り返しをゲームループまたはメインループと言います。以下ではゲームループと呼びます。 このループが1秒間に何十回も繰り返し行われてゲームが動いています。


それぞれのステップについて見てみましょう。 イメージしやすいように簡単なシューティングゲームを例にしてみます。

入力

入力のステップでは、画面に配置した各ボタンが押されているかどうかをチェックします。 そして、ボタンに対応する処理を行います。

  • 左右ボタンが押されていれば自機の速度を増やす。
  • 発射ボタンが押されていれば弾を場面に追加する。

などです。

更新

更新のステップでは、ゲームを更新します。通常ゲームプログラミングでは、ここがもっとも重要な部分になります。 例えば

  • 背景をスクロールさせる場合は、背景の表示位置を表す数字を変化させる
  • 自機の位置を表す数字を、自機の速度に応じて少し変化させる
  • 自機の弾と敵の位置を計算して、ぶつかっていれば、爆発を場面に追加して、得点を表す数字を増加させる
  • 敵の位置を表す数字を変化させる
  • 敵の弾の位置を表す数字を変化させる
  • 敵や弾と、自機の位置を計算して、ぶつかっているかどうかを計算する

などです。

入力と更新のステップでは、画面の状態を表す数字は変化しますが、画面にはまだ、
その変化は現れないことに注意してください。 ゲーム画面を実際に表示するのは次の描画ステップです。

描画

描画で、場面の構成要素を実際に画面に表示させます。

  • 背景の表示位置の数字を元に背景を描画する
  • 自機の位置を表す数字を元に自機を描画する
  • 同様に自機の弾や敵、敵の弾、得点を描画する

などです。

このようなゲームループが高速に行われてゲームができています。イメージできたでしょうか?

さて、これから、以上のようなゲームを作ることを考えます。

AndEngineを使わず1から作る場合

ゲームを1から作ると、このゲームループを全て自分で書くことになります。

まずゲームループの外枠を書きます。 そして各ステップを行う命令を呼び出す処理を書きます。 そして、各ステップの命令の中身を書いていきます。

これがなかなか大変です。 入力に関してはタッチされた座標がどのボタンに含まれているかなどを計算する必要があります。
また、更新と描画はさらに色々大変です。 画面に現れる敵を追加したい場合を考えます。 まず更新の処理に変更を加えます。
そして、描画の処理に変更を加えます。 このようにソースコード上の割と離れた部分に変更を加えていかなければなりません。

また、この敵の位置などを表す数字は、ゲームループから参照できるようにしておかないといけません。
すると、ソースコードにおいてその数字を準備する部分は、実際の処理の部分から遠くなってしまいます。

このように、ゲームに要素を加えるたびに、ソースコードの色んな部分に変更を加えていかなければならなくなります。


また、通常ゲームは色んな場面があります。ゲーム画面、タイトル、リザルト、メニュー等々です。
それぞれの場面では、ボタンの配置も変わりますし、更新や描画で行う処理も変わってきます。
すると、ゲームループでは現在の場面によって処理を変えていく必要があります。
そうなると、ゲームループのプログラムはどんどん大きくなって管理が大変になります。


また、描画の処理に必要なOpenGLが難しいと言う問題もあります。
場面内の要素が増えて、さらに場面が増えると、難しくて対応できない可能性が出てきます。

以上のように

  • 1つの変更で色んなところを変えないといけない
  • ゲームループが大きくなってしまう
  • 描画処理が大変

という問題をクリアしながらゲームを開発していく必要があります。これは大変です。
ではどうするか。このような問題を代わりに解決してくれるのがAndEngineなのです。

AndEngineを使う場合

AndEngineでゲームを作る場合、開発が簡単になるように色んな工夫がされています。

まず、場面とゲームループを分けてやります。 場面の構成要素をパーツとして分割して、場面の構成要素一覧というデータを作ります。
そして、場面のパーツそれぞれに「タッチされたときに何をするか」「更新するときに何をするか」「描画するときに何をするか」を設定します。
つまり、更新、描画の処理をゲームループ内でなく、それぞれのパーツの中に書いてやるのです。
パーツの位置などを表す数字はパーツ自身に持たせます。 そうすると、何か変更があれば、そのパーツの中を書き換えればよいということになります。
これで、「1つの変更で色んなところを変えないといけない」という問題が解決されます。

ゲームループ側から見てみると、入力、更新と描画命令では、場面に対して「構成要素に順番に入力処理をさせる」「構成要素を順番に更新させる」「構成要素を順番に描画させる」
という命令を出します。入力処理、更新方法、描画方法は各パーツの中に書かれているので、ゲームループは、
場面の構成要素がどんなものでも、それを意識せずにすむわけです。

そして、場面を1まとまりのデータとすることで、場面の切り替えも「現在の場面」のデータを切り替えるだけでよくなります。
これで、「ゲームループが大きくなってしまう」という問題も解消されます。


これは、AndEngineを使う人間にとっては、ゲームの核となるゲームループを変更せずにすむ、というメリットも出てきますね。

描画処理が大変な問題はどうなるでしょうか。これもAndEngineが解決してくれます。 場面の構成要素は基本的に画像、テキストなどです。
これらのパーツはAndEngineが用意してくれているので 「描画するときに何をするか」はプログラムする必要はありません。


以上のことから、andengineでゲームを開発する場合、ゲームループを書く必要はありません。
場面の構成要素を適切に配置し、 各パーツに対して 「ゲームループ毎の更新で行う処理」 「タッチされたときに行う処理」 を設定する。
ということを行えばよい、ということになります。この枠組みが用意されていることで、1からゲーム開発に比べて、かなり簡単にゲームを作れるようになります。

AndEngineの用語

ここまででAndEngineでゲームを開発するのにどのような手順を踏めばいいのかを説明しました。 ここでは、これまでの説明に出てきた事柄をAndEngineでどう呼ぶかについて書きます。

Entity

場面の構成要素をAndEngineではEntityと呼びます。Entityにはいくつが種類があり、画像を表示するSpriteや、文字を表示するText、
直線を表示するLineや四角を表示するRectangleなどがあります。 Entityには、位置やサイズ、回転角度や透明度などのパラメーターがあり、
その値を変更してやると、描画の際にはその値を反映した形で画面に表示されます。 ゲームを作る際はEntityを適切に選んで、
ゲーム独自のパラメーターなどを追加して場面に追加することになります。 また、Entityに更新時の処理を追加することで画面の更新を行います。

Scene

場面のことをAndEngineではSceneといいます。 Sceneは構成要素のEntityを持ち、ゲームループからの入力、更新、描画命令を受け取り、
自身の持つEntityに入力時、更新時、描画時の処理をさせることになります。 また、Scene自体もEntityです。
なのでSceneにも入力、更新時の処理を持たせることができます。

タッチ座標がシーンの中のどのEntityなのかを計算する処理も、Sceneにあらかじめ用意されています。

Engine

AndEngineではEngineという名前のオブジェクトがゲームループを処理します。
Engineは現在のSceneを1つ持ち、そのシーンに対してゲームループを処理していきます。
また、現在のSceneを変更することで場面を切り替えていきます。 たとえるなら映画の監督のようなものです。

まとめ

ここまで、AndEngineの基本について説明しました。説明がうまくできているかはわかりませんが、
これでAndEngineでのゲーム開発のイメージがぼんやりでも把握できたなら幸いです。 今回の説明を大雑把にまとめます。

  • AndEngineでのゲーム開発ではゲームループは書かなくても良い!
  • AndEngineでのゲーム開発では描画処理は書かなくても良い!
  • AndEngineでのゲーム開発で必要なことは以下の3つ
    • 場面の数だけSceneを用意する
    • SceneにEntityを配置してやる
    • それぞれのEntityにタッチ時、更新時の処理を追加してやる

という感じです。かなり乱暴なまとめですが自分の印象はこんな感じです。

他にもAndEngineにはゲーム開発を簡単にしてくれる色々な仕掛けがあるのですが、これに関しては必要になったときにまた説明したいと思います。

次回予告

次回はEntityの中でも画像を表示するSpriteについて説明したいと思います。 そろそろゲーム制作に入っていきたい...。

次回:第4回:Spriteで画像の表示

Comments