p200からの「ベルトコンベアのゲーム」(Atlas6.pde)についてプログラムを見てきましたが、今回はdraw()の中のdrawGame()の中のstepUnits()を見てみます。

stepUnits()では、まずisFinishedがtrueであればreturnします。

nextUnitFramesは、初期値は0。max(nextUnitFrames-1, 0)も0。

if(nextUnitFrames <= 0)は実行されます。つまり、nextUnitFramesには60 * 3が代入されます。

addUnit()は新しいunitを一つ生成して、unitArrayに加える関数。引数は何段目に新しいunitを生成させるかを示すもので、ここでは0(最上段)、2(真ん中)、4(最下段)の値を取るようです。y=2(真ん中)のunitは必ず生成されます。timeがLIMIT_TIMEの1/4を過ぎていて最上段最左列にunitが存在しなければ、y=0(最上段)のunitも生成されます。timeがLIMIT_TIMEの1/2を過ぎていて最下段最左列にunitが存在しなければ、y=4(最下段)のunitも生成されます。但し、この解釈が正しいとすると if(grid[0][GRID_H-1] == null && の記述は誤りで、正しくは if(grid[GRID_H-1][0] == null && ではないかと思われます。まだ、未確認ですが・・・。

ユニット進行ということで、forループで、unitArrayの全てのunitについて寿命の判定を行っています。寿命の判定はunit.step()が行います。寿命が尽きていなければ、寿命を縮める操作もしています。

寿命が尽きているユニットに対して、マウスで操作されている場合にはマウス操作を無効にしています。

そして、correctUnit()です。ユニットが重なっているかどうかを調べ、重なっている場合は左のユニットを左にずらすという機能のようです。ここはまだ、unitArrayの全てのunitを見るforループの中なのですが、correctUnit()内にさらに同じforループがあり、unit.correctUnit()をコールしています。correctUnit()に引き数としてわたされたunit(以下Aとする)と違うunit(以下Bとする)の場合だけunit.correctUnit()がコールされます。

unit.correctUnit()内で、lifeFrames,isMouseDragging,x,y,w等がそのまま使われているのはunitAの方で、「unit.」の接頭句が付いているのがunitBの方ですね。

forループを抜けてグリッドデータの更新です。clearGrid()でグリッドデータをgrid[][]を全てNULLにしてから、setGrid()でunitArrayの中のunitから新しい位置情報を読み込んでいます。

drawGame()では、一度stepUnit()を実行してから、グリッド背景の描画を行い、再びstepUnit()を実行しています。



《インデックス》

◆◆◆参考文献「遊んで作るスマホゲームプログラミング for Android
◆◆◆公文生ならゲームで遊ぶな!ゲームを作れ!
◆◆◆公文式小林教室◆山形県東根市◆◆◆