どうもです。タドスケです。
PlayCanvasでのゲーム制作第4弾。
物理エンジンを利用してシンプルなブロック崩しを作ってみました。
完成品
マウスカーソルを左右に動かすか、タッチでバーが動きます。
ブロックを全部壊すとクリアです。
プロジェクト
PlayCanvasのアカウントをお持ちの方は、以下からプロジェクトファイルが閲覧できます。
制作のポイント
バーの挙動
マウスカーソル位置からレイを飛ばして、床面とぶつかった地点のX座標をバーのX座標に入れています。
ただし、バーがKinematicモードだと壁との衝突判定を行わずにすり抜けてしまうので、壁の位置を最大/最小として移動範囲を制限しています。
ボールの挙動
Z(上下)方向のスピードが0になってしまう場合があり、そうなるとクリアできなくなってしまうので、Z方向の速さに最小値を設けました。
同様にボールスピードが速くなり過ぎてクリアが難しくなってしまったり、壁を抜けてしまうことがあったので、ボールの速度(linearVelocity.lengthの値)が一定以下になるように補正をかけています。
そのため、ちょっと気持ち悪い反射のしかたをする時があります。
デバッグテキストの表示
ボールの速度やマウスカーソル位置などをリアルタイムで知りたかったので、デバッグテキストを表示する機能を入れています。
GameManagerのisDebugをtrueにするとデバッグテキストが表示されます。
(いったんForkしないとチェック変更できないかも)
開始時のスケール値
今回もボールの消去はスケール値を0にしていますが、リセット時に元のスケール値に戻せるように、initializeで初期のスケール値を記憶しています。
Vec3の値は参照型なので、clone()関数を使ってコピーせずにメンバー変数に代入するだけだと、
メンバー変数を変更した際にボールのスケール値も変わってしまいます。
他の言語だとVector3は値型のことが多いため、長いこと気が付かずにハマりました。
ブロックの挙動
再プレイする時に消したブロックを復活させる必要があるため、ブロックをテンプレート化して、開始時に動的に生成するようにしました。
今後別のステージを作る場合も、ブロックの並びを与えてその通りに生成させることもできそうです。
クリア後の再生成時、たまに一部のブロックが生成されないことがあり、原因は不明です…
まとめ
物理エンジンに任せたことで、むしろおかしな挙動になってしまいました。
何でもかんでも物理エンジンを使えば良いってワケでもなさそうですね。
コメント