我在场景中有几个图层,比如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;
}
}
答案 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类中创建字段。