トトガノート

All about TOTOGA

スマホ

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

文字どおりユニットを描画するわけですが、forループでunitArrayの全てのunitについて、unit.draw()を実行しています。drawUnits()はただそれだけの関数です。

unit.draw()では、まずpushMatrix();として、(0,0)を原点とする座標軸をスタックしています。そして、translateで原点を(unit.x,unit.y)に移動しています。

「// 消すときは回転しながら消す演出をする」ということなので、if(lifeFrames > 0 && lifeFrames < 30) というのが「消すとき」の条件になっているようです。if文内は、演出となる回転処理ですね。

次に「// ユニット本体描画」。unit.typeの数値は、ユニットタイプの色を定めたunitColors[]という配列のインデックスに対応しているようです。fill()で本体の色の設定を最初にやります。枠の設定はいくつか場合分けされています。

if(lifeFrames >= 0) ならば「消している最中」を意味しているようです。stroke(255)で枠の色を白に指定。strokeWeight(5)で5pixelの太枠を指定。

lifeFrames < 0で、isMouseDragging()がtrueのとき、「マウス操作中」の処理をします。 灰色stroke(128)の太枠strokeWeight(5)。

lifeFrames < 0で、isMouseDragging()がfalseで、isStop()がtrueのとき、「停止」の処理をします。黒stroke(0)の細枠strokeWeight(2)。

それ以外の時は枠を表示しないnoStroke()。

そして、描画rect(0, 0, w, h)。ユニットの左上が原点になっていますから、位置の座標は(0,0)。

最後に「// タイプ番号描画」をして、座標を元に戻してpopMatrix()、終了。



《インデックス》

◆◆◆参考文献「遊んで作るスマホゲームプログラミング for Android
◆◆◆公文生ならゲームで遊ぶな!ゲームを作れ!
◆◆◆公文式小林教室◆山形県東根市◆◆◆
このエントリーをはてなブックマークに追加 mixiチェック

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
◆◆◆公文生ならゲームで遊ぶな!ゲームを作れ!
◆◆◆公文式小林教室◆山形県東根市◆◆◆
このエントリーをはてなブックマークに追加 mixiチェック

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

「グリッドの真ん中1ライン埋まったらゲームオーバー」という条件を検出しています。

配列grid[5][8]は、縦5列横8列のグリッドに対応していて、そこにUnitが存在していれば配列の中に代入され、存在していなければ配列の値もNULLになります。

縦5列のインデックスは0〜4の数字になりますから、真ん中はgrid[2][i]になるわけです。

grid[2][i]がNULLであり、かつunit.isStopがtrueというのが、stopCount++の条件です。

unit.isStopがtrueになるのは、unit.isMouseDragging()がfalse(このユニットがマウスでドラッグされていない)で、かつunit.prevXがunit.xに等しいとき。unit.prevXとはこのunitの前回のx座標で、これが現在のx座標unit.xと等しいということは、このunitが移動していないということ。

マウス移動中でなく、x座標が前回と同じとき、stopCountがカウントアップされます。これがgrid[2][0]〜grid[2][7]のunit全てで起きたとき、ゲームオーバーとなります。

本書p224では、「マウス移動中でなく、x座標が前回と違っていたときにisStop()関数がtrueを返しています」となっていますが、プログラムとは異なっているように思います。



《インデックス》

◆◆◆参考文献「遊んで作るスマホゲームプログラミング for Android
◆◆◆公文生ならゲームで遊ぶな!ゲームを作れ!
◆◆◆公文式小林教室◆山形県東根市◆◆◆
このエントリーをはてなブックマークに追加 mixiチェック

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

まず、背景の設定。そして、経過時間の更新。draw()が実行されるたびに、スタートしてからの経過時間がmsec単位で変数timeに入力されます。

そして、drawGame(),drawResult()が実行されます。

なので、drawGame()を見てみましょう。

まず、ゲーム終了判定を最初にしています。isFinishedはresetStage()でfalseに初期設定されます。

if(!isFinished){}は終っていないときに実行されますが、isFinishedをtrueにするのがこのif文のようです。

timeがLIMIT_TIMEを越えていれば、制限時間まで生き残ったということでゲームクリア。isFinishがtrueになります。

グリッドの真ん中1ライン埋まったらゲームオーバー。この場合もisFinishがtrueになります。

「グリッドの真ん中1ライン埋まったら」の判定は、grid[][]とかunit.isStopの理解が必要なので、次回はそこを見てみます。



《インデックス》

◆◆◆参考文献「遊んで作るスマホゲームプログラミング for Android
◆◆◆公文生ならゲームで遊ぶな!ゲームを作れ!
◆◆◆公文式小林教室◆山形県東根市◆◆◆
このエントリーをはてなブックマークに追加 mixiチェック

p200からの「ベルトコンベアのゲーム」(Atlas6.pde)についてプログラムを見てきましたが、やはりピンと来ないので動きを追ってみたいと思います。

