【Cocos2d入门教程五】Cocos2d-x动作篇

本文详细介绍了Cocos2d-x中各种动作的使用方法,包括即时动作、持续动作、组合动作及速度变化等,并通过实例展示了如何实现翻转、移动、旋转、缩放、显示隐藏等常见效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

动作类(Action)是所有动作的基类,它创建的一个对象代表一个动作。动作作用于Node,包括继承于之下的Layer、Sprite。因此每个动作都需要由Node对象或者其继承者执行。动作类(Action)作为基类,实际上是一个接口,动作类的大多数实现类都派生于有限时间动作类(FiniteTimeAction)。其关系图如下:



在实际开发中我们通常用到两类动作-即时动作和持续动作,它们均继承于有限时间动作类。

1. 即时动作

  放置Place

  隐藏 Hide

  显示 Show

  可见切换ToggleVisibility

 

2.延时动作

  移动到MoveTo

  移动 MoveBy

  跳跃到JumpTo 

  跳跃JumpBy   

  贝塞尔BezierBy  

  放大到ScaleTo   设置放大倍数,是浮点型。

  放大ScaleBy

  旋转到RotateTo

  旋转RotateBy

  闪烁Blink   设定闪烁次数

  色调变化到TintTo

  色调变换TintBy

  变暗到FadeTo

  由无变亮FadeIn

  由亮变无FadeOut

 

3.组合动作

  序列 Sequence

  同步Spawn

  重复有线次数Repeate

  动作反向Reverse

  动画Animation

  无限重复RepeatForever

 

4.速度变化

  EaseIn 由慢至快。

  EaseOut 由快至慢

  EaseInOut 由慢至快再由快至慢。

  EaseSineIn 由慢至快。

  EaseSineOut 由快至慢

  EaseSineInOut 由慢至快再由快至慢。

  EaseExponentialIn 由慢至极快。

  EaseExponentialOut 由极快至慢。

  EaseExponentialInOut由慢至极快再由极快至慢。

  Speed 人工设定速度,还可通过SetSpeed不断调整

下面以几个常用函数作为案例:

    Menu * menu =Menu::create();
    
    menu ->setPosition(Vec2::ZERO);
    
    addChild(menu);
    
    //-----------------------------------------------------------------------
    //Flip
    MenuItemFont * FlipItem =MenuItemFont::create("Filp",CC_CALLBACK_1(NewScene::bgFlip, this));
    
    FlipItem ->setPosition(60,350);
    
    menu->addChild(FlipItem);
    
    
    void NewScene::bgFlip(Ref * ref)
    {
        if (testSp ->isFlippedX())
        {
            
            FlipX * fx = FlipX ::create(false);
            
            testSp ->runAction(fx);
            
        }
        else
        {
            
            FlipX * fx = FlipX ::create(true);
            
            testSp ->runAction(fx);
        }
    }
    
    
    //-----------------------------------------------------------------------
    //MoveTo
    MenuItemFont * MoveItem =MenuItemFont::create("MoveTo",CC_CALLBACK_1(NewScene::bgMove, this));
    
    MoveItem ->setPosition(60,300);
    
    menu->addChild(MoveItem);
    
    
    void NewScene::bgMove(Ref* psend)
    {
        MoveTo * moveAct = MoveTo::create(0.5,Vec2(400, 400));
        
        testSp ->runAction(moveAct);
    }
    
    
    
    //-----------------------------------------------------------------------
    //RatateTo
    MenuItemFont * RotateItem =MenuItemFont::create("RotateTo",CC_CALLBACK_1(NewScene::bgRotate, this));
    
    RotateItem ->setPosition(60,250);
    
    menu->addChild(RotateItem);
    
    
    
    void NewScene::bgRotate(Ref * ref)
    {
        RotateTo * rotate =RotateTo::create(0.5, 100, 100);
        
        testSp ->runAction(rotate);
    }
    
    
    
    
    //-----------------------------------------------------------------------
    //ScaleTo
    MenuItemFont * ScaleItem =MenuItemFont::create("ScaleTo",CC_CALLBACK_1(NewScene::bgScale, this));
    
    ScaleItem ->setPosition(60,200);
    
    menu->addChild(ScaleItem);
    
    
    void NewScene::bgScale(Ref* psend)
    {
        ScaleTo * scale =ScaleTo::create(0.5, 2);
        
        testSp ->runAction(scale);
    }
    
    
    
    //-----------------------------------------------------------------------
    //Hide Show
    MenuItemToggle * toggleMenu =MenuItemToggle::createWithCallback(
                                                                    CC_CALLBACK_1(NewScene::bgToggle,this),
                                                                    MenuItemFont::create("Show"),
                                                                    MenuItemFont::create("Hide"),
                                                                    NULL);
    
    toggleMenu ->setPosition(60,150);
    
    menu ->addChild(toggleMenu);
    
    
    void NewScene::bgToggle(Ref * ref)
    {
        if(testSp->isVisible())
        {
            Hide * hide =Hide::create();
            testSp ->runAction(hide);
            ShowTag =0;
        }
        else
        {
            Show * show =Show ::create();
            testSp ->runAction(show);
            ShowTag =1;
        }
        
    }
    
    
    
    //-----------------------------------------------------------------------
    //FadeIn FadeOut
    MenuItemToggle * FadeToggle =MenuItemToggle::createWithCallback(
                                                                    CC_CALLBACK_1(NewScene::FadeToggle,this),
                                                                    MenuItemFont::create("FadeIN"),
                                                                    MenuItemFont::create("FadeOut"),
                                                                    NULL);
    
    FadeToggle ->setPosition(60,100);
    
    menu ->addChild(FadeToggle);
    
    
    void NewScene::FadeToggle(Ref * ref)
    {
        if(FadeTag == 1)
        {
            FadeOut *  FadeOut = FadeOut ::create(1);
            
            testSp ->runAction(FadeOut);
            
            FadeTag = 0;
        }
        else if (FadeTag == 0)
        {
            FadeIn * FadeIn = FadeIn ::create(1);
            
            testSp ->runAction(FadeIn);
            
            FadeTag = 1 ;
        }
        
    }
    
    
    //-----------------------------------------------------------------------
    //曲线运动
    MenuItemFont * Cardin =MenuItemFont::create("Cardin",CC_CALLBACK_1(NewScene::CardIn, this));
    
    Cardin ->setPosition(60,50);
    
    menu->addChild(Cardin);
    
    
    void NewScene::CardIn(Ref * ref)
    {
        PointArray  * array = PointArray ::create(20);
        
        array ->addControlPoint(Point(100,100));
        
        array ->addControlPoint(Point(200,400));
        
        array ->addControlPoint(Point(300,500));
        
        CardinalSplineTo * CardIn = CardinalSplineTo::create(1, array, 5);
        
        testSp ->runAction(CardIn);
    }
