文化祭でGunTankOnlineという通信対戦マルチプレイヤー戦車ゲームを作った

(旧UI)

死亡後の観戦モード(旧UI)

微妙に旧UI

ブログ久しぶりです.

文化祭のために戦車ゲーム作りました.昨年度,志半ばで間に合わなかったものを完成させました.Leapとか使おうかと思ったけど,全台でやるにはやっぱり普通のほうがいいと思った.PythonとPygame使用です.マッチングサーバはFlaskです.サーバの永続化がめんどくさいのでpickleを使ったけど,大きくなってくると極端に遅くなって接続失敗するので,SQLAlchemy+SQLite3とかの構成で作りなおさないといけないかなとは思っている.

最後の追い込みで美しさとか気にしてられなくて正直ちょっと汚いコードになってしまったけど,動いたからいいや.

mipsparc / GunTankOnline — Bitbucket

UDPでP2P通信,マッチングはHTTP.同室内のコンピュータ同士で通信してたけど,インターネット越しの遅延ありまくりの環境では難しいかも.

攻撃方法は機関銃かボム.ボムは壁も壊せる.

開始時刻は,起動時にサーバの時刻を取得して合わせることで,一斉に始められるようにしてる.

事前に20個ほど作っておいたステージをランダムに選択して配信してる.

すべてオブジェクト化してるので,一度ベースを作ってからは割と構造的にやれた.

送受信は,multiprocessingでメインプロセスから送信プロセスと受信プロセスを作って,現在座標や発射座標などをJSONにしてキューに放り込んでおく.その後socketでUDPで参加者のIPアドレスに順番に送ってる.ブロードキャストはしていない.あーでも,複数のパケットが流れるよりも,あの部屋ではL2スイッチで各マシンつながってるだけだし,ブロードキャストのほうがネットワーク負荷軽かったかもなぁ.汎用性なくなるからだめだけど.

発射時には衝突予定の壁の座標と一緒に送ることで,毎フレーム壁との衝突判定みたいなのが不要になっているし,壁抜けの心配もない.爆弾は爆発時刻を設定してて,先述した同期機能を使ってる.

被弾すると,自分で他のノードに被弾報告をするようにしているので,当たり判定は自機についてのみ.他の機体は報告された座標に配置しているだけ.キーイベントを送って,動き続ける時は送らないみたいなのも考えたけど,こっちのほうが安直で楽で,面倒なことにならなそうだった.任天堂とかの通信対戦も毎フレーム送ってるらしいし.

相対座標なので1920×1080にしてそのままフルスクリーンで動かせます.

爆発エフェクトは「発色弾」利用.これが吐いたデータを整形するのでImageMagickスキルが上昇しました.ImageMagick最強.特定色透明化の時に閾値を設定しておくと,微妙なところも透明になっていい感じ.

10人位でやるとめっちゃ盛り上がります.賑わってよかった

広告
カテゴリー: コンピュータ, 通信, Python パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中