前回、作成したネット対戦ゲーム型のスネークゲームですが、ただスネーク型のキャラクタが移動するだけなので、もう少し機能を追加してゲームらしくさせてみます。

⇒ 動作確認はこちらから

まず餌と当たり判定です。餌を食べると身体が伸びていき、他のプレイヤーや自分自身に頭をぶつけてしまうとゲームオーバーになります。ゲームオーバー後にもう一度ゲームを開始する方法も考えないといけないのですが、ここでは餌の出現と餌との当たり判定を考えます。

餌と当たり判定とその後の処理

餌は最初は最大50個とします。プレイヤーが餌を食べると減った分を補います。またユーザーが途中で離脱してもすでに存在する餌は消えないものとします。そしてプレイヤーの頭の部分と接すると餌を食べたということにして、プレイヤーの体長を少し伸ばします。

SnakeGame_Foodクラス

まず餌を管理するためのSnakeGame_Foodクラスをつくります。

餌の大きさと色は乱数で決めます。

app.js

餌の配置する

クライアントにはプレイヤーの状態だけでなく餌の位置も送るのでSnakeGame_Dataのプロパティを追加します。

app.js

アプリケーションが開始されたら餌をフィールド内に50個ランダムに配置します。

app.js

1000/60ミリ秒ごとにプレイヤーの状態と餌の位置をクライアントに送信します。

餌との当たり判定

次に餌との当たり判定、そして死亡判定をおこないます。SnakeGame_Player.Move関数は長くなるので分けました。新しく追加したのは餌との当たり判定、プレイヤーの死亡チェック、死亡時の処理です。あとは前回のMove関数と同じです。

餌を食べたときの処理

餌との当たり判定ですが、プレイヤーの頭の部分と餌の中心部の距離と双方の半径の和(平方根を計算するとそのぶん処理が遅くなるので実際には双方の2乗の値)を比較しています。餌の半径の倍だけプレイヤーの体長を伸ばしています。このとき餌の最大個数を下回っている場合は追加で出現させています。

プレイヤーの死亡判定とその後の処理

プレイヤー死亡の場合はSnakeを点滅させて消滅させます。死亡フラグがセットされると前述のMove関数のなかで移動処理はおこなわれず、消滅へ向けた処理がおこなわれます。そして死亡したプレイヤーがいた場所には餌が残ります。敗者は勝者の養分となるのです。

プレイヤーの死亡の条件

プレイヤーの死亡判定ですが、プレイヤーの頭部が身体に接触した段階で死亡として扱います。Slither.io(スリザリオ)では自分自身に対しては当たり判定はありませんが、このゲームでは自他問わずプレイヤーの身体にぶつかったら死亡として処理します。またフィールドの外に出た場合も死亡です。

頭部がプレイヤーに接触していないか?

プレイヤーの頭部がプレイヤーの身体に接触していないかを調べる関数を示します。

死亡判定後の処理

死亡判定された場合はそのプレイヤーを点滅させて消滅させます。1フレームごとに表示色を変えています。七色に輝きながら最期の時を迎えるのです。

クライアント側の処理

クライアント側では餌の情報もいっしょに送られてくるので、餌を描画する処理をおこないます。

snake-game/snake-game.js