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这个指针会被释放。