cocos2dx 3.1从零学习(五)——动画

动画是游戏中最重要的表现部分,本篇只是初步学习大部分动画的使用方法,没有什么原理性的东西,但是例子有很多,如果有不熟的地方要练一下。 特别是Spawn和Sequence的组合使用,什么时候使用Spawn,什么使用使用Sequence,怎么在它们之间相互嵌套对方。用光你的脑细胞尽力的去折磨这几个函数吧!做出尽可能多的绚丽的组合!

动画方法

动画的方法都在Node中,它的子类包括Layer、Sprite、MenuItem等。

runAction 启动动画

stopAction 停止动画

stopActionByTag 根据tag停止动画

……

动画原理

创建好动作animation,在需要执行动作的地方执行runAction来对其添加动画。

动画原理暂不做深入研究,后面做项目完善。

常用动画

Fade(In, Out)

Move(To,By)

Jump(To,By)

eg:

使某个精灵随机移动到屏幕上的某个点(注意均速运动)

游戏中有二级跳,如何实现

Blink 闪烁

Sequence 组合序列,动作依次执行,注意参数以NULL结尾。

DelayTime 延时执行

eg:

设计一动画序列,平移200后,延时1秒后再分4次跳回。

Rotate(To,By)围绕锚点(AnchorPoint)旋转

Scale(To,By)缩放动画,s为放大缩小比例

Spawn组合并行动画,动作同时执行,注意参数以NULL结尾

eg:

设计一动画,使背景旋转放大后充满屏幕

设计一动画序列,向前旋转移动300像素后,平移100,然后再跳跃100.

动画回调

CallFunc  与sequence组合使用

CallFuncN

eg:

4个精灵在中心位置先后移动到屏幕的4个角。

//4个精灵在中?位置先后移动到屏幕的4个?
void SecondaryJump:: FourSprites (cocos2d :: Ref * ref )
{
    auto act = Sequence :: create( MoveTo ::create (1, Point(10, 10)), CallFuncN ::create ([=]( Node * node ){
        sp5 ->runAction ( Sequence:: create (MoveTo :: create(1, Point (10, 630)), CallFuncN :: create([=]( Node * node ){
            sp6 ->runAction ( Sequence:: create (MoveTo :: create(1, Point (950, 630)), CallFuncN :: create([=]( Node * node ){
                sp7 ->runAction ( Sequence:: create (MoveTo :: create(1, Point (950, 10)), nullptr ));
            }), nullptr ));
        }), nullptr ));
    }), nullptr );
    sp4-> runAction (act );
}

动画回调加音效

     //动画回调
    auto callFunc = CallFuncN :: create([=]( Node * node )
    {
        node ->setVisible ( false);
    });

    auto act = Sequence :: create( Spawn ::create ( RotateTo:: create (2, 720), MoveBy :: create(2, Point (100, 0)), nullptr ),         MoveBy ::create (1, Point(100, 0)), JumpBy ::create (0.2f, Point(0, 0), 100, 1),  callFunc ,        CallFuncN ::create ([=]( Node * node ){                  CocosDenshion :: SimpleAudioEngine:: sharedEngine ()->playBackgroundMusic ( "music/game_music.wav", true );   }),
        nullptr );

    sp2-> runAction (act );

其他动画

循环动画

Repeat、RpeatForever

//实现一个菜单按钮的抖动。 像那种输入账号密码错误后,输入框抖动报错。

在MenuItem的回调函数中这样写,其实就是  左下 左上 右上 右下快速重复移动六次:

void SecondaryJump:: Jump (cocos2d :: Ref * ref )
{
    MenuItemFont * item = (MenuItemFont *) ref;
    auto repeatAct = Repeat :: create( Sequence ::create ( MoveBy:: create (0.01f, Point (3, 3)), MoveBy ::create (0.01f, Point(-3, -3)), MoveBy ::create (0.01f, Point(3, -3)), MoveBy ::create (0.01f, Point(-3, 3)), nullptr ), 6);
    item-> runAction (repeatAct );
}

