最近は少し余裕が出てきたので、ゲームの開発を再開しつつあります。
それで、最近東方爆弾録の開発を少し進めました。
今回はBluetoothによる対戦機能を付けました。
対戦画面です。
ところで、Bluetooth通信での対戦ができるスマホゲームってどれくらいあるんでしょうか。通信対戦って結構難しいんですよね。アクションゲームみたいなリアルタイムで進行する場合は特に。
Bluetooth等の無線通信を経由して対戦をする際、同期をとるのが非常に難しいのです。
アクションゲームは最低でも30fps(普通は60fps欲しいですが)必要ですので、1秒間に30回画面を更新するということは一回の画面更新に使える時間は33ミリ秒です。
意外と使える時間って少ないんですよね。そもそも画面の描画をするだけでも、かなりいっぱいいっぱいで、通信に使える時間はほとんどありません。問題は時間がないことだけではなく、Bluetoothの無線通信は微妙に安定しないため、時々データが到達するのに時間がかかることがあります。
(微妙に安定しないのは、シリアル通信をしているからで、マウスやキーボードは大丈夫なのかもしれませんが。)
まあ、どちらにしてもゲームの通信ていうのはこんな感じなので、昔、同期式で通信対戦を作ったときは画面がカクカクでゲームになりませんでした。ですので、今回は非同期式にしたところ、何となくうまくいきました。
同期式:
全端末との通信が完了するまでゲームを進行しないというやり方です。全端末が描画の処理をするまで待つので、同期式だと、全端末が全く同じ表示のされかたをするわけですね。
非同期式:
対して、非同期式っていうのは、通信完了を待たず、各々勝手にゲームを進行してしまいます。だから、微妙なずれが端末間で時々起きるので、それをどうやって収めるかというのが大事になるわけですね。
非同期式で一番問題になるのは、あたり判定です。キャラの位置に微妙なずれが生じた時、ある端末では爆発にあたっているのに、他の端末ではあたっていないといった状況の時、どうしたらいいのかということになります。
これの解決策として、各端末は自分の操作キャラだけ責任を持ってあたり判定を含めた全ての処理を行い、他のプレイヤーキャラは他の端末から結果だけを通知してもらいます。これだと、他のプレイヤーキャラの動作は遅延することがあるため、一見爆発を避けたように見えたのに、ダメージを受けていることがあるかもしれません。ですが、他人のことなんて些細な問題です。要は自分のキャラが正確にあたり判定されていればいいのです。
こんな感じで非同期式だと、端末間で時々ずれが生じますが、うまいことやることで問題がないことがわかりました。
既存のネットワークゲームはだいたい非同期式のはずです。同期式を採用するのであれば、通信ケーブルみたいに近距離で物理的につなげないと無理なんじゃないかなと思います。
この調子で次は二人協力プレイも作ろうかなと。霊夢-レミリア、魔理沙-パチェ、咲夜-美鈴、みたいな感じのよくあるペアで協力プレイモードがあったら面白そうだと思いまして。スーファミの時はこういうのよくありましたよね。