これがセットアップです。Tiled で作成した直交タイル マップがあります。5層あります。下の 4 つは背景を構成し、上のレイヤーは前景であり、これを「ツリー」レイヤーと呼びます。ツリー レイヤーと同じノード zorder でタイル マップの子として追加したヒーロー スプライトがあります。
このシナリオで常に思いつく問題は、ヒーローが「下」にある木の前にいるが、「上」にある木の後ろにいることです。上下は、ヒーローの Y 座標と特定の木の Y 座標によって決まります。
Cocos2d プログラミング ガイドには、タイル マップのセクションが含まれており、そのセクションでは、私が説明した効果を実現する方法について具体的に説明しています。この情報はここにあります。
http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:tiled_maps
解決策は非常に簡単です。コードで深度バッファを有効にします。ヒーローが上になる各レイヤーに、値が -1000 の cc_vertexz プロパティを追加します。次に、値が「自動」の cc_vertexz プロパティと、値が .5 の cc_alpha_func プロパティをツリー レイヤーに追加します。次に、ヒーローが移動するときに、マップ内の位置に基づいてスプライトの vertexz 値を再調整します。
私はこれをすべてやりましたが、うまくいきました。しかし、このマップに他の「敵」スプライトを追加するとすぐに問題が発生しました。ヒーロー スプライトと同様に、これらのスプライトはツリー レイヤーと同じノード zorder でマップに追加され、マップ内の Y 座標に基づいて頂点 z 値も変更されます。敵スプライトの後にヒーロースプライトが追加されることに注意してください。さらに、ヒーロー スプライトと敵スプライトの両方がアニメーション化され、それらのテクスチャはタイル マップ テクスチャの一部ではありません。Cocos2d のドキュメントに基づくと、これは重要ではありません。
問題はこれです。私のヒーローがマップ上の敵のスプライトの下にある場合、すべてが正常に機能します。ただし、ヒーローがマップ上の敵スプライトの上にある場合、敵がヒーロー スプライトの上を通過すると、ヒーロー スプライトではなく背景が透過します。これを説明する最良の方法は、敵のスプライトがヒーローのスプライトを通過し始めるとすぐに、敵のスプライトの透明な領域が背景で塗りつぶされ始め、敵のスプライトが移動するまでヒーローのスプライトが部分的に隠されていると言うことです英雄。ヒーロースプライトがいないようなものです。
これは、スプライトがマップに追加される順序に関連していることを知っています。これを変更して、敵のスプライトの前にヒーロー スプライトをマップに追加すると、効果が逆になり、背景が透明な領域を通って来るからです。敵スプライトではなくヒーロースプライト。vertexz プロパティが、物事が描画される順序を完全に決定するわけではないようです。
これを調べると、ブレンディングの問題のように見えます。解決策と思われるものを見つけました。それは、CCSprite クラスをサブクラス化し、draw メソッドを次のようにオーバーライドすることです。
-(void) draw {
glEnable(GL_ALPHA_TEST);
glAlphaFunc( GL_GREATER, 0 );
[super draw];
glDisable(GL_ALPHA_TEST);
}
ただし、問題は、このコードが、私が使用している Cocos2d のバージョンである Cocos2d 2.1 に適用できないことです。さらに、自動 vertexz が有効になっている場合、これは CCTMXLayer 描画関数によって処理されるようです。そのため、CCSprite のサブクラス化が単に冗長になるかどうかはわかりません。CCTMXLayer がこれを処理する方法については、以下を参照してください。
// CCTMXLayer drawing function -(void) draw
{
if( useAutomaticVertexZ_ ) {
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, alphaFuncValue_);
}
[super draw];
if( useAutomaticVertexZ_ )
glDisable(GL_ALPHA_TEST);
}
私は Cocos2d は初めてではありませんが、OpenGL に関連することはまったく初めてです。要するに、CCSprite をサブクラス化し、上記のコード スニペットに相当する Cocos2d 2.1 を見つけるだけの解決策ですか、それとも単に何か間違ったことをしているのですか? 私は後者を疑います。
どんな助けでも大歓迎です。ありがとう!