2

敵とプレイヤーのスプライトがz:0に追加されたGameSceneがあります。z:-1でGameSceneに背景レイヤーを追加します。これは、メインの背景で正常に機能します。唯一のことは、いくつかの雲を表示したいということです。このため、それらはプレーヤーと敵のスプライトに対してz:1である必要があります。

私のアプローチは、背景レイヤーのz:2に雲を追加することですが、敵やプレーヤーのスプライトの下にまだ表示されているため、これでは十分ではありません。

z値(2)がバックグラウンドレイヤーのz値(-1)に追加され、絶対的な(GameScene親レイヤーと比較して)z:1のz値、つまりz:0より上になると思いました。敵とプレイヤーのスプライトの。

明らかに私は間違っています。

次に、スプ​​ライトをレイヤーに追加すると、最後に追加されたスプライトが同じレイヤーにある場合は前のスプライトの上に表示されることを確認しました(たとえば、プレーヤースプライトの後に敵を追加すると、プレーヤースプライトの上に敵が表示されます)。これは、奇妙なグラフィック効果(色が混ざり合う2つの画像のオーバーレイ)を回避するための規則だと思います。これは正しいです?

さて、私の唯一の解決策は、複数の背景レイヤー(1つは雲用、もう1つは実際の背景地形用)を用意し、それらをGameSceneのさまざまなzレベルに追加することです。これは正しいでしょうか?これの欠点は、論理的に類似しているクラスを維持する必要があることです。

4

3 に答える 3

2

これは、次のCocos2D Essential Referenceからのcocos2dでの描画順序の仕組みに関するサンプルの章です(これについては、すぐに私のブログをフォローしてください)。

描画順序がどのように機能するかを簡単にまとめます。

  • ここで、ノードは同じ親を持ちます。ノードは、zOrderの低いものから高いものへと描画されます。
  • ここで、ノードは同じ親と同じzOrderを持ちます。ノードは、子として追加された順序で描画されます。
  • 異なる親のノードは、親ノードが描画される順序で描画されます

取り除くべき最も重要なことは、zOrderは同じレベルの子ノードにのみ影響するということです。シーンに2つの子ノードAとBがあり、Aが最初に描画される場合、Aのすべての子ノードもノードBの下に描画されます。

于 2012-09-11T14:37:35.010 に答える
1

描画中、要素はzOrderプロパティに等しい順序で描画されます。つまり、zOrder-3のアイテムはzOrder-2のアイテムの前に描画され、zOrder1のアイテムはzOrder0のアイテムの後に描画されます。すべてのノードのコンテンツがそのメソッドに描画されているため、すべてのzOrderは1つのノード内で機能していますdraw。CCNodeのvisitメソッドを確認すると、コードに表示されます。

したがって、さまざまなレイヤーを作成して、シーンにさまざまな「深さ」の関連性を持つゲームオブジェクトを追加できるようにすることができます。たとえば、背景レイヤー、障害物レイヤー、敵とヒーローのレイヤー、ボーナスのレイヤーなどです。

于 2012-09-11T08:59:31.317 に答える
1

zPositionモリオンは、のについてのあなたの疑問に明確に答えますCCNode。ただし、2番目の質問にも回答を追加したいと思います。

GameScene特に雲と地形が相互作用しないか、同じコードを共有しない場合は、に2つの背景レイヤーがあるのが正しいです。これは、実際にはコードの分離とモジュール性の点で優れています、IMHO。

ただし、(何らかの理由で)それらを1つのクラスにしたい場合は、次のように呼び出すだけです。

// Don't call this in the init, since the parent is obviously nil there...
[[self parent] addChild:cloud z:kBackgroundLayerCloudsZ tag:kBackgroundLayerCloudsTag];

親を呼び出して子を追加するだけであり、レイヤーの維持に役立つ定義済みの定数があることに注意してください。後の段階で、中間の背景レイヤーを追加する場合は、定数を変更して、新しいレイヤー用に新しい定数を追加します。

私はこのアプローチをよく使用しますが、TBH、あなたの場合は2つのクラスの方が良いと思います。私がこのアプローチを使用するのは、スプライトをレイヤーに分離する必要がある場合保守性の向上、コードの分離など)であると同時に、異なるレイヤーのスプライトがインターリーブされている場合です(layer1のスプライトは上にあり、layer2のスプライトが上にある場合もあります)。

于 2012-09-11T09:12:26.297 に答える