初心者のためのゲームプログラミング入門

プログラミングとゲームの杜

初心者のためのプログラミング入門 & ゲームプログラムの作り方入門

Corona SDK 入門

11.りんご3 りんごを落下させよう

 

「 りんご2 プレイヤーの操作 」のつづきです。

 

Corona SDK を起動し catchGame プロジェクトを実行している状態です。
テキストエディタでは main.lua ファイルを開いて編集中です。
背景を表示して、プレイヤーをマウスカーソルで操作するところまで作りました。

 

 

りんごを表示しよう

つぎは落下物のりんごを表示します。
30 行目以降を入力してください。

 

落下物りんごを表示する

 

関数 createObj を作りました。
32 行目、乱数を作っています。パラメーターに 480 を設定して
1から 480 までのランダムな数値を作って変数 rx に入れてます。
480 という数は画面の幅です。

33 行目、今まで使っていた display.newImageRect ではなく display.newImage
ということに注意してください。
パラメーターも違います。
画像ファイル名、x座標、y座標
となっています。

 

display.newImage のパラメーター

 

プログラムを入力したらシミュレーターで実行してみましょう。
しかし、実はなにも変わらず、りんごは表示されません。
理由は、関数 createObj を呼び出していないからです。
関数は作っただけでは実行されず、呼び出す処理が必要です。
36 行目を追加しましょう。

 

関数を呼び出す

 

 

実行すると画面上部のどこかにりんごが表示されます。
シミュレーターを何度か再起動してみてください。表示される位置が変わります。

 

ランダムなx座標でりんごが表示される

 

 

ステータスバーの非表示と randomseed

ここで7行目と8行目にプログラムを追加してください。
そしてプロジェクトを再起動しましょう。

 

ステータスバーの非表示とrandomseed

 

 

ちょっと分かりにくいのですが、ステータスバーが消えます。
ステータスバーとは、電波状況、バッテリー残量、時間などを表示しているあれです。
Corona シミュレーターはスマホをイメージして表示しているので、デフォルトで
ステータスバーが表示されるのです。
8行目のプログラムは、ステータスバーを隠す命令でした。

 

ステータスバーを非表示にする

 

 

7行目、math.randomseed は乱数を発生させるときの元となる値を設定します。
パラメーターの os.time() は現在時刻を取得します。
つまり、プログラムを実行するたび現在時刻は変わるわけですから、乱数の元も
毎回変わるのです。

 

私がアーケードゲームを作っていたときの話です。
アーケードゲームではプレイされていないとき、デモプレイが表示されてますよね。
このデモプレイを再生するときは、math.randomseed に同じパラメーターをセット
するんです。
そうすると、毎回同じデモシーンが再生されます。
そして誰かがプレイするときには、現在時刻をパラメーターにセットします。
これで毎回違う乱数が作られます。
なお、ステージ制のゲームでは敵の発生に乱数を使うことは少ないです。
なぜなら、プレイする度に難易度が変わってしまう可能性があるからです。

 

 

りんごを落下させよう

りんごを落下させます。
これには物理演算機能の physics を使います。
10 と 11 行目を追加しましょう。
10 行目でリクエストして 11 行目で実行させます。

 

物理演算 physics を使う

 

39 行目を変更して 41 行目を追加します。
39 行目、りんごを変数 obj に格納して 41 行目で物理演算の対象として指定します。
このときのモードは dynamic にして重力などの影響を受けるようにします。

 

 

プログラムを変更したらシミュレーターを再起動しましょう。
そして、りんごが落下することを確認します。
何度か再起動して、りんごがランダムに発生することも確認しましょう。

 

りんごの落下を確認しよう

 

 

複数のりんごを発生させよう

りんごが1個だけ落ちてくるゲームではダメですね。
一定の間隔でりんごが発生するようにします。
44 行目以降をつぎのように作り変えます。

 

timer 機能で関数を呼び出す

 

49 行目、関数を定期的に呼び出すことができるタイマー機能を使いました。
今回は 500 ミリ秒(0.5秒)間隔で、関数 gameLoop を呼び出します。
最後のパラメータが0のとき、くり返し何度も呼び出します。

 

タイマーの使い方

 

実はタイマーから直接、関数 createObj を指定することもできます。
ただ、一定の間隔で処理したいことが今後ほかにも出てくるので
ループ処理用の関数 gameLoop を作りました。

 

それでは実行してみましょう。
りんごが次から次へと落ちてくれば成功です。

 

実行してりんごがどんどん落ちてくるのを確認する

 

 

グループを使おう

りんごがたくさん発生するようになりました。
ここで注意することがあります。
基本、作ったものは消すべきです。
消さずにいるとメモリをどんどん消費して、アプリが停止したりします。
(動きが遅くなったり、スマホが熱くなったりする原因にもなります)
ということで、これから消す仕組みを入れていきます。
ちなみに、消すとは画面から見えなくするという意味ではありません。
メモリから解放することです。

 

まず、作ったものを記憶しておく仕組みが必要です。
グループという機能を使って、作ったりんごを記憶します。
下図の赤点の行を追加してください。

 

グループに追加する

 

36 行目、落下物をグループとして管理するための変数 groupDrop を作りました。
44 行目、insert を使ってりんごのオブジェクト obj を追加していきます。
51 行目、グループに追加された個数 numChildren を表示しています。

 

実行してみましょう。
コンソールを見ると、りんごが作られるたびカウントアップしていきます。

 

作ったりんごの個数を表示する

 

 

つぎは、いらなくなったりんごを消しましょう。
説明はあとにします。赤い印のある行を入力してください。

 

画面外へ出たりんごを消す

 

実行すると、コンソールには3が続けて表示されます。
これは画面上に表示されているりんごの数であり、画面外へ出たりんごは
ちゃんと消されていることを意味します。

 

 

くり返しのときは for 文

りんごを消すとき for 文を使いました。
これは決めた回数だけ処理をくり返したいときに使います。

for 文は end までの行を、指定した回数くり返します。
for (変数) = (開始値) , (終了値) , (増減) do
という感じで指定します。
増減を省略したときは1ずつ増加します。

 

lua 言語の for 文の使い方

 

上の例を見てもらえば分かりますが、増減させたあとの値が終了値を超えていたとき
くり返しが終了します。

 

増減パラメーターにはマイナス値も指定できます。

 

for 文でマイナス指定

 

 

りんごを削除する

落下して画面下から出たりんごを削除する仕組みです。
52 行目、これでグループに登録された数だけくり返します。
53 行目、変数 i を使ってグループに登録されたりんご1つ1つを、変数 wk に代入します。

 

りんごを消す仕組み

54 行目、wk.y にはりんごのy座標が入ってます。
これが 320 より大きいとき、画面の高さより大きいので画面外へ出たと判断します。
55 行目、画面外へ出たりんごを display.remove で削除しています。

 

このプログラムの重要ポイントはグループをうしろから見ていることです。
52 行目を見てください。増減に ー1 を指定しています。
開始値をグループ内の個数、終了値を1として1ずつ減らしながらくり返しさせてます。
グループは、登録したものを消すと間をつめる動作をします。
このため前方から見ていく方法だと、順序良くデータを検索できなくなるのです。