2009-07-26 13 views
4

私はゲームプロジェクトを始めています。私は最初、戦争に大きな関心を持って文明のクローンのようになります。私はいつもC#で仕事をしていましたが(主にWebアプリケーション)、地図の位置付けシステムを構築するにはどうすればいいのでしょうか。ゲームの位置付けOOのデザイン

私は各ユニットがどこに位置しているかを知りたいし、マップには各ポイントのすべてのユニット、双方向関係を知りたいが、これをモデル化する最良の方法は何か分からない!私はあなたができるなら、いくつかのアイデアと擬似コードが欲しいです!

ありがとうございました。

+0

これで幸いです。私は文明を自分自身が愛していますが、ほとんどが軍隊をたくさん作り、隣人を滅ぼしました。私はこのようなものの市場があると思う。 – MusiGenesis

答えて

2

マップを2次元配列にします。各位置で、すべてのオブジェクトの配列をその位置に配置します。さらに、各オブジェクトに位置属性を追加します。

はい、これにより情報が複製されます。だから各移動でオブジェクトマップを更新する必要があります。

しかし、オブジェクトの高速読み込みと高速検索は、その種のゲームにとって非常に重要です。さらに、この解決策は、探索ルーチン(例えば、地図を通過して特定のオブジェクトを探す)を回避するが、これは一般的には良い考えである。大規模なデータセットに対するすべての検索ルーチンをインデックスで置き換える。マップは、オブジェクトの位置属性に対する何らかの種類のインデックスと見なす必要があります。

+0

しかし、私はいくつかのユニットに移動して地図を更新させるべきですか? – Alaor

+0

はい、もちろんです!このようにして、更新コードはきれいに1か所にあります。 – vog

+1

それはターンベースのゲームです、スピードは本当に要因ではありません。 10000のゲームオブジェクトを持っていなければ、ユニットを配列に分割することはできません。プレイヤーごとに十分です。 – Sneakyness

2

マップには、その上のすべてのオブジェクトに関するすべての知識が必要です。さらに、マップ上の各オブジェクトだけがその位置を知る必要があります。このようにして、マップはオブジェクトがどこにあるかをすべて調べ、正しい場所に配置できます。位置決め情報を2度保存する必要はありません。

+0

「位置情報を2回保存する必要はありません」...これは私が推奨しない極端な視点です。私はコードを単純化せず、高速化もしません。 – vog

+3

コードを非常に単純化します。何かを2回追跡するのは、特に2つの場所で更新することを忘れた場合は、不条理です。マップがそのオブジェクトを観測するオブザーバー型のパターンは、データ変数の重複よりはるかに優先されます。 – AlbertoPL

+2

地図を描くためには、地図がある地域にあるユニットを知っていなければならないと思うので、スクリーンをドローするのが簡単になり、ユニットがどこにいるのか、どこから来ているのかを知る必要があるので、私はそれを2回保存する必要があります。エラーが発生しやすいのは分かっていますが、デベロッパーがもっと楽になることを知っています。これを行うためには、パターンやコードが必要です。 – Alaor

1

は、ここでの重複は避けるべき一つの方法だ

は、マップ上のすべてのオブジェクトを保持するクラスを持ち、オブジェクトの異なるタイプのそれコレクション内

public class MapObjects 
{ 
    private Collection<GamePiece> gamePieces; 
} 

コレクション内の各項目は、そのを開催します(現在の)マップ座標

public class GamePiece 
{ 
    private MapCoordinate mapCoordinate; 
    // Other items relevant to a GamePiece.. Health, ItemType, etc 
} 

特定の選択した項目は、地図上で場所を検索するには簡単なはず、あなたはGamePieceへの参照を持っていますその座標を保持する。あなたはおそらくMapObjectsのクラス内のヘルパーメソッド、必要なもの項目、特に座標されて見つけるには:

public class MapObjects 
{ 
    public Collection<GamePiece> GamePiecesAtLocation(MapCoordinate mapCoordinate) 
    { 
     // Iterate through gamePieces collection and build a result 
     // collection of items at specified coordinates. 
    } 
} 

幸運を、課題をたっぷり使って興味深いプロジェクトのように聞こえます。

+0

これは、単に各GamePiece.move()の後にマップを更新するよりも優れていますか? MapObjectsバリアントは遅くて、より多くのコードを必要とするようです。 – vog

+0

感謝の男、それは役に立ちました。私はこのアプローチについて考えましたが、私は質問がありました:はい、大きな地図といくつかの部分があればいいですが、比率を変えれば、たくさんのユニットを持つ地図、位置情報を保存する責任を変更するいくつかの時間?しかし、今は私がポイントを逃したと思う、忙しいゲームでさえも、彼らがどこにいるかを知っているユニットにとっては、マップに多くのユニットを持たせることはできない。 – Alaor

