如何在cocos2d-x中的同一场景中获取其他图层?

时间:2014-03-28 09:34:47

标签: c++ cocos2d-x

我在场景中有几个图层,比如TLayer,HLayer,TouchLayer。如何在HLayer中获得HLayer?我采取的解决方案是将Layer传递给其他Layer。但是我最近遇到了一些问题。当TouchLayer仍然存在时,我按下场景并弹出场景。所以我的问题是将HLayer传递给TouchLayer是正确的。或者在Cocos2d-x中有更好的方法吗?

在场景中的init()函数中:

this->setbackgroundLayer(BackgroundLayer::create());
CC_BREAK_IF(!backgroundLayer);
this->addChild(backgroundLayer);

this->setTLayer(TcharacterLayer::create(backgroundLayer->tianzige));
CC_BREAK_IF(!TLayer);
this->addChild(TLayer);

this->setHLayer(HcharacterLayer::create(testCharacter,backgroundLayer->tianzige_draw));
CC_BREAK_IF(!HLayer);
this->addChild(HLayer);

this->settouchLayer(TouchLayer::create(TLayer,HLayer));
CC_BREAK_IF(!touchLayer);
this->addChild(touchLayer);

我创建了自己的创建函数:

TouchLayer* TouchLayer::create(TcharacterLayer* t,HcharacterLayer* h){
    TouchLayer* pRet = new TouchLayer();
    if (pRet && pRet->init(t,h))
    {
        pRet->autorelease();
        return pRet;
    }else
    {
        delete pRet;
        pRet = NULL;
        return NULL;
    }
}

2 个答案:

答案 0 :(得分:3)

这是我们过去如何做到这一点的。为我们的图层定义一组标记。

typedef enum {
    kBgLayerTag,
    kHLayerTag,
    kTLayerTag,
    kTouchLayerTag
    } MyLayerTags

然后在创建图层时设置图层特定标记:

this->setTLayer(TcharacterLayer::create(backgroundLayer->tianzige));
CC_BREAK_IF(!TLayer);
TLayer->setTag(kTLayerTag);
this->addChild(TLayer);

在TouchLayer中访问TLayer和其他人:

TcharacterLayer* myTLayer = this->getParent()->getChildByTag(kTLayerTag);

答案 1 :(得分:0)

当然,添加图层作为孩子没有任何问题。我会这样做: BackgroundLayer将所有必要的图层作为子图层(记得将TouchLayer添加为最后一个,然后将Touch传递给其他图层),然后只将BackgroundLayer添加到场景中。还有更简单的方法(可能更好):使BackgroundLayer继承所有以前的方式 - 但这取决于你将要制作多少场景。

编辑: 1)

BackgroundLayer * bglayer = BackgroundLayer::create();
TcharacterLayer * tcharlayer = TcharacterLayer::create();
HcharacterLayer * hcharlayer = HcharacterLayer::create();
TouchLayer * tlayer = TouchLayer::create();

bglayer->addChild(tcharlayer);
bglayer->addChild(hcharlayer);
bglayer->addChild(tlayer);
this->addChild(bglayer);

(假设这是一个CCScene)

2)

class BackgroundLayer : public TcharacterLayer, HcharacterLayer, TouchLayer
{
...
}

在第一种情况下,您可以为每个图层指定一个特定的标记,然后按getChildByTag(int tag)获取图层,或者只在每个图层的BackgroundLayer类中创建字段。