***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************
题外话:
好久,好久,好久,好久,木有更新了
8月份,去韩国旅游了9天,回来,直接去井冈山参加实践活动(课题是做一个安卓应用)
恩,现在就是在井冈山实践基地,要19号才能回去。
而且,终于终于连上WIFI,可以发篇博客了。
正文:
这次是关于cocos2d-x的Action,就是动作啦,各种动作,这个的学习,最好根据cocos2d-x的样例。
{
PS:样例程序的打开方法:
用VS2012 打开项目:
->cocos2d-x文件夹下
——build文件夹下
cocos2d-win32.vc2012项目
}
本篇博文,通过七个测试程序来展示一些基本的Action:
一、Manual Transformation————对精灵的基本设定
二、MoveTo和MoveBy————精灵的基本动作(顺序执行动作)
三、Span+Rotate————精灵的基本动作(同时执行动作)
四、DelayTime:m+delay+m————动作的延迟执行
五、Repeat和RepeatForever————重复执行
六、Follow Action————跟随动作
七、Sequence of InstantActions————结束机制
恩,可以边运行着程序,边看着代码,观摩着学习
文件可以看ActionTest.cpp
在运行的程序中,选择Action—Basic观看
——第一个测试——
Manual Transformation
它的相应代码位置在:
//------------------------------------------------------------------ // // ActionManual // //------------------------------------------------------------------ void ActionManual::onEnter() { ActionsDemo::onEnter(); auto s = Director::getInstance()->getWinSize(); _tamara->setScaleX( 2.5f); _tamara->setScaleY( -1.0f); _tamara->setPosition( Point(100,70) ); _tamara->setOpacity( 128); _grossini->setRotation( 120); _grossini->setPosition( Point(s.width/2, s.height/2)); _grossini->setColor( Color3B( 255,0,0)); _kathia->setPosition( Point(s.width-100, s.height/2)); _kathia->setColor( Color3B::BLUE); } std::string ActionManual::subtitle() const { return "Manual Transformation"; }
可以从代码中看到,
对对象进行的一系列操作:
//------------------------------------------------------------------ // // ActionManual // //------------------------------------------------------------------ void ActionManual::onEnter() { ActionsDemo::onEnter(); // 获得以点为单位的OpenGL视图的大小 auto s = Director::getInstance()->getWinSize(); // 对第一个对象进行操作: // 对X轴缩放 _tamara->setScaleX( 2.5f); // 对Y轴缩放 _tamara->setScaleY( -1.0f); // 设定坐标 _tamara->setPosition( Point(100,70) ); // 设定透明度 _tamara->setOpacity( 128); // 对第二个对象进行的操作: // 设定旋转角度 _grossini->setRotation( 120); _grossini->setPosition( Point(s.width/2, s.height/2)); // 设定颜色 _grossini->setColor( Color3B( 255,0,0)); <span style="white-space:pre"> </span>// 对第三个对象进行的操作: _kathia->setPosition( Point(s.width-100, s.height/2)); _kathia->setColor( Color3B::BLUE); } std::string ActionManual::subtitle() const { return "Manual Transformation"; }
或许你注意到了,这里的函数是OnEnter,为什么不是Init呢?
这里就要说一下OnEnter和Init的区别:
Init:对象初始化时执行的函数。
OnEnter:当对象显示出来的时候,开始执行的函数。(可见的时候才被执行)
——第二个测试——
第二个测试是关于MoveTo和MoveBy的测试
代码:
//------------------------------------------------------------------ // // ActionMove // //------------------------------------------------------------------ void ActionMove::onEnter() { ActionsDemo::onEnter(); centerSprites(3); auto s = Director::getInstance()->getWinSize(); // 设定几个动作: // 移动到一个绝对的坐标点,第一个参数是花费的时间 auto actionTo = MoveTo::create(2, Point(s.width-40, s.height-40)); // 移动到一个相对坐标点,即以本位置为基准向右80,向上80,第一个参数为花费的时间 auto actionBy = MoveBy::create(2, Point(80,80)); // 做一个actionBy的反向动作 auto actionByBack = actionBy->reverse(); // 给三个精灵安排分别执行的动作 // 第一个精灵 执行actionTo动作 _tamara->runAction( actionTo); // 第二个 顺序化执行actionBy和actionByBack动作(先执行actionBy,再执行actionByBack) _grossini->runAction( Sequence::create(actionBy, actionByBack, NULL)); // 第三个精灵执行MoveTo动作(内容:用1秒钟,向上,向右移动40) _kathia->runAction(MoveTo::create(1, Point(40,40))); } std::string ActionMove::subtitle() const { return "MoveTo / MoveBy"; }
接下来的都可以自己查看,
借助API,很容易就能明白了。
——第三个测试程序——
这个测试程序是 Span+Rotate
//------------------------------------------------------------------ // // ActionSpawn // //------------------------------------------------------------------ void ActionSpawn::onEnter() { ActionsDemo::onEnter(); alignSpritesLeft(1); auto action = Spawn::create( JumpBy::create(2, Point(300,0), 50, 4), RotateBy::create( 2, 720), NULL); _grossini->runAction(action); } std::string ActionSpawn::subtitle() const { return "Spawn: Jump + Rotate"; }
JumpBy::create(2,Point(300,0),50,4)
跳跃的语句。
RotateBy::create(2,720)
翻转语句。
类似于Sequence,Spawn可以用来同时进行多个动作。
——第四个测试程序——
这个是 DelayTime:m+delay+m
就是中间加一个延迟时间:
//------------------------------------------------------------------ // // ActionDelayTime // //------------------------------------------------------------------ void ActionDelayTime::onEnter() { ActionsDemo::onEnter(); alignSpritesLeft(1); auto move = MoveBy::create(1, Point(150,0)); auto action = Sequence::create( move, DelayTime::create(2), move, NULL); _grossini->runAction(action); } std::string ActionDelayTime::subtitle() const { return "DelayTime: m + delay + m"; }
——第五个测试程序——
Repeat和RepeatForever
//------------------------------------------------------------------ // // ActionRepeat // //------------------------------------------------------------------ void ActionRepeat::onEnter() { ActionsDemo::onEnter(); alignSpritesLeft(2); auto a1 = MoveBy::create(1, Point(150,0)); auto action1 = Repeat::create( Sequence::create( Place::create(Point(60,60)), a1, NULL) , 3); auto action2 = RepeatForever::create( Sequence::create(a1->clone(), a1->reverse(), NULL) ); _kathia->runAction(action1); _tamara->runAction(action2); } std::string ActionRepeat::subtitle() const { return "Repeat / RepeatForever actions"; }
Repeat::create中有两个参数:第一个是需要重复的动作,第二个重复的次数。
重复的次数取值范围是1到2^30之间的无符号整数。
而相应的RepeatForever就没有次数的参数,只有一个参数。
——第六个测试程序——
Follow Action
//------------------------------------------------------------------ // // ActionFollow // //------------------------------------------------------------------ void ActionFollow::onEnter() { ActionsDemo::onEnter(); centerSprites(1); auto s = Director::getInstance()->getWinSize(); // 给精灵设置坐标位置 _grossini->setPosition(Point(-200, s.height / 2)); // 给精灵设定动作 auto move = MoveBy::create(2, Point(s.width * 3, 0)); auto move_back = move->reverse(); // 设定动作的顺序 auto seq = Sequence::create(move, move_back, NULL); // 设定 动作永远重复 auto rep = RepeatForever::create(seq); _grossini->runAction(rep); // 设定跟随的语句,creat有两个参数,第一个是所需要跟随的精灵,第二个参数是动作的边界 this->runAction(Follow::create(_grossini, Rect(0, 0, s.width * 2 - 100, s.height))); }
——第七个测试程序——
Sequence of InstantActions
//------------------------------------------------------------------ // // ActionSequence2 // //------------------------------------------------------------------ void ActionSequence2::onEnter() { ActionsDemo::onEnter(); alignSpritesLeft(1); // 设置节点是否可见,false为不可见 _grossini->setVisible(false); // 设定 顺序 展示的动作 auto action = Sequence::create( Place::create(Point(200,200)), Show::create(), MoveBy::create(1, Point(100,0)), // 当上述三个动作结束后,调用下面这三个 CallFunc::create( CC_CALLBACK_0(ActionSequence2::callback1,this)), CallFunc::create( CC_CALLBACK_0(ActionSequence2::callback2,this,_grossini)), CallFunc::create( CC_CALLBACK_0(ActionSequence2::callback3,this,_grossini,0xbebabeba)), NULL); _grossini->runAction(action); }
CC_CALLBACK_0表示没有参数,Action使用时应用
CC_CALLBACK_1表示只有一个参数,Menu使用时应用
CC_CALLBACK_2表示绑定有两个参数,一般用于用户的单点触摸,多点触摸
******总结一下******
Action:
——基本动作
MoveTo/MoveBy
RoatTo/RoatBy
JumpTo/JumpBy
.......
——组合动作
Sequence 顺序执行
Spawn 同时执行
——动作的取反
Reverse
——动作的重复执行
Repeat
RepeatForever
——函数动作
CallFucn::create()
恩,就是到这里啦~
参考资料:沈老师
***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************
cocos2d-x 3.0 Action,布布扣,bubuko.com
原文地址:http://blog.csdn.net/lttree/article/details/38565287