2012-01-23 11 views
0

アイコン、タイルベースのiPhoneゲームをcocos2Dで作成します。タイルベースのcocos2D-iPhoneゲームのための最高のZオーダー方法?

スプライトは、その背後にある他のスプライトの上に描画する必要があります。私はこれを行うための最善の方法を探しています。

高価なフレームごとにすべてのスプライトをソートする必要があるため、ペインタのアルゴリズムは避けたいと思います。

ZバッファアルゴリズムはGPUとcocos2Dでサポートされていますので、これを使用したいのですが、問題があります。いくつかのスプライトは、例えば建物のように、複数のタイルを占有します。そのようなスプライトにZ値を割り当てることは困難です。

  1. 二つの建物を比較すると、「インフロント」 簡単ですされている1決定:

    これらは私が考えてきたオプションがあります。そのため、建物をソートして、 に基づいてZ値を割り当てることができます。これは、画家の アルゴリズムとまったく同じではありません。 OpenGl ES Zバッファは必要ありません。

  2. 純粋に地図の 上の場所に基づいて各建物にZ値を割り当てます(他の建物がどこにあるかについての知識はありません)。私は です。私はそれが可能だと思うが、私は まだ式を思い付くことができませんでした。
  3. 複数のタイルを占めるイメージに複数のスプライトを使用するので、 すべてのスプライトはまったく同じサイズになります。 Z命令はスプライトが占有しているタイルに基づいて に簡単に割り当てることができます。 この解決策の問題は、ゲームロジックをさらに複雑にすることです。 が複雑になります。 1つの建物のすべての操作は、建物が構成されているスプライトごとに繰り返されて、 になる必要があります。 は、各オブジェクトを単一のエンティティとして扱いたいと思います。
  4. スプライトが異なる点に複数のZ値 を持つように、cocos2Dコードを変更します。スプライトが に基づいて複数のZ値を持つことができる場合、スプライトの特定の部分がどのタイルに当たるかは、 を計算することは簡単です。 スプライトを他のスプライトと比較する必要はありません。私は、スプライトごとに複数のクワッドを使用することでこれが可能だと信じています。この問題は、私がOpenGL ESとcocos2Dを初めて使用して以来、少し複雑になっていることが であることです。 I 内部データ構造 がどのように機能するかを完全に理解していません。式 が見つからない場合は、最も洗練されたソリューションのようですが。

私は有益なリソースへの提案や参照を優先します。

+0

建物の1つのz値が失敗する理由はわかりません。しかし、その後、私たちはあなたが行っている正確な視覚効果を知らない。 –

+0

cc_vertexzの検索...基本的には、cocos2dのisoマップの要件です。 – LearnCocos2D

+0

@Bael、単一のz値を持つ建物は失敗しません。問題は、すべてのスプライトをソートせずにz値を取得することです。それらをすべて並べ替えるなら、私はペインターのアルゴリズムを使うことができ、OpenGL Zバッファは必要ありません。建物が小さな部分に分割されている場合は、各部分にz値を割り当てるのは簡単です。そのちょうど底からの距離。私は他のスプライトがどこにあるか知る必要はありません。 – Jay

答えて

1

#2の場合、オブジェクトの中央のマンハッタン距離を計算し、この値をそのオブジェクトのz値として使用できます。 5x1オブジェクトやそれ以上の悪いオブジェクトのように、マップ内の非常に長いオブジェクトを避ける限り、機能します。しかし、実際に長いオブジェクトをタイルマップに配置する必要がある場合は、数式を使用してz値を設定してマップ内のオブジェクトのzオーダーを管理することは不可能です。

これを証明するには
1.マップ内に2x2オブジェクトを水平に2つ配置し、その間にユニットタイルを残します。
2.)それらの間に3x1オブジェクトを配置します。2x2オブジェクトをAとB、3x1オブジェクトをCとしましょう。
3.)Cを回転させるだけで(位置を変更しないで)、AとBのz順を入れ替えます。

-If Bが前面に表示され、Bの背後にあるいくつかのオブジェクトがあるためCのちょうど回転のAの前にされ、それは以前に前になりますAとBの両方の背面にどのオブジェクトを知るためにコストがかかりますCの回転後のAの値。

関連する問題