0

単純な配列 World[100][100] を使用して作成された 2D タイル ベースの世界があります。

私はゲームをマルチプレイヤーにする予定なので、サーバーがプレイヤーを囲むすべてのタイルをクライアントに送信し、クライアントが必要とする情報のみを送信するのが良いと思います: どのテクスチャ/スプライトをレンダリングするか、どの位置をレンダリングするかそれ。

これを行うには、tileType (Grass、Sand、Water など) を持ち、10 個の TileObject の配列を保持する独自の TILE クラスを作成するとよいと思います。TileObject は、次の 3 つの変数を保持するクラスです: objectType (それはキャラクターですか? アイテムですか? 木ですか? 岩ですか?)、int objectID (オブジェクトが実際に何であれリンクされているため、キャラクターが「Leeroy Jenkins "そして、レンダリングのために Leeroy のアニメーションと方向を CLIENT に送信できます。) と objectPosition (タイルからの X & Y。必要に応じてタイルを超えて拡張できます。)

これを使用して、1 つのタイルよりも大きいオブジェクトやキャラクター (衝突が多くのタイルを消費するドラゴンなど) をどのように処理するかはわかりませんが、最高のデザインのように思えます。

TileObjects を TILE クラスに格納するには、どのタイプのコンテナーを使用すればよいですか? 今、私は配列を持っていますが、それがパフォーマンスに良いとは思いませんか? TileObject が 0 個のタイルもあれば、5 個以上のタイルもあります。私は 10 を使用しました。

 class Tile
 {
private:
    TileObject TileObjects[10]; //up to 10 objects on a single tile
    TileTerrainType tileTerrainType; //GFX to display Grass, Sand, Water, Swamp, etc.
 }

私は、ベクター、マップ、リンク リスト、配列など、まったく異なるコンテナー タイプについて論じているさまざまなチュートリアルや本を読みました。TileObjects を保存するのに最適なものがわからないだけです (そのうちのいくつかは絶えず移動する可能性があり、アイテムをドロップ/ピックアップするように破壊または追加される可能性があり、木や岩のように静止したままになる可能性があるものもあります)。

4

1 に答える 1

0

map世界の座標から、世界のその座標にvector何が含まれているかまでを把握する必要があると思います。

のようにThing、ゲーム内のスペースにある可能性があるものを表すクラスPositionxyパラメーターを持つクラスがある場合、次のようになります。

map<Position, vector<Thing>>

vector<Thing>ゲーム内のすべての位置 (10000 個すべて) に対して、最初は空の1 で初期化されます。

これにより、便利なプロパティが得られます。

空間分割。自分の周りに何があるかを知りたい場合は、マップの 9 つの異なる位置を確認するだけです。もし私が別の方向に進み、1 つの大きlistThings がどこにあるかによって分割されていないとしたらThing、ゲーム内のすべての s を調べて、自分Thingの近くにある可能性のあるすべての s を確認する必要があります。

これにより、大幅なスピードアップが実現します。1) マップが大きくなればなるほど、2)Things存在感が増し、3) 要求されるローカル インタラクションの種類がますます複雑になります。


があり、それがどこにあるのかわからず、それに関連ThingIDする を取得する必要がある場合はどうすればよいでしょうか? Thingこれを解決するには、大きなmap<int, Thing>s ThingIDto Things を用意して、そこを調べることができます。もちろん、ここには冗長性が見られますThing。フラット マップまたは by-Position マップに格納し、もう一方をもう一方への参照にすることができます (前者の場合、現在の位置のみを含む -後者の場合、ThingID のみを含む)、同期を維持する必要があります。

これにより、「ドラゴン」の問題が解決される可能性さえありThingsます。フラット マップにあり、参照が位置別マップに格納されているだけの場合、ドラゴンはフラット マップに 1 つのエントリと 4 つの参照 (それぞれに 1 つ) を持つことができます。位置ごとのマップで、すべて同じものを指しています。次に、オブジェクトが 2 つの位置でたまたま見つかったという理由だけで、オブジェクトと 2 回対話しないように注意するコードを作成する必要があります。

于 2013-06-06T06:26:20.487 に答える