7

C++でゲームアプリを作っています。オブジェクトの2次元として表されたマップstd::vectorがありTileます。

プレイヤーの移動に合わせてそのマップを更新する必要があります。サーバーアプリケーションから、グローバルマップの新しい部分を含む行または列を取得します。これは、ローカルクライアントのマップに配置する必要があります。次に例を示します。

ここに画像の説明を入力

図 1 には、プレイヤーが移動する前のローカル マップがあります。一番上の行はオブジェクト 1、中央は 2、下は 0 で満たされています。プレイヤーが上に移動すると、新しい一番上の行がオブジェクト 3 で満たされ、他のすべての行が下がり、前の一番下の行が消えるはずです。

必要なオブジェクトをforループで移動するだけでそれを行うことができますが、標準ライブラリに何らかのアルゴリズムが既に存在するか、この種の変更を実現するための多くの効率的な方法が好まれているかどうかを考えていました。

編集:

申し訳ありませんが、行と列に対してこの操作を行うことに違いがあることに気づきませんでしたが、実際には違いがあります。そのため、コラムでもタイトルを編集する必要がある場合があるため、タイトルも編集しました。

4

5 に答える 5

6

イテレータを実装して、ベクトルの要素をまったく移動したくない場合があります。一番上の行 (画面上) のインデックスの変数を定義し、モジュロ演算子を使用してすべての行を反復処理します (したがって、000 行のみを 333 で上書きする必要があり、一番上の行のインデックスは 2 ではなく 2 になります)。 0)。このアルゴリズムは効率的 (必要な数のメモリ書き込みのみ) であり、任意の方向にスクロールするために使用できます。

  • 上に移動: 一番上の行のインデックスを減らし (行番号を変更)、最後の行を変更します
  • 下に移動: 一番上の行のインデックスを増やし (行番号を変更)、最初の行を変更します
  • 左に移動: 左の列インデックス (mod 列番号) を減らし、最後の列を変更します。
  • 右への移動: 左の列のインデックス (mod 列番号) をインクリメントし、最初の列を変更します。
于 2013-04-25T09:18:17.027 に答える
3

両端での高速挿入/消去が必要な場合にすぐに思い浮かぶ 2 つの標準コンテナーがあります:std::dequestd::list. ただし、特定の要件と制限があります。

ベクトルに行き詰まっている場合は、オブジェクトをコピーする代わりにオブジェクトを効率的に移動できるようにする C++11 移動セマンティクスを活用するか、@WebMonster が述べたように、何らかの循環インデックスをバッファーに使用して完全に移動/コピーの必要がなくなります。

あなたの要件を考慮し、それらが完全であると仮定すると、おそらく最も効率的な@WebMonsterのソリューションに行きます。編集:要件が変更され、列をスクロールする必要があるため、彼のソリューション「循環インデックス」は間違いなく道です。

于 2013-04-25T09:21:15.363 に答える
2

ブーストマトリックスを試してみます。

于 2013-04-25T09:24:07.130 に答える
2

ベクトルに特化した std::swap を使用できます。これは、2 つのベクトルに対して数回のポインター スワップしか必要としないため、効率的です。また、std::rotate を利用することもできますが、スワッピング手法を使用しているかどうかはわかりません。

残念ながら、これは、行のベクトルがあり、行をシフトする必要がある場合、または列のベクトルがあり、列をシフトする必要がある場合にのみ機能します。両方の操作を効率的に行うには、より複雑なデータ構造を使用する必要があるようです。

于 2013-04-25T09:21:08.403 に答える