ネット対戦ゲーム型のスネークゲームをつくります。WebSocketでネット対戦ゲームをつくりたいに機能を追加します。

⇒ 動作確認はこちらから

プレイヤーはひとりではなく複数います。そこでプレイヤーの移動処理はNode.jsで行ない、そのあとクライアント側に各プレイヤーの位置や状態を送信して描画処理をおこなわせます。

app.jsがあるフォルダにsnake-gameフォルダをつくり、そのなかにsnake-game.htmlとsnake-game.jsを作ります。新しく作成するページは/snake-gameに、それが読み込むJavaScriptは/snake-game.jsにしたいので、CreateServerCallback関数に追記します。

app.js

それからスネークゲームでもHTTPサーバにソケットをひも付けるのでLinkSocketToHttpServer関数にも追記が必要です。

SnakeGame_Playerクラス

SnakeGameクラスを作成しますが、その前提としてプレイヤーの状態を管理するためのSnakeGame_Playerクラスを作成します。

コンストラクタを示します。引数はプレイヤーが出現する座標です。最初の長さは50とし、餌を食べると長くなっていきます。移動した軌跡を利用してスネークの身体を描画するためXY座標をTrajectoryXとTrajectoryYに格納する仕様にしています。

CreateColorString関数はプレイヤーの色を決め、’#ff8800’のようなクライアント側で描画するときに必要な文字列を取得するためのものです。

app.js

表示色を決める

CreateColorString関数を示します。まず赤緑青それぞれ127~255までの整数を取得します。r * 256 * 256 + g * 256 + bを計算したものを6桁の16進法で取得し、これに#をつけています。また単色では面白くないのでもうひとつの色は乱数で取得された値を半分にしたものも取得しています。

移動範囲の変化に対応させる

プレイヤーが少ないうちは移動できる範囲が広すぎるとゲームになりません。またプレイヤーが増えてくると今度は狭すぎてもゲームになりません。SetRangeOfMovement関数はプレイヤーが移動できる範囲を変更するためのものです。移動できる範囲を変更は全プレイヤーに適用されるべきものなので静的関数をつかっています。

プレイヤーを移動させる

プレイヤーを移動させる関数を示します。移動できる範囲を超えて移動することはできません。周囲の壁にぶつかった場合は強制的に跳ね返すとか有無を言わせずゲームオーバーにするなどの処理が必要なのですが、いまは「とりあえず作った」段階なので移動不能にするだけです。

描画の処理はクライアント側でおこないます。

SnakeGameクラス

次にSnakeGameクラスを示します。

まず静的メンバー変数としてPlayersがあります。プレイヤーが参加するにしたがってここに追加していきます。

connectionイベントを受信時の処理

コンストラクタではconnectionイベントを受信したときのコールバック関数を定義しています。ユーザーがアクセスしたとき、キーが押されたり離されたときの処理、1000/60ミリ秒ごとにおこなう処理を定義しています。

app.js

プレイヤーが増えたときの処理

ユーザーがページにアクセスしたときの処理を示します。socketのIDを調べて新しいSnakeGame_Playerオブジェクトを生成、IDを新しく生成したオブジェクトにセットしています。そのあと静的メンバ変数の配列 Playersに追加しています。

キー操作に対する処理

クライアントで方向キーの操作がおこなわれたときの処理を示します。IDが一致するオブジェクトを配列のなかから探して一致するものが見つかった場合はIs~KeyDownフラグのセットとクリアをおこなっています。

1000/60ミリ秒ごとにおこなわれる処理を示します。SnakeGame_Playerオブジェクトのフラグを調べて適切な移動処理をおこないます。いまのところ他のプレイヤーとの当たり判定の処理はしていません。今後の課題ということで・・・。

現段階ではプレイヤーの状態を送れば描画処理はできるはずですが、今後それ以外のデータ、例えば餌の位置などをおくる必要がでてくることが予想されます。そこでSnakeGame_Dataというクラスをつくります。ここに必要なデータをすべて格納してから送ります。

app.js

切断時の処理

クライアントとの通信が切断された場合はIDが一致するオブジェクトを配列のなかから取り除きます。

クライアント側による描画の処理

描画はクライアント側でおこないます。

snake-game/snake-game.html

次にsnake-game.jsをどう書くかですが、canvasの幅と高さを700ピクセルと500ピクセルにして黒で塗りつぶします。そしてソケットへ接続します。

snake-game/snake-game.js

ソケットに接続したらキー操作がおこなわれたらclient_to_server_keydownイベントとclient_to_server_keyupイベントを送信して、server_to_client_objectsイベントを受信したら描画処理をおこないます。

snake-game/snake-game.js