【cocos2d-x游戏开发】动作事件的监听

1.动作结束监听

	Size visibleSize = Director::getInstance()->getVisibleSize();                         //获取屏幕尺寸
	Sprite* sprite = Sprite::create("sprite.png");                             //创建一个精灵
	sprite->setPosition(Point(visibleSize.width / 2,visibleSize.height / 2));                //设置精灵的初始位置
	this->addChild(sprite);           //将精灵加入到场景中

	MoveTo* moveToHome = MoveTo::create(10.0f,Point(visibleSize.width,visibleSize.height / 2));      //创建一个移动动作

	auto callbackFunc = [&]()
	{
		backHome();
	};

	CallFunc* callFunc = CallFunc::create(callbackFunc);

	Action* actions = Sequence::create(moveToHome,callFunc,NULL);                  

	sprite->runAction(actions);               //执行动作

    return true;
}


void HelloWorld::backHome()
{
	Size visibleSize = Director::getInstance()->getVisibleSize();
	Label* label = Label::create("I am home!","Arial",35);
	label->setPosition(Point(visibleSize.width / 2,visibleSize.height / 2));
	this->addChild(label);
}







CallFunc是一个看不见的动作,它的作用就是回调一个函数,它的动作就是调用这个函数。

callbackFunc就是一个lambda函数是一个匿名函数,一个最简单的lambda函数结构如下[](){}
[]符号就是表示要开始一个lambda函数了。
()里面填写函数的参数。
{}就是一个函数体。

当我们想在lambda函数里使用外部的变量时,需要做一些改变,在[]符号里加上指定的符号,就可以指定变量捕获模式,常用的模式如下:

[]:不截取任何变量。
[&]:截取外部作用域中所有变量,并且作为引用在lambda函数中使用,可以简单的理解为,只要变量没有被释放,那么在lambda函数中都可以使用。但是局部变量不可以使用,因为局部变量会被释放。
[=]:截取外部作用域中所有变量,并复制一份在lambda函数中使用,即使外部变量的值改变了,但是在lambda函数中使用。
[=,&h]:功能和[=]一样,只是是针对h变量来用的。


看下面代码

	Sprite* sprite = Sprite::create("sprite.png");
	sprite->setPosition(Point(200,200));
	this->addChild(sprite);

	auto func = [&](){
		sprite->setScale(2);
	};

	CallFunc* callFunc = CallFunc::create(func);
	this->runAction(callFunc);
我们创建了一个精灵,然后想要在func函数改变它的伸缩值。但是会报错的,这是因为我们使用的是[&]模式,这种模式无法在lambda函数里面使用局部变量,因为局部变量在调用lambda前就已经被释放了。这个精灵本身没有被释放,因为它已经在场景中了。但是sprite这个指针会被释放。

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...