もう一ヶ月近く経ちましたが… いやー,大変でした.Pygameです.
開発はもうあとちょっとのところで結局たまにめちゃくちゃ重くなるのが直せなくて,タイムリミットで間に合いませんでした.重くなったらプログラム再起動できる程度ということで,内部生向けに7台くらいは動かしました.来年使います.無念…
プレイ画面ももっとレーダー出したりする予定だったんですが.うーむ.
簡単に説明すると,十字キーで動いて弾発射して,ランダムに部屋の中の数人とP2Pで通信対戦するみたいなゲームです.
対戦までの流れ
- まず,入り口でIDとパスワードの書かれた(紙が貼り付けられた)チラシを受け取ります.
- 任意の席に座って,それを入力して,機体を選択して,参戦ボタンをクリック
- HTTPでサーバにユーザ情報を送信
- Flaskで立てたサーバが待ちリスト(pickle…ww)にユーザを投入
- 定期的にcronなどで実行されるマッチングスクリプトで,スタートリストにユーザを移動
- クライアントは定期的に,スタートリストに先ほど登録したセッションIDがあるか聞く(←これはマッチング完了予定時刻を最初に渡すほうが良いかも)
- あったら他の端末の機体情報(HP,画像,…)・端末情報(IPaddr),自動生成されたマップデータを返す
- 対戦開始
対戦中
フルメッシュP2Pと言えば聞こえはいいですが,要は移動したら座標と方向のパケット,発射したら方向と時刻と発射座標とランダムな弾ID,被弾したら新HPとその弾IDをすべての対戦相手にsocketでUDPで飛ばすっていうものです.
マップは対戦のたびに自動生成されています.これ,ちょっとがんばったよw 転がってた迷路作成スクリプトのテキスト出力をサーバからもらって,壁パーツに変換するだけなんだけど…
転送をバックグラウンドで行えるように,processingを使って初めてマルチスレッドをやりました.メイン,送信,受信の3スレッドです.打ったり移動したら送信スレッドのキューに放り込んで,毎フレーム受信のキューにデータがあるかチェックしています.これが最善なのかはわかりません.
被弾判定はすべて当たった人が自己申告するようになっています.壁に当たったら自分で消します.
壁の弾透過を防ぐためといちいち衝突判定をしないで済む負荷軽減のために,弾を打った人は壁衝突予定座標をいっしょに送るようにしようとしましたが,なんか実装がうまく行かなくて完成しませんでした.これはイケてたのに…
とても苦しめられたのが,今年コンピュータ室のコンピュータを最新のものに入れ替えたのですが,コンピュータ室にRHL(RHELでゎなぃ…2000年導入…)で動いているProxyをわざわざSIerが設定しやがったばっかりに,ローカルアドレス宛のHTTPまで勝手にProxyに渡して,送信元IPアドレスをProxyのものにされたり,それどころかたまにパケットが飛ばなくなるということでした.何を考えて設定したんでしょうか.そもそも彼らは人海戦術(みんなで順番にクリックしていく)でインストールしてたり,どう見てもあまり深く考えずに作業をしているように見えました.考えてたらごめんなさい.
爆弾で周囲の壁を破壊できる機能をつける予定でした…
コードは需要は皆無でしょうが,ちょっと改善してから上げたいです.
再構築するときのために,開発環境のメモ.
ターミナルエミュレータはしばらく前から使っていたTerminatorを使っています.
VimではNeoBundle+taglist.vim+ctagsでIDEっぽくクラスとかメソッドの一覧が出るようにしました. …IDE使いたい…