這裏是設置。我有一個用Tiled製作的正交瓷磚地圖。有5層。底部4包含背景,而頂層是我將稱之爲「樹」層的前景。我有一個英雄精靈,我已經添加了與樹層相同的節點zorder中的瓦片貼圖的子項。精靈貼圖和頂點Z順序
總是提出這種情況的問題是,我希望我的英雄在樹下面,他在「下方」,但在他後面的那些樹「之後」。低於和高於由任何給定樹的英雄的Y座標與Y座標確定。
Cocos2d編程指南包含瓷磚貼圖部分,並在該部分中具體討論瞭如何實現我描述的效果。這些信息可以在這裏找到。
http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:tiled_maps
的解決方案是非常簡單的。在我的代碼中啓用深度緩衝區。將一個值爲-1000的cc_vertexz屬性添加到英雄將在上面的每個圖層。然後,將cc_vertexz屬性添加到樹層,其值爲「automatic」以及值爲.5的cc_alpha_func屬性。然後當你的英雄移動時,根據它在地圖中的位置重新調整其精靈的頂點值。
我做了所有這一切,它工作得很好。然而,當我在這幅地圖上添加其他「敵人」精靈時,就出現了一個問題。與英雄精靈一樣,這些精靈被添加到具有與樹層相同的節點zorder的地圖中,並且它們的頂點值也根據其在地圖內的Y座標而改變。應該指出的是,英雄精靈在敵人精靈之後被添加。另外,英雄和敵人的精靈都是動畫的,他們的紋理不是瓦片貼圖紋理的一部分。基於Cocos2d文檔,這應該不重要。
問題是這樣的。如果我的英雄在地圖上的敵方精靈之下,那麼一切看起來都很正常。但是,如果我的英雄在地圖上的敵方精靈之上,那麼當敵人越過英雄精靈時,背景會通過,而不是英雄精靈。描述它的最好方式是說,只要敵方精靈開始越過英雄精靈,敵方精靈的透明區域開始充滿背景,而英雄精靈部分被遮擋,直到敵方精靈離開英雄。這就像英雄精靈不在那裏。
我知道這與精靈加入地圖的順序有關,因爲如果我改變這個並在敵人精靈之前將英雄精靈添加到地圖上,那麼效果會逆轉,因爲背景會通過英雄精靈的透明區域而不是敵人的精靈。這幾乎就像vertexz屬性並不是絕對確定事物繪製的順序。
展望這一點,似乎是一個混合的問題,我發現了什麼似乎是解決方案,這是繼承CCSprite類,並具有以下重載繪製方法:
-(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相當於上面的代碼片斷,還是我只是做錯了什麼?我懷疑後者。
任何幫助將非常感激。謝謝!