2017-01-13 11 views
2

この全体の小説を読むのにあまり興味がない人は、最初はオフにするだけで、この質問には純粋に理論的なコードはありません。 私は自分の電話にいますが、これはどちらの選択肢が最も適しているのか、その状況で作業するのが最も簡単なのかという疑問です。C#XNA - タイルマップの配列またはタイル[、]配列

質問には、私は基本的なTilemapエンジン*でなければならないと考えているものに取り組んでいます。私は私のアプローチについては疑問に思っています。私はすでに数回それを書き直しました。それはあまりにも長い時間を費やしているわけではない、プロジェクトは、少なくともおしゃれなことに言いたい。

基本的には、このコンストラクタを持つSpriteクラスがあります。文字列名、int id、texture2dテクスチャです。

次に、Spriteクラスから派生したTileクラスがコンストラクタに追加されています。 Int X、int Y、bool walkable。

私は最初に2D整数配列を使用し、配列の位置に目的のタイルのID値を割り当てました。 そして、タイルマップを描画するときには、ループ全体を2倍にして、配列内の配列位置と同じIDのタイルを見つけて、新しいタイルを返すタイル関数を返しますループの現在のXとY(明白な理由から、テクスチャサイズを掛けたもの)を描き続ける。この時点で、私のTileクラスはXとYの値を持たなかったからです。私はそれが一種の原始的なアプローチだと感じました。

しかし私は別のアプローチをしましたが、2Dタイル配列を作成し、配列の各位置にID値を割り当ててから、それをマッチングして新しいインスタンスを作成してから描画しました配列をループして、コンストラクタ内の現在のXとYを持つ目的のタイルの新しいインスタンスを配列の位置にしてから、Tile.XとTile.Yで描画します。もっとフィット感があるようだ。

私がコードを実行する前に少なくとも約1秒間、それはしました。 これまで、描画を試みる前に配列全体にタイルを完全に配置する必要がありました。以前はID 0のタイルを使用していたため、nullオブジェクト参照が戻されます(もちろん)。他に何も割り当てられていなければ、デフォルトとして描画します。 私が以前に持っていたすべての混乱のどこかに、IDが0だった場合に描画しないようにと言った単純な「if」もありましたが、後で追加しました。 私は今、Tile配列で同じことをすることができることを認識しています.0の場合はチェックし、次にnullの場合はチェックします。しかし、私はヌルかどうかのチェックにはあまり気にしません。 もう一度、それは私にとっては何らかの形で原始的であるように思えます。 また、単純なxmlファイルをtilemapとして解析しようとすると、今度はピクルのようになります。xmlとタイルをどのようにマッチさせるか分からないからです。 Btw、以前はxmlで作業したことがないので、問題があるかどうかしかわかりません。

*「プロジェクト」がエンジンと見なされる時期や理由を正確に明確にしても、基本的なものかもしれないが、それも素晴らしいだろう。なぜなら私はそれを完全に理解しているとは思わないからです。

**私はこの状況でforeachを使用するほうが適していることに気付きましたが、それはafileのTile配列でのみ機能します。

TL; DR 私の質問を終えるために 最も適しているのは何ですか?タイルマップのint [、]またはTile [、]ですか?そして、2つの無関係なXとYのintを使用する代わりに、配置のためにTileクラスのvector2を使うべきですか?

注 - 私はコンピュータサイエンスの学生です。これまでのところ、基本的な "hello world"トレーニングしか受けていませんでした。残りの部分は個人的な関心から学んだものです。また、間違って使用されている不具合や用語がある場合は、私に修正してください。私は助けが必要なのでここで尋ねています。話題がオンであるかオフトピックであるかに関わらず、私は何か助けをとるでしょう。しかし、それが適切かつ建設的な方法で与えられたら、私は感謝します。

編集:聖なること、私はそれほど書いたことも分からなかった。 これを読んだ人には、あなたは本当のMVPです!

+0

私はこれを読んだことを楽しんだが、私はあなたのための答えを持っていない..恐ろしいポストMonogameとタイル理論については! – jhhoff02

+0

よく縛られた比較的小さなマップの私のマップ構造は、通常、 'TileStack'の2次元配列です。 'TileStack'が座標系に関するメタデータを持ち、' ​​Tile'の 'List'があります。 'Tile'はTileのidと、色、オフセット、回転などのタイルインスタンスに関する追加情報を含みます。 –

答えて

1

ゲーム内の一部の領域にはタイルが1つしかなく、複数のタイルが重なっている可能性があります。

たとえば、フロアタイルと半透明テーブルタイルの両方を見ることができるように、床に立つテーブル。つまり、タイルの単純な2次元配列では十分ではありません。
おそらく、描画座標を持つタイルインスタンスのリスト?次に、リストをループして、スクリーン上に何らかの順序でタイルを描画します。

0

まだ関連性がありますが、とにかくわかりません。私の経験からは、間違いなくint [、]だけでなく、Tileを使って、未来について考えてみましょう(特に、あなたが非常に汎用的でなければならないエンジンを作っている時)、おそらく誰かがアニメ化したり、タイルへの論理。

あなたができることは、int [、]を使ってタイルマップを構築することですが、XMLを使う方が良い方法です。ヒント:TileIDをループするか、長いswitch-case(またはifs ofc)を使用する代わりに、それらを辞書に格納することができます(これはHashMapのC#実装です)。 1)代わりにO(n)(これは重要であり、そうでないかもしれないが、どれくらいのタイルがあるかによって決まる)。デリゲートに作成関数などを辞書に格納することができます。

Tile [、]またはint [、]を使用しない場合の主な問題は、衝突検出です。正しいインデックス(またはインデックスの範囲)を計算するのではなく、タイルのコレクション全体をループする必要があります。計算はj = x/tilewidth;のようになります(O(n)の代わりにO(1)、ここでは非常に重要です)。

(テーブル、椅子、植物などの場合)ティルマップに複数のレイヤーを作成する場合は、レイヤークラス(Tile [、]を含む)を作成するか、タイル[,,,]最初のインデックスはレイヤーです。私は、最後のものがより複雑で、あまり一般的でないので、最初の方が良いと思います。

0

両方を実行できます。

「一般的なタイルデータ」をどこかに保存し、マップタイル固有のデータ(マップ内の1タイルに関連するデータ、MapTileなどと呼ばれることもある)をリストに格納します。

あなたのTileクラスはスプライト、 "walkable"状態などを保持し、 MapTileはタイルモデルへの参照、マップ内の位置、レイヤー、そして状態地図内のこの特定のタイルに固有のすべてのデータ。

タイルを描画する場合は、MapTileのリストをスクロールして、関連するモデルをタイルの位置に描画します。

このようにして、メモリ使用量を減らしても、Tile [、]メソッドの機能は引き続き使用できます。