帧动画Animate

贝塞尔曲线

void FrameAnimation:: Morning_0623 (cocos2d :: Ref * ref )
{
    auto animation = Animation :: create();
    for ( int i = 2; i <= 6; i ++)
    {
        String fileName = StringUtils:: format ("coc/characters_lowres/%d.0.png" , i);
        animation ->addSpriteFrameWithFileName ( fileName. getCString ());

    }
    animation-> setDelayPerUnit (0.05f);
    animation-> setLoops (-1);
    auto animate = Animate :: create( animation );

    auto pArr = PointArray :: create(5);
    pArr-> addControlPoint (Point (100, 0));
    pArr-> addControlPoint (Point (100, 200));
    pArr-> addControlPoint (Point (300,200));
    pArr-> addControlPoint (Point (300, 400));
    auto move = CardinalSplineBy :: create(5, pArr , 1);
    auto act = Spawn :: create( animate , move , nullptr);

    ccBezierConfig bezierCon ;
    bezierCon. controlPoint_1 =CCPointMake (200, 150); //控制点1
    bezierCon. controlPoint_2 =CCPointMake (200, 160); //控制点2
    bezierCon. endPosition =CCPointMake (540, 100); // 结束位置
    sp-> runAction (Spawn :: create( act , BezierBy :: create(3, bezierCon ), nullptr ));
}

eg:

屏幕上有10个精灵随机移动,精灵有相应的随机血量,相碰后血量少的精灵消失,最后只剩下最后一个精灵。(考虑精灵封装成Enemy类)

代码分析:我的代码中SpriteHW、SpriteHWT、AnimationHW这三个类。这道题的难度在于精灵碰撞检测后的删除。具体的可以参考AnimationHW的update。 使用C++自身的vector,没有在遍历的时候进行删除,而是标记删除。在检测碰撞完毕后再遍历一次vector对标记删除的元素进行删除。

关于精灵随机位置的问题,使用rand会有每次运行随机数都一样的问题,这里给它添加一个随机种子,只要在init()里面添加一句srand((unsigned)time(NULL));即可每次随机不一样的数字。

现在cocos2dx还没支持中文,我还没有找到好的unicode等转码的好的开源代码,能力有限不想自己写搞得代码很乱,囧。

代码压缩包下载地址:http://download.csdn.net/detail/hanbingfengying/7548925

代码SVN同步地址(如果哪天没有了,见谅,可能不续费了):https://www.svnchina.com/svn/lanou

cocos2dx 3.1从零学习(五)——动画

时间: 2025-01-09 01:05:10

cocos2dx 3.1从零学习(五)——动画的相关文章

cocos2dx 3.1从零学习(二)——菜单、场景切换、场景传值

回顾一下上一篇的内容,我们已经学会了创建一个新的场景scene,添加sprite和label到层中,掌握了定时事件schedule.我们可以顺利的写出打飞机的主场景框架. 上一篇的内容我练习了七个新场景,每一个场景都展示不同的东西,像背景定时切换.各种字体的随机颜色和位置等.每次要切换一个场景都要修改AppDelegate中的调用代码,非常的不方便查看,这一篇我们写场景的切换.每当我们创建一个新的场景的时候只要添加对应按钮到主界面,点击即可以切换过去查看对应的效果.这个有点类似官方提供的cppt

cocos2dx 3.1从零学习(三)——Touch事件(回调,反向传值)

第三讲 Touch 前面两篇我们学习的内容,足够我们做一款简单的小游戏.也可以说,我们已经入门了,可以蹒跚的走路了. 本篇将讲解cocos2dx中很重要的touch回调机制.你肯定记得第一章做定时器时间的时候用过CC_CALLBACK_1宏定义,它让我们回调一个只有一个形参的函数来执行定时操作. 回调函数的实现(Lambda表达式) 学习本篇前请仔细学习一下C++11的特性,std::function和lambda表达式.C++11还引入了很多boost库的优秀代码,使我们在使用的时候不必再加b

