cocos2d:——第七节:动作

简介:

cocos2d中为了让游戏画面动起来,有两种方法,一是直接修改属性,例如位置,大小,旋转,等。另外一种就是使用动作。
cocos2d提供了丰富的动作类,这些动作类分为瞬时动作,持续动作,复合动作和速度变化等。
Action是动作类的基类,所有的动作都派生这个类,它创建的一个对象代表一个动作,动作用于Node,因为,任何一个动作都需要由Node对象来执行。

一个简单示例:

bool ActionScene::init()
{
    if (!Layer::init()) {
        return false;
    }
    //获取屏幕的大小的尺寸
    size = Director::getInstance()->getVisibleSize();
    //获取一个监听者
    auto listener = EventListenerTouchOneByOne::create();
    //注册监听的回调函数
    listener->onTouchBegan = CC_CALLBACK_2(ActionScene::onTouchBegan,this);
    //注册监听器到当前节点
    _eventdispatcher->addEventListenerWithSceneGraPHPriority(listener,this);
    
    auto bg = Sprite::create("bg.jpg");
    bg->setPosition(size.width/2,size.height/2);
    auto sx = size.width/bg->getContentSize().width;
    auto sy = size.height/bg->getContentSize().height;
    bg->setScale(sx,sy);
    
    ico = Sprite::create("ico.jpg");
    ico->setPosition(size.width/2,size.height/2);
    
    
    this->addChild(bg);
    this->addChild(ico);
    
    return true;
}
//这是点击动作的回调方法,最终的效果是,点一下屏幕,就开始移动
bool ActionScene::onTouchBegan(cocos2d::Touch *touch,cocos2d::Event *unused_event)
{
    //创建一个移动的动作,第一个参数是duration,就是时间,这里为1s,第二个参数是一个点,要移动到的点
    //这里的意思是在1s内移动到坐标为(100,200)
    auto move = Moveto::create(1,Point(100,200));
    //开始执行动作
    ico->runAction(move);
    return false;
}


瞬时动作:

是指立刻就能完成的动作,是FiniteTimeAction中动作持续时间为0的特例,就是说,这个动作会在下一帧立刻完成,如设置位置,设定缩放等。这些动作本来可以通过为属性赋值来完成,但封装成动作以后,可以与其它动作一起组合成复杂的动作。
详情,可以看代码

//
void ActionScene::testPlace()
{
    //该动作可以将节点移动到一个指定的点,瞬间完成
    auto place = Place::create(Point(100,100));
    //开始执行动作
    ico->runAction(place);
}
void ActionScene::testFlip()
{
    //创建一个沿X轴镜面反转的动作
    auto flipX = FlipX::create(true);
    //创建一个沿Y轴镜面反转的动作
    auto fileY = FlipY::create(true);
    
    ico->runAction(fileY);
    
}
void ActionScene::testShowHide()
{
    //创建一个显示的动作
    auto show = Show::create();
    //创建一个隐藏的动作
    auto hide = Hide::create();
    
    //已经在头文件里声明了一个变量,用于判断,达到点一下隐藏,再点一下出现的效果
    if(count%2==0){
        ico->runAction(show);
    }else{
        ico->runAction(hide);
    }
    count++;
}

持续性动作:

是在持续的一段时间里逐渐完成的动作,如精灵从一个占连续地移动到另一个点,与瞬时动作相比,持续性动作的种类更加丰富,由于这些动作将持续一段时间,一般都有一个用于控制时间的时间参数duration。

to与by:
每一种持续性动作都分两种,分别具有To和By后缀,to动作描述了节点值的绝对变化,例如moveto将对象移动到一个指定的位置,by的动作,刚是一个相对变化,moveBy将对象移动一段相对位移。

分类
位置变化动作
属性变化动作
视觉特效动作
控制动作

位置变化动作:

直线运动:

//测试moveBy动作的方法
void ActionScene::testMoveBy(){
    //创建一个moveBy动作,第一个参数是移动时间,第二个参数是要移动到的相对位置
    auto moveby = MoveBy::create(5,100));
    ico->runAction(moveby);
}
//测试moveto动作的方法
void ActionScene::testMoveto(){
    //创建一个moveto动作,第一个参数是移动时间,第二个参数是要移动到的点
    auto moveto = Moveto::create(5,100));
    ico->runAction(moveto);
}

