アフィリエイト広告を利用しています

広告

posted by fanblog

ネットワーク対戦型ゲームその1

今大学の講義でネットワーク対戦型ゲーム制作の課題が進行中なので完成までちょいちょい書いていこうかと思います(^o^)

対戦ゲームと言ってもたくさんあるのですが
1対1のアクションゲームを制作していこうかと思ってます^^
しかもこの課題はコンテストがあるのでAndroidも可能ならば使用したいと思います(^_^;)
そして優勝をもぎ取る!!←

ゲームというと派手なアクションなどを夢見るのは当然ですがまずは基盤づくりをww
ネットワークでの対戦ということで当然ネットワーク処理が必要です。

ネットワーク通信の種類としてTCPとUDPが代表的なものです。
これらの違いとしては
TCP:データの送受信が成功したか確認しながら通信するので速度が遅い、その代り信頼性が高い
UDP:データを一方的に送りつけるので速度は早いが届いているかの確認がないので信頼性が低い
この2つについては調べればかなりの情報が手に入ると思います。

パッと見だとUDPよりTCPの方が良さそうですが使用する環境によって優劣が変わってきます。

たとえばチャットプログラムのように確実に相手にコメントを届けないといけなく、それほど高速な通信を必要としない場合であればTCPの方が適しています。
それに対してアクションゲームのようにプレイヤー情報が常に変化する場合は速度が重要になってきます。

何を作りたいかで通信方式を選ぶ必要があるわけですね。

ここで、自分の場合はUDPで決定じゃん、と言いたいところなのですが
これがまた環境を考慮するとそうでもありません。
それは今回のネットワーク対戦型ゲームは同一LAN内のPC同士で通信を行うということです。
同一LAN内であればTCPとUDPの速度の差はそれほど大きくはなりません。
プログラムによっては差をなくすことも可能かもしれません。
それ故にこのアクションゲームではTCPを使用したいと思います。

実装済みの通信形態としては複数のプレイヤーをマッチングする必要があるので
マッチング専用のサーバを構築しました。
まず、すべてのプレイヤーはサーバに接続し、プレイヤー情報を送信します。
次にサーバから他のプレイヤー情報を取得します。
そして対戦したい相手を選んだあとはサーバからそれぞれのIPアドレスを取得します。



そしてどちらかをサーバに見立てて
新たに対戦者間での直通通信を構築します。



こうすることでサーバを経由するタイムラグを排除できます。

実際にはプレイヤー間では2つのTCP通信を結んでいます。
上の図のような繋がりが2組あるわけです。

一つはコマンドを送信するラインです。
攻撃ボタンが押されたら攻撃開始の指示を送信する、といった具合に
任意のタイミングで送受信するための通信ラインです。

もう一つは座標を常時送受信するためのラインです。
座標は常に変化するので任意のタイミングではワープしているように見えてしまうからです。

ここにブログタイトルのCよりJavaが好き の理由があったりします笑
Javaではこれらの通信処理をマルチスレッディングによって簡単に実装することができるのですがCではちと厳しい(今の自分には無理だけど上級者の方なら可能なのでしょうw)

以上のように同一LAN内のPCならば簡単にできるのですが
自分はAndroidを投入したいのでAndroid用に別の方法も考えねばなりません。
正直ここが一番苦しかったww

AndroidではUDP通信を使用しました。
そして実機で3Gによる通信をするのでUDP hole punchingという技法を導入して通信を確立することに成功しました。

ただ、説明が難しいので
また暇があればAndroidの通信について書いてみます。w

ここまで読んでいただきありがとうございます!

この記事へのコメント

   
×

この広告は30日以上新しい記事の更新がないブログに表示されております。