cocos2dx 3.1从零学习(一)——入门篇(一天学会打飞机)

我们有C++基础,学习引擎总是急于求成,想立马做出一款简单的游戏给朋友玩.但是我们往往看了很多资料却一直不知道如何下手去写,有时候只要能走出第一步我们就会游刃有余,但是眼高手低的我们不是大神,需要有人指引一下.这里我就写一下我是如何入门学习cocos2dx3.1的,给大家参考一下. 如果你想第一天就写出微信打飞机,请耐心去阅读.我也是一个菜鸟,博客难免粗糙和出错,请大家谅解.加油吧! 我们创建工程后总会自带一个HelloWorld类,短短的几行代码就出来了一个游戏的雏形,请问我们真的理解它了吗?

cocos2dx 3.1从零学习(六)——CocosStudio(VS2013工程导入及环境设置)

导入libCocosStudio.libExtensions.libGUI 新建的工程如下图: 添加现有项目 右键解决方案,如下操作: 分别添加以下三个项目: (工程路径)\cocos2d\cocos\ui\proj.win32\libGUI.vcxproj (工程路径)\cocos2d\cocos\editor-support\cocostudio\proj.win32\libCocosStudio.vcxproj (工程路径)\cocos2d\extensions\proj.win32\li

cocos2dx 3.1从零学习(四)——内存管理(错误案例分析)

本篇内容文字比较较多,但是这些都是建立在前面三章写代码特别是传值的时候崩溃的基础上的.可能表达的跟正确的机制有出入,还请指正. 如果有不理解的可以联系我,大家可以讨论一下,共同学习. 首先明确一个事实,retain和release是一一对应的,跟new和delete一样. 1.引用计数retain release 这里请参考一下引用计数的书籍,肯定说的比我讲的详细. 简单一点理解就是,对new的指针加一个计数器,每引用一次这块内存,计数就加1.在析构的时候减1,如果等于0的时候就delete这个

Unity3D游戏开发从零单排(五) - 导入CS模型到Unity3D

游戏动画基础 Animation组件 Animation组件是对于老的动画系统来说的. 老的动画形同对应的动画就是clip,每个运动都是一段单独的动画,使用Play()或CrossFade(),直接播放动画 或淡入淡出播放动画. animation.Play("name"); animation.CrossFade("name"); 下面的是它的几个属性 Animation:默认的动画片段: Aniamtions:包含的动画片段: Play Automaticall

es6从零学习(三):Class的基本用法

es6从零学习(三):Class的基本用法 一:定义一个类 //定义类 class Point { constructor(x, y) { this.x = x; this.y = y; } toString() { return '(' + this.x + ', ' + this.y + ')'; } } 上面代码定义了一个"类",可以看到里面有一个constructor方法,这就是构造方法,而this关键字则代表实例对象. Point类除了构造方法,还定义了一个toString方

cocos2d-x ios游戏开发初认识(五) CCsprite精灵类

这次写一下精灵创建的几种类型: 一.通过文件创建: 在原有的基础上添加如下代码: //一.通过文件创建精灵 CCSprite *bg =CCSprite::create("map.png"); CCSize winSize  =CCDirector::sharedDirector()->getWinSize(); //得到屏幕的尺寸 bg->setPosition(ccp(winSize.width/2, winSize.height/2)); this->addCh

【从零学习openCV】IOS7人脸识别实战

前言 接着上篇<IOS7下的人脸检測>,我们顺藤摸瓜的学习怎样在IOS7下用openCV的进行人脸识别,实际上非常easy,因为人脸检測部分已经完毕,剩下的无非调用openCV的方法对採集到的人脸样本进行训练,终于得到一个能够预測人脸的模型.可是当中的原理可谓是博大精深,因为快临最近末考试了,没时间去琢磨当中详细的细节,这次就先写个大概的demo,下次更新文章就得到6月20号之后了. 原理: 从OpenCV2.4之后,openCV增加了新的类FaceRecognizer,我们能够使用它便捷地进