こんな感じの鳥が羽ばたく壁避けゲームをつくります。

無理ゲーにならないようにする

このゲームは適当に壁に穴を開けていてはそのときのプレイヤーの位置によっては絶対に通り抜けることができない無理ゲーになってしまいます。そこでタイミングよく羽ばたくことができれば必ずクリアできるように壁の穴の位置を設定しなければなりません。

鳥の軌跡の描画

まずは羽ばたいた鳥の軌跡を描画してみましょう。

test1.js

鳥の起動の変更

羽ばたいたときはその座標を起点に放物線を描画します。放物線の開始点の座標が(0, 164)なので羽ばたいた地点の座標と比較してそのぶん全体を平行移動させればいいですね。

getPositionY関数を以下のように定義して、draw関数も書き直します。

以下はX座標が200の時に羽ばたいた場合の鳥の軌跡です。

ガイドをつくる

あとはランダムに羽ばたかせてこのような放物線を連続して描画して、その頂点部分に壁の穴を作ればいいですね。つまり先にお題を作ってしまうというわけです。

createGuide関数は、複数の連続する放物線でできた点の座標と放物線の頂点の座標を配列に格納します。

drawGuide関数は、配列に格納された点を描画します。

プレイヤーと壁をつくる

プレイヤーに関する定数と変数を示します。

羽ばたいたときの処理

羽ばたいたらその地点の座標を格納します。テストなのでキーをなにか押したら羽ばたいたことにします。

壁の生成

壁を生成する処理を示します。topPointsから座標を取得して通過時の自然落下分とさらにプラスアルファで壁に隙間を作ります。これらの値からWallオブジェクトを生成して配列に格納します。

プレイヤーの描画

プレイヤーを描画する関数を定義します。ここでは(playerX, playerY)を中心とする矩形を描画します。

ガイドの描画

ゲームをするときは自機の左上ではなく右上をガイドに合わせるほうがやりやすいのでdrawGuide関数を定義しなおします。

更新処理

当たり判定

壁に当たっていないかを調べ、当たっている場合はその部分に×を描画します。

check関数は当たり判定の対象になる壁があるか調べ、当たり判定の対象になる壁がある場合、playerYとその壁のMinとMaxの値からプレイヤーが壁に接触していないかを調べます。

プレイヤーが壁に接触していた場合、その部分に×を描画します。

とりあえずゲームをつくる準備はできたので、次回はゲームとして完成させます。