某コミュニティにて「久々にゲームを作りたい」「じゃあスイカゲーム作れよ」という話になり、すいかゲームを作ることになりました。落ちたすいかが跳ねたり転がったりをどう表現すればいいのかわからず困っていたところ、Cannon.js の存在を知りました。

Cannon.js はオープンソースの JavaScript 3D物理エンジンです。Three.js (WebGL) と組み合わせて使われることが多いのですが、ここでは 3D ではなく 2D で、しかも Three.js は使わずにゲームを作ります。Cannon.js でやることはボールの座標の計算です。

HTML部分

それでは HTML部分を示します。

style.css

グローバル変数と定数

グローバル変数と定数を示します。

Ballクラスの定義

投下されたボールの座標を取得し描画するためのBallクラスを定義します。

drawBallImage関数はボールの半径に応じてボールに描画されるイメージを描画する関数です。getBallColor関数は半径に応じた色を、getBallImage関数は半径に応じたイメージを取得します。

ページが読み込まれたときの処理

ページが読み込まれたときの処理を示します。

重力加速度を設定して、地面、左右の壁を生成して CANNON.World に追加します。また画像ファイルのパスからイメージを生成して配列 images に格納します。最初に投下されるボールの半径を決定して nextRadius に格納します。そのあとイベントリスナの追加、レンジスライダーでボリューム設定を可能にする処理をおこない更新処理をおこないます。

地面、左右の壁を生成して CANNON.World に追加する処理を示します。

イベントリスナを追加する処理を示します。

キーやボタンを押下したらボールを投下したり、次に投下するボールをその方向に移動させるフラグをセットしたりクリアする処理を定義しています。

以下はレンジスライダーでボリューム設定を可能にする定番の処理です。

ゲーム開始時の処理や更新処理は次回とします。