「 りんご2 プレイヤーの操作 」のつづきです。
Corona SDK を起動し catchGame プロジェクトを実行している状態です。
テキストエディタでは main.lua ファイルを開いて編集中です。
背景を表示して、プレイヤーをマウスカーソルで操作するところまで作りました。
つぎは落下物のりんごを表示します。
30 行目以降を入力してください。
関数 createObj を作りました。
32 行目、乱数を作っています。パラメーターに 480 を設定して
1から 480 までのランダムな数値を作って変数 rx に入れてます。
480 という数は画面の幅です。
33 行目、今まで使っていた display.newImageRect ではなく display.newImage
ということに注意してください。
パラメーターも違います。
画像ファイル名、x座標、y座標
となっています。
プログラムを入力したらシミュレーターで実行してみましょう。
しかし、実はなにも変わらず、りんごは表示されません。
理由は、関数 createObj を呼び出していないからです。
関数は作っただけでは実行されず、呼び出す処理が必要です。
36 行目を追加しましょう。
実行すると画面上部のどこかにりんごが表示されます。
シミュレーターを何度か再起動してみてください。表示される位置が変わります。
ここで7行目と8行目にプログラムを追加してください。
そしてプロジェクトを再起動しましょう。
ちょっと分かりにくいのですが、ステータスバーが消えます。
ステータスバーとは、電波状況、バッテリー残量、時間などを表示しているあれです。
Corona
シミュレーターはスマホをイメージして表示しているので、デフォルトで
ステータスバーが表示されるのです。
8行目のプログラムは、ステータスバーを隠す命令でした。
7行目、math.randomseed は乱数を発生させるときの元となる値を設定します。
パラメーターの os.time() は現在時刻を取得します。
つまり、プログラムを実行するたび現在時刻は変わるわけですから、乱数の元も
毎回変わるのです。
私がアーケードゲームを作っていたときの話です。
アーケードゲームではプレイされていないとき、デモプレイが表示されてますよね。
このデモプレイを再生するときは、math.randomseed に同じパラメーターをセット
するんです。
そうすると、毎回同じデモシーンが再生されます。
そして誰かがプレイするときには、現在時刻をパラメーターにセットします。
これで毎回違う乱数が作られます。
なお、ステージ制のゲームでは敵の発生に乱数を使うことは少ないです。
なぜなら、プレイする度に難易度が変わってしまう可能性があるからです。
りんごを落下させます。
これには物理演算機能の physics を使います。
10 と 11 行目を追加しましょう。
10 行目でリクエストして 11 行目で実行させます。
39 行目を変更して 41 行目を追加します。
39 行目、りんごを変数 obj に格納して 41 行目で物理演算の対象として指定します。
このときのモードは dynamic にして重力などの影響を受けるようにします。
プログラムを変更したらシミュレーターを再起動しましょう。
そして、りんごが落下することを確認します。
何度か再起動して、りんごがランダムに発生することも確認しましょう。
りんごが1個だけ落ちてくるゲームではダメですね。
一定の間隔でりんごが発生するようにします。
44 行目以降をつぎのように作り変えます。
49 行目、関数を定期的に呼び出すことができるタイマー機能を使いました。
今回は 500 ミリ秒(0.5秒)間隔で、関数 gameLoop を呼び出します。
最後のパラメータが0のとき、くり返し何度も呼び出します。
実はタイマーから直接、関数 createObj を指定することもできます。
ただ、一定の間隔で処理したいことが今後ほかにも出てくるので
ループ処理用の関数 gameLoop を作りました。
それでは実行してみましょう。
りんごが次から次へと落ちてくれば成功です。
りんごがたくさん発生するようになりました。
ここで注意することがあります。
基本、作ったものは消すべきです。
消さずにいるとメモリをどんどん消費して、アプリが停止したりします。
(動きが遅くなったり、スマホが熱くなったりする原因にもなります)
ということで、これから消す仕組みを入れていきます。
ちなみに、消すとは画面から見えなくするという意味ではありません。
メモリから解放することです。
まず、作ったものを記憶しておく仕組みが必要です。
グループという機能を使って、作ったりんごを記憶します。
下図の赤点の行を追加してください。
36 行目、落下物をグループとして管理するための変数 groupDrop を作りました。
44 行目、insert を使ってりんごのオブジェクト obj を追加していきます。
51 行目、グループに追加された個数 numChildren を表示しています。
実行してみましょう。
コンソールを見ると、りんごが作られるたびカウントアップしていきます。
つぎは、いらなくなったりんごを消しましょう。
説明はあとにします。赤い印のある行を入力してください。
実行すると、コンソールには3が続けて表示されます。
これは画面上に表示されているりんごの数であり、画面外へ出たりんごは
ちゃんと消されていることを意味します。
りんごを消すとき for 文を使いました。
これは決めた回数だけ処理をくり返したいときに使います。
for 文は end までの行を、指定した回数くり返します。
for (変数) = (開始値) , (終了値) , (増減) do
という感じで指定します。
増減を省略したときは1ずつ増加します。
上の例を見てもらえば分かりますが、増減させたあとの値が終了値を超えていたとき
くり返しが終了します。
増減パラメーターにはマイナス値も指定できます。
落下して画面下から出たりんごを削除する仕組みです。
52 行目、これでグループに登録された数だけくり返します。
53 行目、変数 i を使ってグループに登録されたりんご1つ1つを、変数 wk に代入します。
54 行目、wk.y にはりんごのy座標が入ってます。
これが 320 より大きいとき、画面の高さより大きいので画面外へ出たと判断します。
55 行目、画面外へ出たりんごを display.remove で削除しています。
このプログラムの重要ポイントはグループをうしろから見ていることです。
52 行目を見てください。増減に ー1 を指定しています。
開始値をグループ内の個数、終了値を1として1ずつ減らしながらくり返しさせてます。
グループは、登録したものを消すと間をつめる動作をします。
このため前方から見ていく方法だと、順序良くデータを検索できなくなるのです。