CCSprites を重ねる順序を制御しようとしています。私は を使用しますzOrder
が、多関節スプライト (一部のスプライトは で他のスプライトを親にしていますaddChild
) で構成されるキャラクターをアニメートしており、zOrder は兄弟スプライト間でのみ尊重されます。
基本的に、スプライトを親にして、お互いのトランスフォームを継承できるようにしたいのですが、描画順序を決定したいと考えています。
周りを見渡すと、CCSprite のvertexZ
プロパティを使用するのがよいようです。私はそれを試しました。カスタム CCSprite の draw メソッドを次のように設定します。
- (void)draw
{
glEnable(GL_BLEND);
CHECK_GL_ERROR_DEBUG();
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
CHECK_GL_ERROR_DEBUG();
[super draw];
glDisable(GL_BLEND);
}
各スプライトには 0 の zOrder と、必要に応じてレイヤー化するための一意の vertexZ がありますが、機能していません。親を持つスプライトは表示されません!
いろいろ試してみると、頂点Zを設定しないと、すべてのスプライトが表示されることがわかりました。そして、頂点Zを保持して親にしないと、それらはすべて表示されます。しかし vertexZs が設定されていると、子スプライトは表示されません。
ここで何が起こっていて、どうすればそれを機能させることができますか?
更新: より多くの手がかり。[super draw] への呼び出しの周りの GL 関数を完全にコメントアウトすることができ、結果は同じです。また、頂点 Z を持つ子スプライトは表示されますが、他のスプライトと重なる場所では非表示になります。紫色の紙のスプライトは、クリーチャーの左前腕のスプライト (画面右) の子ですが、その上に配置する必要があります。
上の写真では、基本的に CCLayer でこれを行っています。子育てはしたいけど、手と紙が一番上に欲しい。
[self addChild:lUpperarm];
[self addChild:lForearm];
[self addChild:face];
[self addChild:rUpperarm];
[self addChild:rForearm];
[lForearm addChild:handAndPaper];
lUpperarm.vertexZ = -100;
lForearm.vertexZ = -99;
face.vertexZ = -98;
rUpperarm.vertexZ = -97;
rForearm.vertexZ = -96;
handAndPaper.vertexZ = -95;
これは私がそれをどのように見せたいかです。(私が[self addChild:handAndPaper]
望むものではなく、lForearmの変換を失う最後の行を変更しました。)
更新 2: zOrder を -1 に設定してすべての子を追加することを提案する人もい[lForearm addChild:handAndPaper z:-1]
ます。これにより状況が少し変わりましたが、残念ながらまだ修正されていません。vertexZ が描画順序を決定していないか、ブレンドが間違っているようです。