socket.ioとnode.jsでTop10スコアを管理・共有する
今週はsocket.ioを使いTop10スコアをサーバーで管理・プレイヤー間で共有する仕組みを作っていた。ノーコン・キッドを観て、ゲームのTop10エントリとか結構うれしかったことを思い出したので、作ってみたくなったのだ。昔は通信機能なんてなかったし電源落とすとスコア情報は全部消えたから、電源落とす前に控えてアナログでハイスコア情報を管理していたのだ。懐かしいなぁ。。Chromeのみで動作する。
下の絵のような仕組みである。node.jsとsocket.ioを使うと簡単にできる。
プレイ開始時に8文字以内のハンドル・ネームを入力する。ハンドル・ネームは特に重複チェックとかは行っていない。ゲームオーバーになったらハンドル・ネームとスコア情報をサーバーに送り、サーバーはTop10テーブルと比較してTop10入りしていたらテーブルを更新してもしハイスコアなら同時に接続している他のクライアントにハイスコアをブロード・キャストする。他のクライアントは自分のハイスコア情報を更新する。
サーバー側で持っているハイスコアテーブルはシャットダウン時とかに保存し、起動時に読み込むようにしている。ローカルでテストしたときはうまくいったけれども、サーバーではどうだろうか。ちょっと不安。しかしこんなに簡単にできるなんてnode.jsとsocket.ioはほんとすごいな。
ゲームオーバー後にTop10入りしていたらTop10テーブルを表示して自分の順位を点滅するようにしたんだけど、何か味気ないね。今作っているテキスト表示機能のエフェクトがブリンクくらいしかないので、せめてカラーを変えたりできるようにしないといけないかなと思っている。あとはカーソルブリンクもきちっと実装しなきゃなぁ。。
肝心のゲームの内容だが
今のところ「これだ!」というほどのアイデアはなくて、敵配置を画面下にも増やして上下で攻撃してくるようにしてみようかとか、ボーナス・ステージではなくてボス・ステージを作ってみようかなとかその程度。シューティング・ゲームって敵配置とタイミング・コントロールで面白さがずいぶんと変わってくる。よく考えられたものはやっぱり今プレイしても面白いからねぇ。横井軍平さんの本か何かに「どんなゲームも結局はいいタイミングでボタンを押すものである。」とか書いてあったけれども、やっぱりそうなのだ。いいタイミングでボタンを押させる。そのタイミングが面白く感じるように敵配置や動きをよく考えて作る必要があるのだが、これが難しいんだよねぇ。さてどうしようか。