0

グリッドの代わりに地図を六角形にすると、斜めに地面を覆うことができる奇妙な文明現象はありません。それを超えて、私は各ユニットに独自の位置を格納させるだけで、どのユニットが特定のヘックスにあるのかを知る必要があるときは、コレクション全体を反復するだけです。非常に多くのユニットが関与していて、このアプローチがパフォーマンス上の問題であると想像するのは難しいです。

+1

六角形のグリッドは、通常は2次元の配列でもあります。 :-) ...いくつかの座標は未使用のままです。 – vog

+0

MusiGensis!ここであなたを見て空想。私は、各プレーヤーのためのユニットの配列を持つことをお勧めします。このようなことを書くことの予期しない複雑さについて、私の答えを見てください。 – Sneakyness

+0

@スニーク:私は美しい日曜日の午後にどこにいますか?世界を楽しんでいますか? – MusiGenesis

0

NSPointはこのような場合に非常に便利です。各ゲームオブジェクトは、自分の場所を持つ必要があります。これらのゲームオブジェクトは、各プレイヤーごとに1つずつ、ゲーム全体に1つずつ、配列で格納できます。それはあなた次第です。

これは巨大なプロジェクトであり、コード通りではあるが内容的には賢明であり、ゲームのバランシング中に多くの前後の作業が必要であることを警告します。あなたはこのゲームの後に行く前に、いくつかの小さなゲームを試してみるべきです。何もダイビングを止めることはありませんが、最初の試合がこのような大きなものならば、たくさんの壁にぶつかり、真剣なスパゲッティコードを書くつもりです。私はチェッカーのようなものから始めることを勧めます。

これは現在、最初のゲームプロジェクトとしてroguelikeを書いている男からのものです。私の防衛では、それは比較的単純ですが、私が期待していないことがたくさんあり、妨害を考慮した戦争の視界/霧を計算するだけの単純なものは、複雑なアルゴリズムを使用します。私は最初のゲームとしてロゲイキを選ぶことを後悔しませんが、最も基本的なコンセプトがどれほど複雑であるかを見てから、ターンベースの戦略ゲームのようなものは今、

ユニットを作成するだけでなく、地図を表現して場所を保存する方法について考えているのであれば、調査でコードを書くときにはどうしますか?都市?製造?リソースの収集? ランダムマップジェネレータ?軌道計算?ヒット確率?鎧?モビリティ?視線?ランダムイベント? AI?

私はあなたの夢を何とか押しつぶそうとしているわけではありません。あなたが選んだジャンルは、見た目より複雑です。あなたの脳は、縫い目で過負荷と破裂します。 (私はトピックについて韻を踏むことができますが、最初にチェッカーのようなものを試してみてください)。

+1

チェッカー?たぶん彼はチックタックつま先で始めることができました。 :) – MusiGenesis

+0

正直なところ悪い考えではありません。しかし、試合をしようとしないでください。あなた自身のひねりを加えて、物事を変えてください。 – Sneakyness

+0

こんにちは!返信いただきありがとうございます。私は100%あなたに同意します。私はそれが巨大で難しいことを知っていますが、それはまだ商業目的ではなく、私の卒業生の最終プロジェクトの一部であり、私はグラフ、オーディオなどの他のものと一緒に働くチームを持っています。ゲームプレイは計画されており、都市、生産式などのようなものがあり、一般的にどのように動作するのか、これはすべてコーディングを開始する前に考えられていました。コーディングが私の責任であるように、私は都市、国、ユニットのようなモデリングエンティティを開始し、私はポジショニングシステムを作った、私はちょうど私が正しい方法でいるかどうかを知りたい。 – Alaor

0

良いデザイン=シンプルなデザイン。

マップをオブジェクトのリストにします。

Object 
    int X { get; set; } 
    int Y { get; set; } 

Map 
    List<Object> objects 
    Add(Object) 
    Remove(Object) 
    GetAt(X, Y) 
    GetInBox(X,Y,Width,Height) 
    GetInRadius(X,Y,Radius) 

これですべて必要です。 Get(..)クエリが遅すぎる場合は、キャッシュを追加するか、マップをセクタに分割し、各セクタのオブジェクトのリストを保持し、移動すると更新します。これは、多くの静的オブジェクトや、セクター間であまりにも速く動かないオブジェクトが多い場合に劇的に役立ちます。私の推測では、ターンベースのゲームでは、あなたはまったく最適化する必要はありません。

+0

NSPoint、NSRect、NSRangeは、あなたが書いたものの半分を置き換えます。ホイールを再構築する必要はありません。 :) – Sneakyness

+0

まずホイールがどのように機能しているのかを説明してから、既存の実装を探してみることは良いことだと思います。また、NSPointは、すべての言語やプラットフォームで利用できるわけではありません。 –