6

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 が描画順序を決定していないか、ブレンドが間違っているようです。

zOrder -1 の効果。

4

4 に答える 4

1

Cocos2d で RPG を作成するときに、この問題に対処しました。問題はアルファブレンディングです。ご覧のとおり、紙は透明ですが、左腕のスプライトによって覆われています。Cocos2d の vertexZ 手法を使用すると、何らかの理由でこの問題が発生することがあります。これを修正するには、アルファ ブレンディング レベルを変更してみてください。0.0、0.5、1.0 を試してください:

-(void) draw
{
    glEnable(GL_ALPHA_TEST);
    glAlphaFunc(GL_GREATER, 0.0f);
    [super draw];
    glDisable(GL_ALPHA_TEST);
}

それでもうまくいかない場合は、完全な回避策をお勧めします。すべてのスプライトを同じ親ノードの一部として保持し、通常の z 順序を使用します。これは理想的な解決策ではありませんが、「メタ」親ノードを使用すると、すべての子を簡単に変換できます。

于 2012-09-05T16:35:37.710 に答える
0

u だけを追加している間、z オーダーを制御できますか?

[self addChild:lUpperarm z:1];
[self addChild:lForearm z:2];
[self addChild:face z:3];
[self addChild:rUpperarm z:4];
[self addChild:rForearm z:5];
[lForearm addChild:handAndPaper z:6];
于 2012-08-29T15:12:57.683 に答える
0

これがあなたの問題かどうかはわかりませんが、過去に draw() で遊んでいるときに問題があり、呼び出しの最後にblendfuncをリセットしていなかったことが判明しました。

これは、いくつかの透明度を備えた基本的な描画を行う、私が使用する描画関数です。繰り返しますが、保証はありません。

- (void) draw {
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    ccDrawSolidPoly(vertices, 4, fillColor);

    // This is the important bit.  Must do this last.
    //
    glBlendFunc(CC_BLEND_SRC, CC_BLEND_DST);
}
于 2013-06-05T15:32:30.360 に答える
-3

より高い z 値を設定して、オブジェクトを上に設定します。z 値を下げて背面に設定します。

于 2012-08-30T06:44:23.093 に答える