1

直接的な助けよりもアドバイスを求めています。

XNA で 8 ビットのプラットフォーマー ゲームに取り組んでいます。私はおそらくすでに 160 時間もその作業に没頭しており、所有しているエンジンに問題が生じ始めています。これは基本的に、XNA プラットフォーマー デモの適応/修正バージョンです。私のタイルのすべてまたはほとんどは 32x32 ですが、机のように幅 64 ピクセル、高さ 32 ピクセルのものもあります。植物のように、幅 32、高さ 64 のものもあります。

XNA チュートリアルの作成者がタイル マッピングを行うのと同じように、一度に .png を 1 つだけ gpu に送ります。アニメーション化されたスプライトには、キャラクターのさまざまなフレームのタイル マップを使用します。タイル マップ データは、XNA チュートリアルと同じようにテキスト ファイルを読み込んでいます。

幅の広いタイルと背の高いタイルにはどのように対応すればよいですか? 2 層のタイル システムを作成する必要がありますか?

現在、透明なタイルを使用して幅の広いタイルを拡張しています。

椅子付きデスク:

椅子 http://dl.dropbox.com/u/8446900/game_screen_desk.png

.....
...h.
..d".
#####

植物と椅子:

デスク http://dl.dropbox.com/u/8446900/game_screen_plant.png

..p...h.
..,...,.
########

椅子は 'h'、'd' は机、'p' は植物、',' は透明な背景タイル (ユーザーとの対話なし) です。'"' は、ユーザーがその上に立つ (机を拡張する) ことができる透明なタイル用です。問題は、ご覧のとおり、背景に穴が開いているように見えることです。

実際のタイル マップを作成し、すべてを 1 つの大きな png に結合する必要がありますか? 私が取ることができる別のオプションは、実際に各幅または高さのタイルを 2 つの異なるタイルにカットすることです。プロはこれをどのように行うでしょうか?私は、現代のプラットフォーマーがどのように動作するかについて、簡単で汚い修正を探しているわけではありません。

更新: 回答を確認した後、スプライトをシートにパックする非常に便利なツールを見つけました。

http://spritesheetpacker.codeplex.com/

更新: 新しくアップグレードしたタイル エンジンは、はるかに高速で、ほぼ同じくらいシンプルです。以下のアドバイスは素晴らしかったです。強く推奨する。

4

1 に答える 1

5

まず、特殊な幅/高さのタイルを導入しないでください。アーティストに大きなオブジェクトを 1 つのタイルにスライスしてもらいます (したがって、マップ エディターでそれらを再構成します)。すべてのタイルは、正しく構成できるように、アルファ チャネルを持つ PNG にする必要があります。

それを念頭に置いて、私の推奨事項は次のとおりです。

  1. タイルは、さまざまなオブジェクトのパーツが事前に構成されている 1 つのタイルのみで構成する必要があります。たとえば、机の左側の部分は 1 つのタイルで、椅子のない右側の部分は別のタイルで、後ろに椅子があるもう 1 つのタイルです。(tilevalue = "dc"、おそらく?)

  2. 単一のタイルの複数のレイヤーを定義して、それらを前後にレンダリングできます。複数のレイヤーの視差係数を定義することもできるため、2 つのレイヤー間で優れた視差効果を簡単に得ることができます。もちろん、プレーヤーは一度に 1 つのレイヤーに「存在」する必要があります。そうしないと、プレーヤーの現在の位置に使用するコリジョン ジオメトリがわかりません。

また、タイルごとに 1 つのテクスチャを作成するのではなく、コンパイル済みのタイルシート (スプライトシートとまったく同じ) を作成して、renderstate の変更回数を最小限に抑える必要があります。描画呼び出しごとに多くの変更を行うのは良くありません。変更を加えるたびに (現在のテクスチャ、描画色、またはその描画呼び出しに影響を与える何か)、API、ドライバー、そしておそらく GPU 自体がその状態を更新するために作業を行う必要があるためです。すぐに加算されます。

これは、キャラクターとレベルを巨大なスプライトシートに入れる必要があるという意味ではないことに注意してください。これは、他の理由で悪いことです。たとえば、レベルに関連するすべてのタイルを 1 つのタイルシートに配置し、ヒーローのアニメーション タイルを別のタイルシートに配置し、すべての敵を 1 つの (一緒に) または同様のものに配置できます。

それ以外の場合は、さらに説明していただければ幸いです。

于 2012-05-23T18:00:14.717 に答える