gpt4 book ai didi

cocos2d-x - CCLayer::init() 和 CCLayer::onEnter() 之间的区别?

转载 作者:行者123 更新时间:2023-12-02 10:22:14 25 4
gpt4 key购买 nike

这是关于 Difference between CCNode::init() and CCNode::onEnter() 的主题。不过我遵循了advice他们给了。

void MyLayer::onEnter() {
CCLayer::onEnter();
//your code goes here
}

我收到断言失败!错误!
MyLayer代码:

class MyLayer : public CCLayerColor

我应该在 MyLayer::onEnter() 代码中添加 CCLayerColor::onEnter() 吗? CCLayer::init()CCLayer::onEnter() 之间有什么区别。我应该将哪部分代码放入 init() 中,将哪部分代码放入 onEnter() 中?

最佳答案

Cocos2d-x 的内存分配模型是一个两步过程,就像 Objective-C 一样。每个对象都分配有内存(通常使用“create”方法),然后初始化其状态(通常使用称为“init”的方法)。因此,在 create/init 方法中,您分配内存并执行其运行所需的任何对象初始化。

当对象开始被放置到显示器上时,或者当它被添加到另一个容器时,它的“onEnter”方法被调用。当框架本身显示 CCScene/CCLayer(其中任何一个都可能包含您的 CCNode 派生对象)时,将调用此函数。

内存分配和对象创建至少有两种模式,我倾向于遵循让类包含静态工厂方法和私有(private)构造函数的模式,这样就明确必须通过工厂创建对象,并且无法自行创建。

例如,我目前正在研究这个“按钮”类:

class ActionButton;

class ActionButtonTarget
{
public:
virtual void ActionButtonActivated(ActionButton* button) = 0;
};

class ActionButton : public CCNode, public CCTargetedTouchDelegate
{
private:
ActionButton();

CCNode* _node; // Weak Reference
CCRect _testRect;
ActionButtonTarget* _target;

bool init(ActionButtonTarget* target, CCNode* node, CCRect rect);
bool IsTouchInside(CCTouch* touch);

void NotifyTarget();

protected:
virtual CCAction* CreateAction();

public:

virtual ~ActionButton();

// The class registers/unregisters on entry
// or exit of the layer. This
virtual void onEnterTransitionDidFinish();
virtual void onExitTransitionDidStart();

virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);

static ActionButton* create(ActionButtonTarget* target, CCNode* node, CCRect rect);
};

请注意,“create”方法是创建它的唯一方法。在这种情况下,它采用按钮参数的参数。其他 CCNode 派生对象(例如 CCScene)通常不会。

内部:

ActionButton::ActionButton()
{
}

ActionButton::~ActionButton()
{

}

// The class registers/unregisters on entry
// or exit of the layer. This
void ActionButton::onEnterTransitionDidFinish()
{
CCNode::onEnterTransitionDidFinish();
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
}

void ActionButton::onExitTransitionDidStart()
{
CCNode::onExitTransitionDidStart();
CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
}

bool ActionButton::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
if(IsTouchInside(pTouch))
{
return true;
}
return false;
}

void ActionButton::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
{
// Nothing to do here.
}

void ActionButton::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
NotifyTarget();
}

bool ActionButton::IsTouchInside(CCTouch* touch)
{
CCPoint point = touch->getLocationInView();
point = CCDirector::sharedDirector()->convertToGL(point);
return _testRect.containsPoint(point);
}


void ActionButton::ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent)
{
_target->ActionButtonActivated(this);
}

ActionButton* ActionButton::create(ActionButtonTarget* target, CCNode* node, CCRect rect)
{
ActionButton *pRet = new ActionButton();
if (pRet && pRet->init(target,node,rect))
{
pRet->autorelease();
return pRet;
}
else
{
CC_SAFE_DELETE(pRet);
return NULL;
}
}

CCAction* ActionButton::CreateAction()
{
return NULL;
}

void ActionButton::NotifyTarget()
{
CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect(Constants::SOUND_EFFECT_BUTTON_CLICK());
_target->ActionButtonActivated(this);
}



bool ActionButton::init(ActionButtonTarget* target, CCNode* node, CCRect rect)
{
assert(target != NULL);
assert(node != NULL);
assert(dynamic_cast<ActionButtonTarget*>(target) != NULL);

_target = target;
_node = node;
_testRect = rect;

addChild(_node);

return true;
}

注意OnEnterXXX和onExitXXX方法调用父类方法。 您必须这样做,否则它将无法按预期工作。

此类是一个按钮,它将在节点上运行一个操作(可能使其增大/缩小以指示它被按下)。它需要用户的触摸。在它进入场景之前我无法将其添加到触摸管理器中。因此,我使用 onEnterTransitionDidFinish 方法来添加它,并使用 onExitTransitionDidStart 来删除它,这样在场景被删除后它就不会继续接收触摸。我不知道容器是否会被销毁,所以我必须在按钮退出显示时将其删除。

这有帮助吗?

关于cocos2d-x - CCLayer::init() 和 CCLayer::onEnter() 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20769747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com