cannon.jsで駄菓子屋10円ゲームをつくる(1)の続きです。今回はボール、コースなどを描画、動作させるためのクラスを定義します。

Ballクラスの定義

Ballクラスを定義します。コンストラクタを示します。

ボールの重さ、反発係数、摩擦係数を指定して最初は動かないように固定します。

worldにボールを追加する関数を定義します。またボールを動かないように固定したり隠す(見えない位置に移動させる)関数も定義しておきます。

ゲーム開始時にボールを初期化する処理を示します。速度は0にして初期位置にセットします。そのあとwakeUp関数を実行して固定状態を解除して動くようにします。

ボールを打ち出す処理を示します。

同じ速度で打ち出しても動作が異なる場合があるのですが、壁に当たったボールが動いていたり変な位置でsleep関数を実行すると壁にめり込んだ状態で止まってしまうのが原因のようです。

そこで打ち出すときは壁と地面から少し離した位置で速度を与えることにします。

ゴールに辿り着いたと判定されたときはGoal関数を呼び出します。ボールを動かないように停止させ、操作用のボタンを非表示、効果音の再生、スタートボタンを再表示などの処理をおこないます。

穴に落ちたと判定されたときはDead関数を呼び出します。ボールを隠して動かないように停止させ、操作用のボタンを非表示、効果音の再生、スタートボタンを再表示などの処理をおこないます。

描画の処理を示します。

worldにおける座標からcanvasに描画するための中心になる座標を求め、その位置に描画します。10円玉が転がっているようにイメージを回転させていますが、回転はcannon.jsで得られる回転角ではなく、10円玉の移動距離で算出しています(転がらずにまっすぐ射出されたり坂を転がらずに滑ってしまうため)。

Courseクラスの定義

薄い板を生成してこれを適度に回転させた状態でworldに追加してコースを作ります。そのためのCourseクラスを定義します。

コンストラクタの引数は坂の両端の座標です。ここから中心点の座標を求め、板のサイズやここを中心にどれだけ回転させればよいかを算出します。

Holeクラスの定義

穴に落ちた時の処理をするためのHoleクラスを定義します。

穴に落ちたかどうかの判定ですが、穴がある位置よりも穴の半径ぶん下がった位置に平面を追加し、ボールがこれに衝突したかどうかでおこないます。描画は平面にはしないで穴のような半円とします。

Wallクラスの定義

左右の壁と下側(下の見えない部分にある)の壁が必要なので Wallクラスを定義します。

Goalクラスの定義

ゴールの描画とゴール時の処理をするためにGoalクラスを定義します。

上記の底にある壁の少し上側に、ゴールとなる部分をカバーするように板を設置します。ボールがこれと衝突したらゴールしたことになります。

またcanvas下部のゴールとハズレ部分に相当する位置に文字を描画することにします。

次回はこれらのクラスを用いてゲームを完成させます。