注意:这里需要注意To跟By的不同,To的话在坐标系中是以绝对位置,By的话在坐标系中是以node对象的相对位置进行执行动作。

如果你想搭配reverse()一起用的话用To是无效的,必须用By.


Ok.关于Cocos2d-x的动作就分享至此。不对的地方还望指出互相探讨学习

(译)cocos2d里面如何用texture picker和像素格式来优化spritesheet.pdf (译)在cocos2d里如何制作各种按钮.pdf (译)如何使用cocos2d制作基于tilemap的游戏教程 第一部分.pdf (译)如何在cocos2d里面使用动画和spritesheet.pdf (译)如何用cocos2d制作iphone游戏:旋转炮塔.pdf (译)如何用cocos2d制作iphone游戏:更猛的怪物和更多得管卡.pdf (译)如何使用cocos2d制作一个Slide Image Game:第一部分.pdf (译)如何使用cocos2d来制作一个塔防游戏:第一部分.pdf cocos2d 2.0 添加遮罩.pdf iOS Code Signing解惑.pdf iPhone上面的现实增强(Augmented Reality)入门教程.pdf OpenGL ES2.0 – Iphone开发指引.pdf OpenGLES2.0 Iphone开发指引:第二部分,纹理贴图.pdf 使用cocos2d和box2d制作滚动背景.pdf 加入敌人和战斗:如果使用cocos2d制作基于tiled地图的游戏:第三部分.pdf 在cocos2d里面如何使用物理引擎box2d:弹球.pdf 在cocos2d里面如何拖拽精灵.pdf 如何使用box2d来做碰撞检测(且仅用来做碰撞检测).pdf 如何使用CCRenderTexture来创建动态纹理.pdf 如何使用cocos2d1.0来给sprite添加Mask(遮罩).pdf 如何使用cocos2d制作一个塔防游戏:引子.pdf 如何使用cocos2d制作一个太空射击游戏.pdf 如何使用cocos2d制作一个打地鼠的游戏:(第二部分。完).pdf 如何使用cocos2d和box2d来制作一个Breakout游戏:第一部分.pdf 如何使用cocos2d和box2d来制作一个Breakout游戏:第二部分(完).pdf 如何使用cocos2d来制作一个打地鼠的游戏:第一部分.pdf 如何使用GameCenter制作一个简单的多人游戏教程:第一部分.pdf 如何使用GameCenter制作一个简单的多人游戏教程:第二部分.pdf 如何使用NSCoding和NSFileManager来保存你的应用程序数据.pdf 如何制作一个类似tiny wings的游戏:第一部分.pdf 如何制作一个类似tiny wings的游戏:第二部分(完).pdf 如何升级你的cocos2d版本.pdf 如何学好Iphone开发.pdf 如何查找资料.pdf 碰撞检测和收集物品:如何使用cocos2d制作基于tiled地图的游戏:第二部分.pdf (译)cocos2d精灵教程:第一部分.pdf (译)cocos2d精灵教程:第三部分.pdf (译)cocos2d精灵教程:第二部分.pdf (译)cocos2d菜单教程:第一部分.pdf (译)cocos2d菜单教程:第三部分(完).pdf (译)cocos2d菜单教程:第二部分.pdf (译)使用cocos2d和box2d来制作一个platformer游戏.pdf (译)如何使用cocos2d制作一个塔防游戏:第三部分.pdf (译)如何使用cocos2d制作一个塔防游戏:第二部分.pdf (译)如何使用cocos2d制作一个塔防游戏:第四部分(完).pdf (译)如何使用cocos2d制作一个滑动图片游戏教程:第二部分(完).pdf (译)如何用cocos2d制作一款简单的iphone游戏(第一部分).pdf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值