~~~~我的生活,我的点点滴滴!!
我们简单看看Action的继承树状图:
动作类(Action)是所有动作的基类,它创建的一个对象代表一个动作。动作作用于Node,因此每个动作都需要由Node对象执行。动作类(Action)作为基类,实际上是一个接口,动作类的大多数实现类都派生于有限时间动作类(FiniteTimeAction)。
但是在实际开发中我们通常用到两类动作-即时动作和持续动作,它们均继承于有限时间动作类。
一、即时动作
即时动作是能够立刻完成的动作,这类动作是在下一帧立刻完成的动作,如设定位置、设定缩放等。把它们包装成动作后,可以与其他动作类组合为复杂动作。
下面介绍一些常用即时动作
1、Place
该动作用于将节点放置到某个指定位置,其作用与修改节点的position属性相同。例如,将节点放到屏幕坐标(50, 200)处的代码如下:
//在Point(50,200)处放一个node
auto placeAction = Place::create(Point(50,200));
auto sprite_1 = Sprite::create("role1.png");
//先添加
this->addChild(sprite_1);
//类似于setPosition功能
sprite_1->runAction(placeAction);
相当于把这个精灵放到 (50,200)处。
2、FlipX和FlipY
这两个动作分别用于将精灵沿X轴和Y轴反向显示,其作用与设置精灵的FlipX和FlipY属性相同,将其封装成动作接口是为了便于与其他动作进行组合。
下面代码将一个精灵移动到一端后反向显示再进行移回的动作:
//开启翻转
auto flipxAction = FlipX::create(true);
//移到Point(400,200),使用2s
auto moveToActionGo = MoveTo::create(2.0f, Point(300,500));
//移到Point(50,50),使用2s
auto moveToActionBack = MoveTo::create(2.0f, Point(50,50));
//Sequence是动作序列,以NULL表示参数传入结束
auto action = Sequence::create(moveToActionGo, flipxAction, moveToActionBack, NULL);
auto sprite_2 = Sprite::create("role1.png");
this->addChild(sprite_2);
sprite_2->runAction(action);
3、Show和Hide
这两个动作分别用于显示和隐藏节点,其作用与设置节点的visible属性作用一样。例如:为了使精灵完成移动后隐藏起来。
代码如下:
//隐藏
auto hideAction = Hide::create();
//显示
auto showAction = Show::create();
//移到Point(100,100),使用1s
auto moveToAction_1 = MoveTo::create(1.0f, Point(100,100));
//移到Point(200,200),使用1s
auto moveToAction_2 = MoveTo::create(1.0f, Point(200,200));
//移到Point(300,300),使用1s
auto moveToAction_3 = MoveTo::create(1.0f, Point(300,300));
//Sequence是动作序列,以NULL表示参数传入结束, 移到_1后隐藏,移动_2后显示
auto action = Sequence::create(moveToAction_1, hideAction, moveToAction_2, showAction, moveToAction_3, NULL);
auto sprite_3 = Sprite::create("role1.png");
this->addChild(sprite_3);
4、CallFunc与CallFuncN
在cocos2dx 3.x版本后CallFunc系列动作只包括CallFunc、CallFuncN两个动作,CallFuncN需要添加一个node节点作为参数,传递给调用函数,他们都是用来在动作中进行方法调用,如在游戏中为了节约内存资源,
我们可以在动作完成后调用相应函数清理内存等一系列操作。
在2.x版本中的 CallFuncND 和 CallFuncO 都可以通过 CallFunc 和 CallFuncN 进行实现。
4.1 CallFunc
/** creates the action with the callback of type std::function<void()>.
This is the preferred way to create the callback.
* When this funtion bound in js or lua ,the input param will be changed
* In js: var create(var func, var this, var [data]) or var create(var func)
* In lua:local create(local funcID)
*/
static CallFunc * create(const std::function<void()>& func);
看完声明后,我们看看几种CallFunc使用的不同写法
//写法1
auto action1 = CallFunc::create( CC_CALLBACK_0(MyClass::callback_0,this));
auto action2 = CallFunc::create( CC_CALLBACK_0(MyClass::callback_1,this, additional_parameters));
//写法2
auto action1 = CallFunc::create( std::bind( &MyClass::callback_0, this));
auto action2 = CallFunc::create( std::bind( &MyClass::callback_1, this, additional_parameters));
//lambdas表达式写法
auto action1 = CallFunc::create(
[&](){
auto s = Director::getInstance()->getWinSize();
auto label = LabelTTF::create("called:lambda callback", "Marker Felt", 16);
label->setPosition(ccp( s.width/4*1,s.height/2-40));
this->addChild(label);
} );
4.2 CallFuncN
/** creates the action with the callback of type std::function<void()>.
This is the preferred way to create the callback.
*/
static CallFuncN * create(const std::function<void(Node*)>& func);
注意到该回调动作带有一个Node*参数。
假设回调函数:
void HelloWorld::callback(Node* sender, int num);
//写法1
auto action = Sequence::create(
MoveBy::create(2.0f, Point(150,0)),
CallFuncN::create( CC_CALLBACK_1(ActionCallFuncN::callback, this)),
NULL);
//写法2
auto action = Sequence::create(
MoveBy::create(2.0f, Point(150,0)),
CallFuncN::create(std::bind(&ActionCallFuncN::callback,this,std::placeholders::_1)),
NULL);
//写法3
auto action = Sequence::create(
MoveBy::create(2.0f, Point(150,0)),
CallFuncN::create([&](Node* sender){
//回调动作代码
//dosomething
}),
NULL);
受益于C++11的新语法特性 std::bind ; CallFuncND 和 CallFuncO 都可以通过 CallFunc 和 CallFuncN 进行实现。
4.3、CallFuncND
回调动作中带有一个Node*参数和一个void*参数。
实现过程类似于 CallFuncN
假设回调函数是 :
void HelloWorld::doRemoveFromParentAndCleanup(Node* sender, bool cleanup);
那么在回调动作中:
CallFuncN::create( CC_CALLBACK_1(HelloWorld::doRemoveFromParentAndCleanup, this, true));
这样就实现了等价于 CallFuncND 的回调动作。
4.4、CallFuncO
回调动作中带有一个Object*参数。
实现过程类似于 CallFunc
假设回调函数是: void HelloWorld::callback(Node* node, bool cleanup);
那么在回调动作中:
_grossini 为那个object对象
CallFunc::create( CC_CALLBACK_0(HelloWorld::callback, this, _grossini, true)
这样就实现了等价于 CallFuncO 的回调动作。
二、持续动作
1、MoveTo和MoveBy
//移动到Position的地方
MoveTo::create(float duration, const Point& position);
//移动的改变值为Position
MoveBy::create(float duration, const Point& position);
很多时候他两的效果相似。