まず、初期化。setup()が実行されます。画面サイズの初期化とステージの初期化(resetStage)。

resetStage()では、ユニット配列unitArrayや、各種変数の初期化が行われています。clearGrid()はUnitタイプの配列grid[][]を初期化しています。




《インデックス》

◆◆◆参考文献「遊んで作るスマホゲームプログラミング for Android
◆◆◆公文生ならゲームで遊ぶな!ゲームを作れ!
◆◆◆公文式小林教室◆山形県東根市◆◆◆
このエントリーをはてなブックマークに追加 mixiチェック

p200からの「ベルトコンベアのゲーム」(Atlas6.pde)について、Gridのプログラムを見てみます。今回は、かなり大きな変更のようなので、何回かに分けて見ていきます。

・// グリッドの開始Y位置を決める定数を定義 final int GRID_BASE_Y = 60;

・UNITの配列gridが定義されます。その幅・高さを決める定数
// UNIT_SIZE間隔のグリッドデータ
final int GRID_W = 8;
final int GRID_H = 5;
Unit[][] grid = new Unit[GRID_H][GRID_W];

・それと同じサイズでbooleanの配列gridFlags
boolean[][] gridFlags = new boolean[GRID_H][GRID_W];

・// グリッド座標に変換する関数
int toGridX(float x) →getGridMouseX(),setGrid()
int toGridY(float y) →getGridMouseY(),setGrid()

・// グリッドデータ範囲内かどうか
boolean isInGrid(int gx, int gy) →isHitGrid(),setGrid()

・// マウス座標をグリッドにぴったり合うようにして返す関数
int getGridMouseX()は toGridX()をコール
int getGridMouseY()は toGridY()をコール

・// グリッド上の他のユニットに当たる場合はtrueを返す
boolean isHitGrid()は
isInGrid()をコール
配列grid[][]使用

・// グリッドデータを初期化する
void clearGrid() は配列grid[][]使用

・// グリッドデータにユニットを設定
void setGrid()は
toGridX(),toGridY(),isInGrid(),unit.isStop()をコール
配列grid[][]使用

・// 繋がっているユニットの数を再帰的に数える
int countLinkedUnit()は
isInGrid(),isFirst,unit.isStop(),countLinkedUnit()をコール
配列gridFlags[][]使用

・// グリッドを調査して繋がりを判定、描画
void drawGridLinks()は
配列grid[][]使用
countLinkedUnit(),unit.lifeFrames,unit.drawLinks()

・// グリッドデータのデバッグ表示
void drawGridInfo()

再帰的処理…脳ミソがクラインの壺状態になってしまいます(笑)



《インデックス》

◆◆◆参考文献「遊んで作るスマホゲームプログラミング for Android
◆◆◆公文生ならゲームで遊ぶな!ゲームを作れ!
◆◆◆公文式小林教室◆山形県東根市◆◆◆
このエントリーをはてなブックマークに追加 mixiチェック

p200からの「ベルトコンベアのゲーム」(Atlas6.pde)について、プログラムを見てみます。今回は、かなり大きな変更のようなので、何回かに分けて見ていきます。

例によって、前回のバージョン(Atlas5.pde)との比較を行っていきますが、今回はAtlas6の記述。一回で理解できるとは思えないので、気づいたことを取りあえず羅列します。

・final int LIMIT_TIME = 1000 * 60 * 2; // 制限時間
制限時間を1分→2分

・int score = 0; // 得点
新設

・boolean isGameOver = false; // ゲームオーバーか?
int mouseWaitFrames = 0; // マウス入力制限の残りフレーム数
int scoreMessageFrames = 0; // 得点メッセージを表示する残りフレーム数
String scoreMessage; // 得点を加点したときのメッセージ
新設

・// 初期化 void setup()でresetStage()をコール

・// ステージの初期化(再プレイ) void resetStage()
変更

・// 毎フレームの進行と描画 void draw()
変更

・// ゲームプレイ画面 void drawGame()
新設 draw()からコールされる

・// 時間と得点の描画 void drawGameInfo()
新設 drawGame()からコールされる

・// 結果画面の描画 void drawResult()
変更 draw()からコールされる

・// マウスボタンを押したとき void mousePressed()
変更

・// マウスドラッグ中 void mouseDragged()
新設

・// マウスボタンを離したとき void mouseReleased()
新設



《インデックス》

◆◆◆参考文献「遊んで作るスマホゲームプログラミング for Android
◆◆◆公文生ならゲームで遊ぶな!ゲームを作れ!
◆◆◆公文式小林教室◆山形県東根市◆◆◆
このエントリーをはてなブックマークに追加 mixiチェック

p200からの「ベルトコンベアのゲーム」(Atlas6.pde)について、プログラムを見てみます。今回は、かなり大きな変更のようなので、何回かに分けて見ていきます。

例によって、前回のバージョン(Atlas5.pde)との比較を行っていきますが、今回はUnitの記述。一回で理解できるとは思えないので、気づいたことを取りあえず羅列します。

