2011-05-05 9 views
1

私は30km/hで3秒ごとに "弾丸"を発射する3つの防衛塔を持っています(番号は設定可能です)。これらの防衛タワーにはレーダーがあり、タワーレーダーの下にいるときに発砲するだけです。それは問題ではありません。ゲームでガンファイアデータを保存して使用する必要はありますか?

私の質問は、どのようにガンの火災のためのデータを格納するかです。私は各弾に必要なデータは正確にはわかりませんが、気になるのは弾丸の位置です。私はそれを格納する必要があると仮定しましょう(私は既に3D点のために定義された構造体を持っています)。

ゲームが特定のポイントで持つことができる最大の弾丸を把握し、そのサイズの配列を宣言する必要がありますか?リンクされたリストを使うべきですか?それとも別の何か?

私は本当にこれを行う方法がありません。私は空想的で複雑なものは必要ありません。ちょうどうまく機能し、使用して実装するのに十分な基本的なものは十分です。

P.S:私はそれがここでうまく合うと思うので、私はゲーム開発のウェブサイト(タグにもかかわらず)にこの質問を投稿しませんでした。

+1

申し訳ありませんが、私たちはどのように答えを知っていますか?それは私たちが知らないあなたのゲームの特性に依存します。 – akappa

答えて

3

一般に、固定長配列は良い考えではありません。

あなたのゲームモデルを考えると、私はO(1)の削除を許可しないデータ構造には行っていません。とにかく、普通の配列を排除し、リンクされたリストを提案するかもしれません。しかし、基本的な詳細は、適切な属性を持つジェネリックコンテナクラスを使用して抽象化する必要があります。あなたが保存すべきかについては

:(あなたが述べたように)

  1. ポジション
  2. 速度
  3. ダメージ因子(あなたの銃はアップグレードあり、そうではありません?)
  4. 最大範囲(同上)

EDIT ちょっと複雑なことに、STLクラスは常に要素のコピーを取ります。実際には、オブジェクトの存続期間にわたって属性が変更される可能性がある場合は、構造体をヒープとストアに割り当てる必要があります?)コレクション内のそれらへのポインタ。

+1

私は最後の声明に同意しません。具体的には、弾丸の正式なコピーがベクトル内のものであり、「元の」弾丸データが挿入された後に破棄された場合、彼はベクトルが彼のメモリ管理を行うようにすべきである。 –

+0

@Robは、コレクション内の特定のアイテムに対する変更は、アイテム全体を置き換えることによってのみ行うことができるという意味ではありませんか? – Alnitak

+0

それは私を混乱させる。弾丸が動いているので、現在の弾丸の位置を保存して、衝突、ヒットなどをテストする必要があります。しかし、あなたが言ったように、私は実際のデータへのポインタを使用する可能性があります。 –

1

私はstd::vector<BulletInfo>で始まり、そこからどのように動作するか見ることができます。それはインタフェースのような配列を提供するが、動的にサイズ変更可能である。

2

おそらくstd::vectorまたはstd::listを使用します。最も簡単なことは何でも。

注意:非常に制約の厳しいプラットフォーム(CPUが少なく、メモリが少ない)をコーディングする場合は、固定長のC固定配列を使用するのが理にかなっています。しかし、最近はそうは考えにくいです。コード作成が最も簡単なものから始め、後で変更します。

1

このような場合、私は弾丸を管理するにはやや複雑な方法が好まれます。スクリーン上で可能な弾丸の数は、タワーの数に直接関係しているので、私は各タワークラス内に小さな固定長の弾丸配列を保持します。タワーが弾丸を発射するたびに、配列を検索し、未使用の弾丸を見つけ、弾丸を新しい位置/速度で設定し、それをアクティブにマークします。

もう少し複雑な部分は、外部のマネージャー(BulletManagerなど)に2番目の箇条書きのリストを保存するのが好きです。各タワーが作成されると、タワーはすべての弾丸を中央管理者に追加します。その後、中央管理者は弾を更新することができます。

私はこの方法が好きです。弾丸に関連するメモリ制約を簡単に管理でき、「アクティブタワー数」の数を微調整するだけで、すべての弾丸が作成されます。弾丸はすべてプールされているため、弾丸を割り振る必要はなく、タワーを追加/削除する際に常にサイズを変更する必要がある中央プールは1つしかありません。

ポインターのリストを持つ中央マネージャーがあるため、わずかなオーバーヘッドが伴います。また、中央管理者から破壊されたタワーから常に弾丸を取り除くように注意する必要があります。しかし私の利益はそれに値する。