按一定的轨迹跳跃到指定的位置:

//测试jumpBy的方法
void ActionScene::testJumpTo(){
    //创建一个jumpTo动作,第一个参数是时间,第二个参数是跳跃到的点,第三个参数是跳跃最大高度,第四个参数是跳跃次数
    auto jumpto = JumpTo::create(5,100),30,3);
    ico->runAction(jumpto);
}
//测试jumpTo的方法
void ActionScene::testJumpBy(){
    //创建一个jumpTo动作,第一个参数是时间,第二个参数是跳跃的点,第三个参数是跳跃最大高度,第四个参数是跳跃次数
    auto jumpby = JumpBy::create(5,3);
    ico->runAction(jumpby);
}

贝赛尔曲线移动:

void ActionScene::testBezierBy(){
    //先创建一个ccBezierConfig结构体
    ccBezierConfig bezier;
    //设置控制点1
    bezier.controlPoint_1 = Point(20,150);
    //设置控制点2
    bezier.controlPoint_2 = Point(200,30);
    //设置终点
    bezier.endPosition = Point(160,30);
    //创建动作,第一个参数是时间,第二个是ccBezierConfig结构体
    auto bezierBy = BezierBy::create(5,bezier);
    ico->runAction(bezierBy);
}
void ActionScene::testBezierTo(){
    //先创建一个ccBezierConfig结构体
    ccBezierConfig bezier;
    //设置控制点1
    bezier.controlPoint_1 = Point(20,30);
    //创建动作,第一个参数是时间,第二个是ccBezierConfig结构体
    auto bezierTo = BezierTo::create(5,bezier);
    ico->runAction(bezierTo);
}


属性变化动作:

改变大小:

//测试ScaleBy的方法
void ActionScene::testScaleBy(){
    //构造一个scaleBy方法,第一个参数是动作时间,第二个参数是大小倍数,这里是缩小到原来的一半
    //第二个参数,如果大于1,就表示放大
    //构造方法有多个,参数不一样,有的是设置x,y,z轴的缩放倍数
    auto scaleBy = ScaleBy::create(3,0.5);
    ico->runAction(scaleBy);
}
//测试Scaleto方法
void ActionScene::testScaleto(){
    //构造一个scaleBy方法,第一个参数是动作时间,第二个参数是大小倍数,这里是缩小到原来的一半大小
    //构造方法有多个,参数不一样,有的是设置x,z轴的缩放倍数
    auto scaleto = Scaleto::create(3,0.5);
    ico->runAction(scaleto);
}

旋转:

//测试rotateto方法
void ActionScene::testRotateto(){
    //创建一个rotateto动作,第一个参数是时间,第二个参数是旋转角度
    //这里是使用节点在5秒内旋转180度
    //也有其它参数的构造方法,比如设置x,y轴等
    auto rotateto = Rotateto::create(5,180);
    ico->runAction(rotateto);
}
//测试rotateBy的方法
void ActionScene::testRoteteBy(){
    //创建一个rotateto动作,第一个参数是时间,第二个参数是旋转角度
    //这里是使用节点在5秒内旋转180度
    //也有其它参数的构造方法,比如设置x,y轴等
    auto rotateBy = RotateBy::create(5,180);
    ico->runAction(rotateBy);
}

淡入淡出的效果

//测试fadeIn的方法
void ActionScene::testFadeIn(){
    //淡入,参数表示时间,这里是5秒
    auto fadeIn = FadeIn::create(5);
    ico->runAction(fadeIn);
}
//测试fadeOut的方法
void ActionScene::testFadeOut(){
    //淡出,参数表示时间
    auto fadeOut = FadeOut::create(5);
    ico->runAction(fadeOut);
}


色调的变化:

