動畫與動作,在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 是否是遞減索引
不信的話,可以看下這個函數的源代碼,
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
對於播放動畫,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
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++的寫法一樣,依次創建添加進去就可以了,非常方便~
以上就是全部內容了。