Cocos2d-x ——Action (动作)简介
来源:互联网 发布:防火墙会拦截网络打印 编辑:程序博客网 时间:2024/05/18 01:38
Cocos2d-x中非常关键的部分——动作。动作是一个轻量级的类,可以用来让节点执行者诸如移动、旋转、缩放、变色、消失等很多动作。所有的动作都可以细分为若干个基本动作和基本动作的组合动作。进一步通过动作的扩展,我们可以将同一个精灵的更多动作和不同精灵之间的不同动作连贯起来,形成一个动态的游戏的世界。
基本动作:
基本动作的本质就是改变某个图形对象的属性。包含:位置、角度、大小等。根据改变的内容和方式的不同,基本动作又可以进行进一步细分。而根据改变完成所需要的时间,可以将基本动作分为:延时动作和瞬时动作两大类。
在 CCNode类中有一个对象方法:runAction();
声明为:CCAction *runAction(CCAction *action); 因为CCSprite、CCLayer、CCLabeTTF等很多类都是继承自CCNode,所以它们都可以执行这个runAction方法。当我们想要创建并执行一个动作。方法如下:
CCAction *action= //后面跟动作的创建方法。
node->runAction (action); //node为一个创建好的的节点或者节点的子类。
以上两行代码就是我们最常用的创建和执行动作的基本代码。
CCFiniteTimeAction 、CCFollow、CCspeed 都是继承自CCAction.
CCspeed的作用是调整行为实例的执行速度,因此它依赖于其它的行为,单独的CCSpeed没有意义。
CCFollow可以使用节点跟随指定的另一个节点移动。
CCFiniteTimeAction 是加入了时间属性的动画基类,用于派生各种由时间插值进行计算的动画。
在CCFiniteTimeAction中,还有两个子类,分别是CCActionInstant——瞬时动画 及CCIntervalAction——延时动画。
瞬时动画:
瞬时动作就是不需要时间等待,马上就完成的动作。瞬时动作的的子类:
CCCallFunc 执行 回调函数。 CCFlipX x轴镜像翻转。 CCFlipY 轴镜像 翻转。 CCHide 隐藏。 CCPlace 设置位置
CCReuseGrid 重用网格 CCShow 显示 CCStopGrid 停止网格 CCToggleveVisibility 可见切换
1,放置动作 sp->runAction(CCPlace::create(300,300)); 等效于setPosition()
2, 隐藏动作 sp->runAction(CCHide::create()); 等效于setVisible(false);
3,显示动作 sp->runAction(CCShow::create()); 等效于 setVisible(true);
4,水平翻转动作,sp->runAction(CCFlip X::create());等效于 setFlipX(true);
5,垂直翻转协作,sp->runAction(CCFlip Y::create());等效于setFlipY(true);
延时动作:
延时动作,就是执行需要时间的动作,因此持续动作的静态生成函数,往往附带一个时间值Duration。
持续动作类名一般有两种后缀,一种是To,一种是By,To表示最终达到的目标值,By表示增量值。
例:
CCMoveBy::create(0.5f,ccp(5,5));//表示花0.5秒,按向量(5,5)移动一段距离。
CCMoveTo::create(0.5f,cpp(5,5));//表示花0.5秒,移动到坐标(5,5);
常用的CCActionInterval 子类可以分为三类:
第一类:简单的动作类:
CCMoveTo 移动到 CCMoveBy 按 ……移动 CCJumpTo 跳跃到 CCJumpBy 按……跳跃
CCBezierTo 贝兹移动到 CCBezierBy 按……贝兹移动到 CCRotateTo 旋转到 CCRotateBy按……旋转
CCScaleTo 缩放到 CCScaleBy 按……缩放 CCSkewTO 切变到 CCSkewBy按……切变
CCTintTo 颜色渐变到 CCTintBy 按……颜色渐变 CCFadeIn 从无到有,也叫淡入 CCFandeOut从有到无,也叫淡出
CCBlink 闪耀 CCFadeTo 改变不透明度到某个值 CCDelayTime 延时。
第二类:复杂的动作类:
CCAnimate 帧动画 CCGridAction家族 网格动画
第三类:组合
CCRepeat 重复执行几次 CCRepeatForever 永远执行
CCSequence 按序列执行 CCSpawn 同时执行
CCActionEase家族 补间动画
By为后缀的类,通常会支持反动作。所谓反动作,就是逆向的执行某一个动作。使用方法如下:
CCMoveBy *action1=CCMoveBy::create(2.0f,ccp(100,100));
CCActionInterval &action2=action1->reverse();
那么action2就是一个逆向执行ction1的操作,也可以直接由节点或子类执行。而以To为后缀的动作,通常是不支持反动作的。
组合
顺序动作序列:(CCSequence)
CCSequence,它的功能是把若干个动作按顺序组合在一起,然后依次执行,NULL是结束标志。
boolHelloWorld::init()
{
//////////////////////////////
// 1. super init first
if ( !CCLayer::init() )
{
returnfalse;
}
CCSprite *spr=CCSprite::create("Icon.png");
spr->setPosition(ccp(100,100));
this->addChild(spr,0,1);
CCLabelTTF *ttf=CCLabelTTF::create("顺序动作","宋体",50);
CCMenuItemLabel *label=CCMenuItemLabel::create(ttf,this,menu_selector(HelloWorld::menuCallback));
label->setPosition(ccp(0,80));
CCMenu *menu=CCMenu::create(label,NULL);
this->addChild(menu);
returntrue;
}
voidHelloWorld::menuCallback(CCObject *pScender)
{
CCSprite *spr=(CCSprite*)this->getChildByTag(1);
CCActionInterval *move=CCMoveTo::create(2,ccp(300, spr->getPositionY()));
CCActionInterval *scale=CCScaleTo::create(2,3);
CCActionInterval *rotate=CCRotateTo::create(4,190);//旋转
CCFiniteTimeAction *sep=CCSequence::create(move,scale,rotate,NULL);//顺序动作,一个一直的进行。
spr->runAction(sep);
((CCMenuItemLabel *)pScender)->setEnabled(false);
}
boolHelloWorld::init()
{
//////////////////////////////
// 1. super init first
if ( !CCLayer::init() )
{
returnfalse;
}
CCSprite *spr=CCSprite::create("Icon.png");
spr->setPosition(ccp(100,100));
this->addChild(spr,0, 1);
CCLabelTTF *ttf=CCLabelTTF ::create("同步动作","宋体",48);
CCMenuItemLabel *label=CCMenuItemLabel::create(ttf,this, menu_selector(HelloWorld::menuCallback));
label->setPosition(ccp(0,80));
CCMenu *menu=CCMenu::create(label,NULL);
this->addChild(menu);
returntrue;
}
voidHelloWorld::menuCallback(CCObject *pSender)
{
CCSprite *spr=(CCSprite*)this->getChildByTag(1);
CCActionInterval *move=CCMoveTo::create(5,ccp(300, spr->getPositionY()));//移动
CCActionInterval *scale=CCScaleTo::create(5,10);//放大。20中放到的倍数
CCActionInterval *rotate=CCRotateTo::create(4,190);//旋转。190是旋转的度数。
//同步执行这些动作
CCFiniteTimeAction *spwn=CCSpawn ::create(move,scale,rotate,NULL);//是按最长的时间去计算。
spr->runAction(spwn);
((CCMenuItemLabel*)pSender)->setEnabled(false);
}
重复动作;
重复动作类似于循环,可以重复执行某一个动作或者动作序列。重复动作有两种,第一种是重复有限次数的动作。CCRepeat可以按我们给定的次数重复执行动作。只需要将动作序列放入CCRepeat中,并且给定重复次数即可。 第二种重复动作是无限次数的重复动作。对应类为CCRepeatForever.它的功能是一直执行某一个动作或者动作序列。没有次数限制。使用方法和CCRepeat类似,唯一区别就是没有次数参数。
bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if ( !CCLayer::init() )
{
return false;
}
CCSprite *spr=CCSprite::create("Icon.png");
spr->setPosition(ccp(100,100));
this->addChild(spr,0,1);
CCLabelTTF *ttf=CCLabelTTF ::create("连续动作","宋体",24);
CCMenuItemLabel *label=CCMenuItemLabel::create(ttf,this, menu_selector(HelloWorld::menuCallback));
label->setPosition(ccp(0,80));
CCMenu *menu=CCMenu ::create(label,NULL);
this->addChild(menu);
return true;
}
voidHelloWorld::menuCallback(CCObject *pScender)
{
CCSprite *spr=(CCSprite*)this->getChildByTag(1);
CCActionInterval *move=CCMoveTo::create(2,ccp(300, spr->getPositionY()));
CCActionInterval *move2=CCMoveTo::create(2,ccp(100,100));
CCFiniteTimeAction *seq=CCSequence::create(move,move2,NULL);
//按我们给定的次数重复执行动作。
CCActionInterval *repeat=CCRepeat::create(seq,2);
spr->runAction(repeat);
//无限重复执行动作。
// CCActionInterval *repeatForever=CCRepeatForever::create((CCActionInterval*)seq);//
// spr->runAction(repeatForever);
((CCMenuItemLabel*)pScender)->setEnabled(false);//让按钮失效。pscender是参数是label.
}
- Cocos2d-x ——Action (动作)简介
- Cocos2d-x ——Action (动作)简介
- Cocos2d-x --Action (动作)
- cocos2d-x Action动作
- Cocos2d-x动作Action
- cocos2d-x Action:持续动作
- cocos2d-x Action:其他动作
- cocos2d-x 基本概念 动作 Action
- Cocos2d-x之动作Action
- Cocos2d-x 之动作 Action
- 菜鸟学习Cocos2d-x 3.x——浅谈动作Action
- 菜鸟学习Cocos2d-x 3.x——浅谈动作Action
- 菜鸟学习Cocos2d-x 3.x——浅谈动作Action
- 菜鸟学习Cocos2d-x 3.x——浅谈动作Action
- cocos2d-x action动作整理集合
- cocos2d-x action动作整理集合
- cocos2d-x Action:补间动作
- cocos2d-x action动作整理集合
- 测试上传1
- MapReduce实战--分析apatch日志访问页面大小
- ROS的文件系统
- git push error:not Signed-off-by author/committer/uploader
- linux下将ctrl+M替换为换行符
- Cocos2d-x ——Action (动作)简介
- JS弹出并拖动层效果
- HTTP协议详解(一)
- Linux环境进程间通信(二): 信号(上)
- java 中调用中科院分词系统
- shell脚本 监控mysql主从(主主)并发送189邮箱
- Linux工具大全_Libtool
- HTC手机解锁 root 刷机的各种问题
- scrollView自动定位问题