・final int UNIT_TYPE_MAX = 5; // ユニットの種類数
4→5

・final int UNIT_LINK_NUM = 4; // ユニットがいくつ繋がったときに消えるか
新設

・final int UNIT_SIZE = 72; // ユニットの大きさ
40→72

・final int UNIT_WILDCARD_PER = 15; // 万能ユニットが出てくる確率(0〜100%)
新設

・final float UNIT_SPEED = 1.0f; // ユニットが動く速度
integer→float

・Unit mouseUnit = null; // マウス操作中のユニット
headUnitを廃止して新設

・int nextUnitFrames = 0; // 次のユニットを出現させるまでの残りフレーム数
新設

・// ユニットタイプ別の色
color[] unitColors = {
color(255), color(255, 255, 0), color(0, 255, 255), color(255, 0, 255), color(255, 0, 0)
};
新設

《ユニットクラス内の変更》
・ float prevX, prevY;
新設

・ float x, y;
float w, h;
integer→float

・ int linkTop, linkBottom, linkLeft, linkRight;
新設

・ // 繋がっている数を返す int getLinkCount()
新設

・ // マウス操作中? boolean isMouseDragging()
新設

・ // 進行(指定した寿命がつきたらfalseを返す)boolean step(float speed)
変更

・ // 停止している? boolean isStop()
新設

・ // 描画void draw()
当然変更

・ // つながりを描画void drawLinks()
新設

・ // ユニットが重なっているときは左のユニットを左にずらすvoid correctUnit(Unit unit)
新設

《メンバー関数外》
・// ユニット進行void stepUnits()
変更

・// ユニットを追加Unit addUnit(int y)
変更

・// ユニットが重なっているときは左のユニットを左にずらすvoid correctUnits(Unit unit)
新設

Atlas6


《インデックス》

◆◆◆参考文献「遊んで作るスマホゲームプログラミング for Android
◆◆◆公文生ならゲームで遊ぶな!ゲームを作れ!
◆◆◆公文式小林教室◆山形県東根市◆◆◆
このエントリーをはてなブックマークに追加 mixiチェック

p194からの「ベルトコンベアのゲーム」(Atlas5.pde)について、プログラムを見てみます。実行したときの見た目は結構大きく変更されているのですが、プログラム上はそれほど大きな変更ではありません。

まず、Unit.pdeの方から見てみます。

前回指摘しましたUnit.reset()ですが、今回のプログラムで姿を消していますので、やはりAtlas4.pdeでも必要なかったと考えていいようです。

ユニット生成の機能はstepUnits()のUnit.addUnit()にまとめられました。Unit.addUnit()にはユニットのY座標が引数として与えられます。前回まではユニットは1列で流れてきましたので、「35」しか入りませんでした。今回は経過時間によって2段になったり3段になったりしますので、Unit.addUnit()の引数も経過時間の条件分岐で、3通りの値が入力されます。

次にAtlas5.pdeについて見てみます。

上記の変更で、経過時間を表わす変数が必要になりましたので、timeという変数が新設されています。値は、draw()の中で代入されます。

後は、正解率(accuracyRate)を表示する機能が、drawResult()に付けられました。



《インデックス》

◆◆◆参考文献「遊んで作るスマホゲームプログラミング for Android
◆◆◆公文生ならゲームで遊ぶな!ゲームを作れ!
◆◆◆公文式小林教室◆山形県東根市◆◆◆
このエントリーをはてなブックマークに追加 mixiチェック

p188からの「ベルトコンベアのゲーム」(Atlas4.pde)について、プログラムを見てみます。と言っても、今回はAtlas4.pdeの方は殆ど書き換えがありません。Unit.pdeを見てみます。

まず、Unitの種類や大きさにバリエーションを持たせるための定数として、UNIT_TYPE_MAXとUNIT_SIZEが新設されています。ユニットクラスの中の変数としては、ユニットが傾く角度を設定するangleという変数。Unit()の引数もfloat angleが新設です。

Atlas3.pdeに移行する段階で抹消されたUnit.reset()ですが、今回なぜか復活しています。しかし、抹消して実行してもAtlas4.pdeは動作するようなので、編集ミスではないかと思われます。

抹消されたUnit.reset()のユニット生成の機能はstepUnits()に引き継がれていましたが、この機能だけUnit.addUnit()として独立し、stepUnits()からコールされる形になっています。

Unit.draw()では、angleの角度だけ回転する処理が追加されています。また、typeの値によって不良品の亀裂が3通りあるようになっています。



《インデックス》

◆◆◆参考文献「遊んで作るスマホゲームプログラミング for Android
◆◆◆公文生ならゲームで遊ぶな!ゲームを作れ!
◆◆◆公文式小林教室◆山形県東根市◆◆◆
このエントリーをはてなブックマークに追加 mixiチェック

↑このページのトップヘ