//测试色调tintBy的方法
void ActionScene::testTintBy(){
    //创建色调动作,第一个参数是时间,后面三个分别是rgb颜色值
    auto tintBy = TintBy::create(3,100,100);
    ico->runAction(tintBy);
}
//测试色调tintTo的方法
void ActionScene::testTintTo(){
    //创建色调动作,第一个参数是时间,后面三个分别是rgb颜色值
    auto tintTo = TintTo::create(3,100);
    ico->runAction(tintTo);
}

视觉特效动作:

闪烁动作:
//测试闪烁动作的方法
void ActionScene::testBlink(){
    //创建一个闪烁的动作,第一个参数是闪烁的时间,第二个参数是闪烁次数
    //这里是,在5秒内闪烁10次
    auto blink = Blink::create(5,10);
    ico->runAction(blink);
}

动画:

//测试动画效果
void ActionScene::testAnimation(){
    //先把动画图片存储进精灵帧缓存
    SpriteFrameCache::getInstance()->addSpriteFramesWithFile("grossini-aliases.plist");
    //声明一个精灵侦的向量集合
    Vector<SpriteFrame*> frames;
    //一个for循环,取出图片里面包含的精灵帧
    for (int i=1; i<=14; i++) {
        //取出一帧的名字,后面是一个图片名字表达式
        __String *frame_name = __String::createWithFormat("grossini_dance_%02i.png",i);
        //利用帧的名字,从缓存中取出这一帧的指针
        SpriteFrame *frame = SpriteFrameCache::getInstance()->getSpriteFrameByName(frame_name->getCString());
        //把这一帧压进精灵帧的集合
        frames.pushBack(frame);
    }
    //根据精灵帧建立一个动画,第一个参数是精灵帧的集合,第二个参数是帧与帧之间的延迟时间
    Animation* anim = Animation::createWithSpriteFrames(frames,1.0f/24.0f);
    //运行动画
    ico->runAction(Animate::create(anim));
}

控制动作与顺序执行动作:

这是一类特殊的动作,用于对一些动作进行精确地控制,利用这一类动作,可以实现一些非常实用的功能 ,因为它们是十分有用的,这类动作包括DealyTime,Repeat和RepeatForever等。DelayTime可以将动作延迟一定的时间执行,Repeat可以重复一定的次数,RepeatForever可以使一个动作不断重复下去,下面是代码


void ActionScene::testControlAction(){
    //创建一个moveBy动作
    auto moveBy = MoveBy::create(2,20));
    //这也是一个动作,这表示moveBy动作返回执行
    auto r = moveBy->reverse();
    //这是一个延迟时间,参数的延迟的时间
    auto delayTime = DelayTime::create(3);
    
    //一个动作的集合,参数可以添加多个动作,最后以NULL结束
    //它会顺序执行这些动作,先执行第一个,然后第二个……
    auto sequence = Sequence::create(moveBy,r,delayTime,NULL);
    //创建一个重复,第一个参数是动作集合,第二个参数是重复次数
    auto repeat = Repeat::create(sequence,2);
    //创建一个永久重复,只需要添加动作就可以了
    auto repeatForever = RepeatForever::create(sequence);
    
    //执行动作
    ico->runAction(repeat);
}

并列执行一些动作:

void ActionScene::testSpawnAction(){
    //创建一个moveBy动作
    auto moveBy = MoveBy::create(2,20));
    
    
    //先把动画图片存储进精灵帧缓存
    SpriteFrameCache::getInstance()->addSpriteFramesWithFile("grossini-aliases.plist");
    //声明一个精灵侦的向量集合
    Vector<SpriteFrame*> frames;
    //一个for循环,取出图片里面包含的精灵帧
    for (int i=1; i<=14; i++) {
        //取出一帧的名字,后面是一个图片名字表达式
        __String *frame_name = __String::createWithFormat("grossini_dance_%02i.png",1.0f/24.0f);
    
    
    //一个动作的集合,参数可以添加多个动作,最后以NULL结束
    //它会并列执行这些动作,所有的动作,同时执行
    auto spawn = Spawn::create(moveBy,Animate::create(anim),NULL);
    
    //执行动作,这里,它会一边播放动画,一边移动
    ico->runAction(spawn);
}

动作的速度控制:

1:speed
可能 线性地改变动作的速度,可以成倍在实现快放或者慢放。

