特效 (Effect)
自訂特效
建立特效檔案
首先我們要先建立一個特效的模組檔案,這個檔案引用 Effect
模組,並且必須要實作 effect:show() 的方法:
local Effect = require("Effect")
local MyEffect = {}
MyEffect.new = function(options)
local effect = Effect.new(options)
function effect:show()
end
return effect
end
return MyEffect
新增特效動畫
這裡用像素風格的動畫風格,它位於 pixel-effect 的 spriteshhet 中,建立動畫的方式很簡單,我們只要使用 Sprite.newAnimation()
方法即可,其中 name
為該動畫的名稱,frames
則為影格,time
則為整體播放時間,loopCount
為重複播放的次數,當它為 0
時表示重複播放。新增完後將它加入特效中:
local sprite = Sprite["pixelEffect"].newAnimation({
{
name = "start",
frames = {
"2/1",
"2/2",
"2/3",
"2/4",
"2/5",
"2/6",
},
time = 600,
loopCount = 0
}
})
self:insert(sprite)
播放動畫
播放動畫要先設定要播放的動畫名稱,接著使用 sprite:play()
播放:
sprite:setSequence("start")
sprite:play()
播放音效
如果特效有聲音,可以加入音效:
sfx:play("explosion2")
完整程式碼
--level.myLevel.MyEffect
local Effect = require("Effect")
local GameObject = require("GameObject")
local Sprite = require("Sprite")
local gameConfig = require("gameConfig")
local move = require("move")
local sfx = require("sfx")
local MyEffect = {}
MyEffect.new = function(options)
local effect = Effect.new(options)
function effect:show()
local sprite = Sprite["pixelEffect"].newAnimation({
{
name = "start",
frames = {
"2/1",
"2/2",
"2/3",
"2/4",
"2/5",
"2/6",
},
time = 600,
loopCount = 0
}
})
self:insert(sprite)
sprite.xScale = 5
sprite.yScale = 5
sprite:setSequence("start")
sprite:play()
sfx:play("explosion2")
end
return effect
end
return MyEffect
使用自訂的特效
要使用自訂的特效只需要將它引用,使用 Effect.new()
方法,帶入特效的持續時間以新增特效實體並加入場景之中。接著使用 effect:show()
方法 播放特效,特效會在時間結束後自行回收,你不需要特別去處理特效的回收。
--levels.myLevel.level_custom_effect
local gameConfig = require("gameConfig")
local Sublevel = require("Sublevel")
local MyEffect = require("levels.myLevel.MyEffect")
local util = require("util")
local myLevel = Sublevel.new("9999999-056", "custom effect", "author name", {duration = 1800})
function myLevel:addEffect(x)
local effect = MyEffect.new({ time = 500})
self:insert(effect)
--place the effect
effect.x = x
effect.y = -effect.height/2
effect:start()
effect:enablePhysics()
--move the effect with the stage speed
effect:setScaleLinearVelocity( 0, gameConfig.stageSpeed )
return effect
end
function myLevel:show(options)
self:addEffect(gameConfig.contentWidth*0.25)
self:addTimer(1000, function ()
self:addEffect(gameConfig.contentWidth*0.5)
end)
self:addTimer(1500, function ()
self:addEffect(gameConfig.contentWidth*0.75)
end)
self.enemy = enemy
end
return myLevel