quick-cocos2d-x遊戲開發【8】——動畫與動作

動畫與動作,在quick中都有對其封裝,所以我們還是來看一下吧。

總的來說,對於幀動畫,quick封裝的方法我們可以經常使用,這是非常方便的,下面直接上代碼來直觀感受下,

比如,14張幀圖片,採用cocos2d-x lua的方法來寫是這樣的,

 local sp = display.newSprite("grossini_dance_01.png", display.cx, display.cy)
    self:addChild(sp)
    
    local animation = CCAnimation:create()
    local number, name
    for i = 1, 14 do
        if i < 10 then
            number = "0"..i
        else
            number = i
        end
        name = "grossini_dance_"..number..".png"
        animation:addSpriteFrameWithFileName(name)
    end

    animation:setDelayPerUnit(2.8 / 14.0)

    local action = CCAnimate:create(animation)
    sp:runAction(action)

需要將其每一幀添加到CCAnimation中,和C++使用是一樣的,但是quick的用法就是這樣子的了,

 display.addSpriteFramesWithFile("hero.plist", "hero.png") --添加幀緩存

    local sp = display.newSprite("#grossini_dance_01.png", display.cx, display.cy)
    self:addChild(sp)
    local frames = display.newFrames("grossini_dance_%02d.png", 1, 14)
    local animation = display.newAnimation(frames, 2.8/14.0)
    sp:playAnimationOnce(animation)

display.newFrames(pattern, begin, length, isReversed)的各個參數的意義是,

  • string pattern 模式字符串
  • integer begin 起始索引
  • integer length 長度
  • boolean isReversed 是否是遞減索引
此外注意的是,newFrames裏面的圖片名稱一定是幀緩存裏面的圖片名稱,所以換句話說,我們之前需要將圖片們用圖片打包工具處理下,如果是採用多個單張圖片的形式,肯定是不行的,可以想到,我們後期圖片肯定都是採用圖片打包工具處理的,所以quick就直接封裝了這個方法。

不信的話,可以看下這個函數的源代碼,

function display.newFrames(pattern, begin, length, isReversed)
    local frames = {}
    local step = 1
    local last = begin + length - 1
    if isReversed then
        last, begin = begin, last
        step = -1
    end

    for index = begin, last, step do
        local frameName = string.format(pattern, index)
        local frame = sharedSpriteFrameCache:spriteFrameByName(frameName)
        if not frame then
            printError("display.newFrames() - invalid frame, name %s", tostring(frameName))
            return
        end

        frames[#frames + 1] = frame
    end
    return frames
end


直接是調用spriteFrameByName函數。


對於播放動畫,quick給Sprite精靈類提供了兩個函數,

function Sprite:playAnimationOnce(animation, removeWhenFinished, onComplete, delay)
    return transition.playAnimationOnce(self, animation, removeWhenFinished, onComplete, delay)
end

function Sprite:playAnimationForever(animation, delay)
    return transition.playAnimationForever(self, animation, delay)
end

一個是播放動畫一次,一個是永久播放動畫。好用!


以上就是動畫的用法,接下來我們再看關於動作的使用,

動作封裝的類是transition,其中提供了這些函數,

transition.newEasing(action, easingName, more)
爲圖像創造效果
transition.execute(target, action, args)
執行一個動作效果
transition.rotateTo(target, args)
將顯示對象旋轉到指定角度,並返回 CCAction 動作對象。
transition.moveTo(target, args)
將顯示對象移動到指定位置,並返回 CCAction 動作對象。
transition.fadeTo(target, args)
將顯示對象的透明度改變爲指定值,並返回 CCAction 動作對象。
transition.scaleTo(target, args)
將顯示對象縮放到指定比例,並返回 CCAction 動作對象。
transition.sequence(actions)
創建一個動作序列對象。
transition.playAnimationOnce(target, animation, removeWhenFinished, onComplete, delay)
在顯示對象上播放一次動畫,並返回 CCAction 動作對象。

在我用來,我覺得像move,scale,fade這些單一的動作,我們用原生lua提供的那些就可以了,還容易被記住和使用,比如移動就使用CCMoveTo,還是挺好的。不過quick封裝的個人覺得很不錯的是,

transition.execute(target, action, args)

transition.sequence(actions)

這兩個,爲啥呢,接着看,


transition.execute() 是一個強大的工具,可以爲原本單一的動作添加各種附加特性。

transition.execute() 的參數表格支持下列參數:

  • delay: 等待多長時間後開始執行動作
  • easing: 緩動效果的名字及可選的附加參數,效果名字不區分大小寫
  • onComplete: 動作執行完成後要調用的函數
  • time: 執行動作需要的時間

transition.execute() 支持的緩動效果:

  • backIn
  • backInOut
  • backOut
  • bounce
  • bounceIn
  • bounceInOut
  • bounceOut
  • elastic, 附加參數默認爲 0.3
  • elasticIn, 附加參數默認爲 0.3
  • elasticInOut, 附加參數默認爲 0.3
  • elasticOut, 附加參數默認爲 0.3
  • exponentialIn, 附加參數默認爲 1.0
  • exponentialInOut, 附加參數默認爲 1.0
  • exponentialOut, 附加參數默認爲 1.0
  • In, 附加參數默認爲 1.0
  • InOut, 附加參數默認爲 1.0
  • Out, 附加參數默認爲 1.0
  • rateaction, 附加參數默認爲 1.0
  • sineIn
  • sineInOut
  • sineOut
這個函數可以完成運動中的速度效果,以及CCCallFunc,CCDelayTime等功能,將其附加在一起,就不用寫繁瑣的函數嵌套和CCSequence了。廖大真是寫到我的心坎裏去了。像這樣,

transition.execute(sprite, CCMoveTo:create(1.5, CCPoint(display.cx, display.cy)), {
    delay = 1.0,
    easing = "backout",
    onComplete = function()
        print("move completed")
    end,
})

transition.sequence也是一個方便的函數,如果要是以前,對於多個動作依次執行,咱們得這樣,

 local move1  = CCMoveBy:create(1, ccp(250,0))
    local move2  = CCMoveBy:create(1, ccp(0,50))
    local array  = CCArray:createWithCapacity(2)
    array:addObject(move1)
    array:addObject(move2)
    local seq = CCSequence:create(array)

要把每個動作裝在數組裏面,然後才能創建一個CCSequence,而現在呢,

local sequence = transition.sequence({
        CCMoveBy:create(1, ccp(250,0)),
        CCMoveBy:create(1, ccp(0,50))
    })

直接和C++的寫法一樣,依次創建添加進去就可以了,非常方便~


以上就是全部內容了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章