cocos2dx-3.0(28) 动作类 Action

本文详细介绍了cocos2dx中Action的使用,包括即时动作如Place、FlipX/Y、Show/Hide和CallFunc系列,持续动作如MoveTo/By、JumpTo/By,视觉特效动作如FadeIn/Out、TintTo/By,复合动作如DelayTime、Repeat/Forever、Spawn和Sequence,以及变速动作的运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

~~~~我的生活,我的点点滴滴!!


我们简单看看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  的回调动作。


二、持续动作

属性变化动作:属性变化动作通过属性值的逐渐变化来实现动画效果。需要注意的是XXTo和XXBy的区别在于XXTo是表示最终值,而XXBy则表示向量-改变值。

1、MoveTo和MoveBy

用于使节点做直线运动,设置了动作时间和终点位置,在规定时间内会移动到终点,它们的初始化方法如下:
//移动到Position的地方
MoveTo::create(float duration, const Point& position);
//移动的改变值为Position
MoveBy::create(float duration, const Point& position);

很多时候他两的效果相似。


2、JumpTo和JumpBy
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值