2:ActionEase
它是一些效果的封装。它包括了15个动作,可以概括为5类,如下图所示:


代码如下:

//测试速度的方法
void ActionScene::testSpeed(){
    //创建一个move动作,时间是5秒
    auto moveto = Moveto::create(5,100));
    //创建一个速度控制,第一个参数是一个动作,第二个参数是速度的倍数,这里把动作提高到5倍
    auto speed = Speed::create(moveto,5);
    
    
    
    //创建其它速度控制的方法是一样的,这里一并写下来
    
    auto easeIn = EaseIn::create(moveto,5);
    
    
    //动行动作
    ico->runAction(speed);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建
2019独角兽企业重金招聘Python工程师标准>>>cocos2d2.0之后加入了一种九宫格的实现,主要作用是用来拉伸图片,这样的好处在于保留图片四个角不变形的同时,对图片中间部分进行拉伸,来满足一些控件的自适应(PS: 比如包括按钮,对话框,最直观的形象就是ios里的短信气泡了),这就要求图
原文链接:http://www.cnblogs.com/linji/p/3599478.html1.环境和工具准备Win7VS2010/2012,至于2008v2版本之后似乎就不支持了。 2.安装pythonv.2.0版本之前是用vs模板创建工程的,到vs2.2之后就改用python创建了。到python官网下载版本2.7.5的,然后
环境:ubuntu14.04adt-bundle-linux-x86_64android-ndk-r9d-linux-x86_64cocos2d-x-3.0正式版apache-ant1.9.3python2.7(ubuntu自带)加入环境变量exportANDROID_SDK_ROOT=/home/yangming/adt-bundle-linux/sdkexportPATH=${PATH}:/$ANDROID_SDK_ROOTools/export
1开发背景游戏程序设计涉及了学科中的各个方面,鉴于目的在于学习与进步,本游戏《FlappyBird》采用了两个不同的开发方式来开发本款游戏,一类直接采用win32底层API来实现,另一类采用当前火热的cocos2d-x游戏引擎来开发本游戏。2需求分析2.1数据分析本项目要开发的是一款游
原文链接:http://www.cnblogs.com/linji/p/3599912.html//纯色色块控件(锚点默认左下角)CCLayerColor*ccc=CCLayerColor::create(ccc4(255,0,0,128),200,100);//渐变色块控件CCLayerGradient*ccc=CCLayerGradient::create(ccc4(255,0,0,
原文链接:http://www.cnblogs.com/linji/p/3599488.html//载入一张图片CCSprite*leftDoor=CCSprite::create("loading/door.png");leftDoor->setAnchorPoint(ccp(1,0.5));//设置锚点为右边中心点leftDoor->setPosition(ccp(240,160));/
为了答谢广大学员对智捷课堂以及关老师的支持,现购买51CTO学院关老师的Cocos2d-x课程之一可以送智捷课堂编写图书一本(专题可以送3本)。一、Cocos2d-x课程列表:1、Cocos2d-x入门与提高视频教程__Part22、Cocos2d-x数据持久化与网络通信__Part33、Cocos2d-x架构设计与性能优化内存优
Spawn让多个action同时执行。Spawn有多种不同的create方法,最终都调用了createWithTwoActions(FiniteTimeAction*action1,FiniteTimeAction*action2)方法。createWithTwoActions调用initWithTwoActions方法:对两个action变量初始化:_one=action1;_two=action2;如果两个a
需要环境:php,luajit.昨天在cygwin上安装php和luajit环境,这真特么是一个坑。建议不要用虚拟环境安装打包环境,否则可能会出现各种莫名问题。折腾了一下午,最终将环境转向linux。其中,luajit的安装脚本已经在quick-cocos2d-x-develop/bin/中,直接luajit_install.sh即可。我的lin
v3.0相对v2.2来说,最引人注意的。应该是对触摸层级的优化。和lambda回调函数的引入(嗯嗯,不枉我改了那么多类名。话说,每次cocos2dx大更新。总要改掉一堆类名函数名)。这些特性应该有不少人研究了,所以今天说点跟图片有关的东西。v3.0在载入图片方面也有了非常大改变,仅仅只是