博客文章

cocos2d-x 假动作

作者: andy.      时间: 2016-12-14 16:52:29

一般情况创建序列动作都通过CCSequence组成一个序列然后挨着一次执行。有时需要在一系列动作执行完成后再执行一些东西,而这些东西并不是一个动作。此时就不能加入CCSequence,需要通过假动作来完成。假动作是回调函数。可以加入CCSequence中。完成相应的需求。

假动作有四个:CCCallFunc、CCCallFuncN、CCCallFuncND、CCallFuncO。四个类。

1、CCCallFunc表示这个回调函数无参无返回值。

bool ActionLayer::init(){
	CCLayer::init();
	CCSprite * sprite = CCSprite::create("sprite/bullet.png");
	sprite->setPosition(ccp(sprite->boundingBox().size.width / 2, 200));
	addChild(sprite);

	CCMoveBy * by = CCMoveBy::create(2, ccp(400, 0));
	CCCallFunc *func = CCCallFunc::create(this, callfunc_selector(ActionLayer::callBack));
	CCSequence *sq = CCSequence::create(by, func, NULL);

	sprite->runAction(sq);

	return true;
}

void ActionLayer::callBack(){
	CCLog("GG");
}

2、CCCallFuncN表示这个回调函数含有一个CCNode指针参数,这个参数就是调用这个动作的sprite。

bool ActionLayer::init(){
	CCLayer::init();
	CCSprite * sprite = CCSprite::create("sprite/bullet.png");
	sprite->setPosition(ccp(sprite->boundingBox().size.width / 2, 200));
	addChild(sprite);

	CCMoveBy * by = CCMoveBy::create(2, ccp(400, 0));
	CCCallFuncN *func = CCCallFuncN::create(this, callfuncN_selector(ActionLayer::callBack));
	CCSequence *sq = CCSequence::create(by, func, NULL);

	sprite->runAction(sq);

	return true;
}

void ActionLayer::callBack(CCNode* node){
	CCSprite * sprite = (CCSprite *)node;
	sprite->setPosition(ccp(200, 200));
}

3、CCCallFuncND相对于CCCallFunN需要多传入一个参数。void *。下面这段代码,应该在init 中new一个数据,在callBack中都出来然后delete掉。因为int和指针占用的空间大小是一样的,所以这儿懒以下。

bool ActionLayer::init(){
	CCLayer::init();
	CCSprite * sprite = CCSprite::create("sprite/bullet.png");
	sprite->setPosition(ccp(sprite->boundingBox().size.width / 2, 200));
	addChild(sprite);

	CCMoveBy * by = CCMoveBy::create(2, ccp(400, 0));
	CCCallFuncND *func = CCCallFuncND::create(this, callfuncND_selector(ActionLayer::callBack), (void *)2);
	CCSequence *sq = CCSequence::create(by, func, NULL);

	sprite->runAction(sq);

	return true;
}

void ActionLayer::callBack(CCNode* node, void *data){
	CCSprite * sprite = (CCSprite *)node;
	sprite->setScale((int)data);
}

4、CCCallFuncO和第三个是一样的,少一个CCNode*参数而已。void * 变成了CCObject *,,,,这个CCObject*是传数据用的。因为指针非常灵活,所以和void*没区别。

bool ActionLayer::init(){
	CCLayer::init();
	CCSprite * sprite = CCSprite::create("sprite/bullet.png");
	sprite->setPosition(ccp(sprite->boundingBox().size.width / 2, 200));
	addChild(sprite);

	CCMoveBy * by = CCMoveBy::create(2, ccp(400, 0));
	CCCallFuncO *func = CCCallFuncO::create(this, callfuncO_selector(ActionLayer::callBack), sprite);
	CCSequence *sq = CCSequence::create(by, func, NULL);

	sprite->runAction(sq);

	return true;
}

void ActionLayer::callBack(CCObject *obj){
	CCSprite * sprite = (CCSprite *)obj;
	sprite->setPosition(ccp(200, 200));
}