當前場景加載一個TMX地圖后,在該TMX地圖加入一個精靈,代碼如下
auto map = cocos2d::TMXTiledMap::create("1.tmx");
addChild(map);
auto _tamara = cocos2d::Sprite::create("man.png");
auto foreLayer = map->getLayer("foreground");
if (foreLayer)
{//本來打算把該精靈加入到地圖的一個叫"foreground"層里,可是一加就報錯,不知道為什么。無奈之下,只好加到map里
//foreLayer->addChild(_tamara);//這里會報錯,加不了層里
}
map->addChild(_tamara);
這個1.tmx地圖里有一個"foreground"層,里面我放了好多樹。我的想法是,當精靈移動到樹前時,精靈擋樹,檔移動到樹后面時,樹檔精靈。精靈會與這個層有互動關系。
就這么個邏輯和功能。
cocos自帶的自動遮擋例子我看了,是這么實作的。

原理就是:每一排的樹,都在一個新的層里,按照順序排列,如果地圖里有10排樹,那就要建立10個圖層來加載樹。
然后在精靈移動的時候更新精靈的order,下面是官方例子代碼
void TMXIsoZorder::repositionSprite(float dt)
{
auto p = _tamara->getPosition();
p = CC_POINT_POINTS_TO_PIXELS(p);
auto map = getChildByTag(kTagTileMap);
// there are only 4 layers. (grass and 3 trees layers)
// if tamara < 30, z=4
// if tamara < 60, z=3
// if tamara < 90,z=2
int newZ = 4 - (static_cast<int>(p.y) / 30);
newZ = std::max(newZ,0);
map->reorderChild(_tamara, newZ);
}
精靈在哪一排,就相對設定他的order,這樣,精靈在地圖的位置越靠下,order就越大。
這樣的確達到預期效果。但是問題就是:太繁瑣了,每一排樹必須建立一個新的圖層,如果所有的樹都在一個層里,要么精靈全部擋住樹,要么樹全部擋住精靈,根本沒發達到預期分行的效果。如果地圖很大,有20排30排樹,這么實作起來太麻煩了。
有沒有更好的辦法??
cocos還有一個例子,是通過設定精靈的Z屬性,如下:
void TMXOrthoVertexZ::repositionSprite(float dt)
{
// tile height is 101x81
// map size: 12x12
auto p = _tamara->getPosition();
p = CC_POINT_POINTS_TO_PIXELS(p);
_tamara->setPositionZ( -( (p.y+81) /81) );
}
他的這個例子里,所有的樹都可以在一個層里,根據精靈移動時所在的排樹,排動態調整這個數值,一樣可以實作動態遮擋效果。
但是這個例子有個很重要的前提,那就是這個精靈必須是存在于這個層里。。這很重要!!!
我的代碼里,我的精靈是額外加進去的,加不到層里。
所以這兩種方式,,對我來說都很別扭,有沒有折中的辦法?
(至于為什么我要在地圖里動態加/刪這個精靈,其實我有很多地圖,這個精靈會根據情況存在于某個地圖里,精靈是唯一的,地圖不是唯一的。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/225717.html
標籤:Cocos2d-x
