***************************************转载请注明出处: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";
}
此处要特别注意的就是 Sequence,这个可以顺序执行一系列动作。
接下来的都可以自己查看,
借助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";
}
很明显,用的是Sequence,顺序执行,中间加一个延迟语句DelayTime即可。
——第五个测试程序——
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执行的是一定次数的动作。
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)));
}
设定跟随的语句中,第二个参数是关于动作的边界,当参数设置为Rect::ZERO时,即为没有边界。
——第七个测试程序——
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);
}
CallFunc::create语句中,
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********************************************