2013-09-24 75 views
0

這裏是設置。我有一個用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相當於上面的代碼片斷,還是我只是做錯了什麼?我懷疑後者。

任何幫助將非常感激。謝謝!

回答

0

這已解決。的解決方案是使用在我的子畫面或子畫面片下面視情況可以是:

mySprite.shaderProgram = [[CCShaderCache sharedShaderCache]programForKey:kCCShader_PositionTextureColorAlphaTest]; 

這實質上需要的地方子類CCSprite和重寫繪圖方法,其是用於cocos2d的1規定的方法.x,而我正在使用Cocos2d 2.x.