2011-01-18 9 views
5

私はマルチプレイヤーロールプレイングゲームを開発中です(いいえ、mmorpg;はありません)。滑らかなマルチプレイヤーの動き

私の現在の設定はこのようなものです。

クライアントはサーバーに「私は前進したい」/「後ろに移動したい」と指示した後、エンティティを更新し、その領域のすべてのクライアントに変更について通知します。サーバは20msごとに各エンティティを更新し、クライアントに100msごとに更新を送信します。これらの更新には位置、速度、回転などが含まれます。

これまでのところ、とても良いですが、パケット間の動きをスムーズにするために、クライアント側では、私はそれを動作させることができないと言う必要があります。私は予言、補間、デッドレキソニングについて読んできましたが、そのすべてが私にとって大変です。

今私はちょうど "Position = Packet.Position"のようなことをしています。これは非常に吃音の動きを引き起こします。

だから私は助けたいと思っていますが、どうすればよりスムーズな動きを得ることができますか? XNA予測サンプルを見てきましたが、正しく取得できませんでした。

ありがとう//

+0

プレーヤーの動きだけをスムーズにする必要がありますか?クライアントはプレーヤーの現在の速度を知っていますか? – ssmir

+0

さて、私は現在、プレイヤーしか持っていないので、それが私の主な関心事です。クライアントは速度を知っており、サーバーからのステータスパッケージに含まれています。実際に私はIRCで素敵な答えを得て、明日それを試してみましょう。 –

答えて

3

私は、クライアントがいないネットワークゲームかのようにその位置自体を算出し、ここでanother question(受け入れ答えを参照)

からアイデアをお勧めしたいです。クライアントは定期的に現在の位置をサーバーに送信します。そして、クライアントが選択した方向に動くことができない場合、サーバーはクライアントに正しい位置を送信します。

同じアルゴリズム

はウルティマオンラインで使用された

+0

あなたがウルティマオンラインについて言及するその面白いことは、私の好きなゲームの一つです。 :)現在の実装で問題が見つかった場合は、これを試してみます。しかし、この結果は、プレーヤーAとプレーヤーBが見ているものとかなり大きな違いにはなりませんか? –

+0

@Fredrik Yep、私のお気に入りの1つ=)実際には違いはプレイヤーのpingに依存し、見積もることができます。しかし、私はこの違いがここでは何の役割も果たしていないと考えています。 UOで誰かを攻撃すると、クライアントは攻撃対象のIDを送信します。したがって、2人のモニターをお互いに近づけて比較すると、ポジションの違いが目立つことがあります。 LANの代わりにインターネット経由でゲームを実行すると、問題が発生し始めるはずです。特に、パケットロスが発生すると、秒単位で測定された巨大な遅延が発生するため、TCPを使用すると(少なくとも)。 – ssmir

0

(少なくとも私は10年前にそれを再生していたとき)、私は私のメインの1と一緒にゴーストエンティティを実行することによってそれを解決しました。
ゴーストはフレームごとに更新されますが、パケットが到着するたびに、その値はパケットの値に設定されます。

次に、実際のエンティティをゴーストがどこにあるのかを徐々に微調整します。

+0

なので、プレイヤーが移動を開始した瞬間から、ゴーストが新しい位置を受け取った瞬間には、まだまだ遅れがありますか? – ssmir

+0

しかし、これは目立つものではありません。 –