動作確認はこちらからどうぞ。

以前、Unityでブロック崩しをつくりましたが、今回はThree.jsで3Dのブロック崩しをつくります。

Unityでブロック崩しをつくってみる

ブロックだけクラスにしてそれ以外のクラスはつくりません。

最初にグローバル変数を示します。

Blockクラスのメンバー変数とコンストラクタを示します。

ブロックが壊されたかどうかを示すプロパティです。falseが設定されたらそのブロックを非表示にします。

ボールがどこに当たったかを調べる処理を示します。上辺、左辺、右辺、下辺、4つの角のどこに当たったかでボールの跳ね返り方を変えなければならないので、単に当たり判定をするだけでなく、どこに当たったかも調べています。

ボールに一定の大きさがあるのでボールの半径も考慮しなければなりません。ブロックとボールの中心の座標とボールの半径からどこに当たったのかを調べています。

ページが読み込み終わったらInit関数が実行されます。

Init関数ではシーン、カメラを作成し、光源を設定します。そのあとフィールドを構成する壁やボール、ブロックを生成します。そのあとレンダラーを作成してレンダリングします。

CreateField関数は床と壁を生成してシーンに追加する処理をおこないます。フィールドの幅と奥行きは32です。

CreateBall関数はボールを生成する処理をおこないます。

ResetBall関数はミスをしたあとボールを最初の位置に戻してゲームを再開する準備をおこなう関数です。

CreatePaddle関数はボールを跳ね返すパドルを生成してシーンに追加する処理をおこないます。

CreateBlocks関数はブロックオブジェクトを生成してメッシュをシーンに追加する処理をおこないます。またオブジェクトはBlockの配列にも追加しておきます。

ResetBlocks関数は壊されたブロックをすべて元の状態に戻します。

アニメーションさせるためにUpdate関数を呼びます。ここでやることはボールを移動する、方向キーが押されている場合はパドルをその方向に移動させる、ミスの判定です。

ボールがフィールドの手前から外へ出たらミスとなります。この場合はボールをいったん止めて見えない状態にします。3秒後にボールの位置を初期位置に戻してゲームを再開します。

MovePaddle関数は方向キーが押されているならパドルを移動させる関数です。壁に当たっている場合はそれ以上移動することはできません。

OnBallHitWall関数はボールが壁に当たった場合はボールの進行方向を変える関数です。符号を反転するだけでは壁のなかで振動して動けなくなることがあるので絶対値に符号をつけて壁のなかで複数回方向転換してボールが動けなくならないようにしています。

CheckBallHitPaddle関数はパドルにボールが当たったときにボールの進行方向を変える関数です。端に当たると反発して横に大きく移動するようにしています。反射の角度は左右それぞれ30度、45度、60度です。

CheckBallHitBlock関数はボールがブロックに当たったときに、ブロックを消すとともにボールの進行方向を変える関数です。ブロックの上面に当たったときはZ方向を負数に、下面に当たったときはZ方向を正数に、左面に当たったときはX方向を負数に、右面に当たったときはX方向を正数に変えています。

上下左右の面に当たっていない場合は角に当たっている可能性を疑わないといけません。角に当たったときはそのときのボールの進行方向で挙動を変えています。

ブロックが壊れたときは点数を追加する処理をおこないます。

スコアを表示する処理を示します。HTMLは以下のようになっています。id=”score”の部分にスコアを表示させます。

方向キーが押されたときと離されたときの処理を示します。キーが押されているフラグを変更しているだけです。フラグの状態でパドルが適切な方向に移動します。

動作確認はこちらからどうぞ。