Online speed (card game) with Node.js and Socket.IO sample.

2021年7月11日

gamedev Node.js Socket.IO

t f B! P L

 Node.js and Socket.IO お試しでカードゲームのスピード作成

いまさら、Node.js+Socket.IOでカードゲームのスピードを作成したのでおまとめ、2,3年前なら需要あったかもだけど、今検索しても、古い記事ばかりで、誰もやってないのかもと思ったけど、webでの通信ゲーム作り方が分からないので、調べて簡単なの作ってみた。トランプのスピードはアクション性が高くて、それなりのレスポンスないと成立しないので、よいサンプルかと思った。

環境

  • Node.js v14.15.5
  • Socket.IO
  • Express
  • TypeScript
  • webpack

環境の作り方もわからなくて、まともにプログラムできるまでが一番時間かかった。まだまともにdebugできないし、assert消してないし、テストやlintもない。次のステップで増やしていくに違いない。

matchの作成

この辺やりかたわからない。roomに2人playerがそろえば、matchを作成して、ゲーム始める。player一人のみはとりあえずbot入れてmatch作る。bot戦はplayerが入ってきたら削除してしまって、すぐに対人を始める。2人以上入って来た人は観戦だけ。matchは一つしか作ってない。ループ回せるようにしてあるけど、複数matchどうやって捌くのか?

対戦処理

サーバーは定期でずっと、場札、それぞれのplayerの手札、デッキの枚数を渡し続ける。クライアントは、カードを場札に出したいコマンドと、デッキから手札に加えるコマンドを投げる。コマンドを受け取ったサーバーはカードが出せたら、場札や手札を更新して、クライアントに投げ返す。それぞれのクライアントには同じ情報を投げ続けている。

サーバーは32msec単位で更新して、Socket.IOで状態をクライアントに投げている、こんな頻度で投げていいのって思っている。参考にした、battle tanks もそう、TCP/IPでこれでも動くんだー。

他には、playerがカードをドラッグ中は、その位置情報を送って、カードを動かしているように見せてる、位置はクライアントで補完してない。他は、emotesのボタンおしたら、押されたタイプをサーバーに送って、クライアントに戻して、相手の表示をしている。

プレイ

HEROKUにデプロイした。スリープから遅れて起きるのなかなか起きないときがあるっぽい。

やってみて

プレイヤーがカードを連続で出す間に手を差し込もうとしても、相手がフェイントいれたりすると、わかっていてもなかなか割り込めない。なので、連続で出すところをカットして、ペースを自分にもってくるまでのアクション性は無理っぽいけど、あとは概ね問題なくプレイできそう、HEOKUにデプロイしたものは、アメリカでさすがに遅延を感じるけど、なんとかプレイできそう。

参考

オンライン対戦ゲームを作る(Node.js+Socket.io)


このブログを検索

QooQ