
AI.lua是我所設計的lua extension。其主要用途是將LuaGraph與FSM結合在一起。在FSM中,每一個state都會註冊一個node至graph之中。設定State與State之間的轉換關係的同時也會將node與node之間的edge註冊至graph之中。程式人員或企畫人員在編輯FSM腳本時,可以利用lua物件導向的方式,override掉之前的函式,創造出不一樣的功能。利用AI module,程式人員或企畫人員可以自己編寫AI script。由於lua非常彈性,我們可以針對特定的state改寫其中的member function。甚至我們也可以任意制訂object的屬性,讓企畫人員馬上實現他們的想法。
載入AI script之後,Simone會產生新的child window並且畫出FSM圖。在Simone下方有一個文字輸入欄位,這欄位可即時輸入script指令來改變FSM的狀態。此外,Simone preference可以設定PNG檔案輸出位置與State之顏色等。
script sample
local AI = require 'AI'
function CreateAI()
local o = AI.NewObject('basic')
-- create the attribute of the object for display
o.attr={
hp={name='HP',value=100},
-- add new attribute for you wanted
}
-- create states
local idle = AI.NewState(o,'idle')
local patrol = AI.NewState(o,'patrol')
local normal = AI.NewState(o,'normal')
-- add variables to state
idle.timer = 0
patrol.timer = 0
-- override function
function idle:OnEnter(previous)
idle.timer = 0
end
-- state event
local function onAttack(state)
local hp = state:GetObject().attr.hp
hp.value = hp.value - 10
state:Transit(normal)
end
idle:AddEvent(normal, onAttack, 'is attacked', 'attack')
idle:AddEvent(normal, onAttack, 'is alerted', 'alert')
-- condition
local function gotoPatrol(state, deltaTime)
state.timer = state.timer+deltaTime
if (state.timer>3000) then
return true
end
return false
end
idle:Connect(patrol, gotoPatrol, 'idle>3sec')
-- override function
function patrol:OnEnter(previous)
patrol.timer = 0
end
-- condition
local function gotoIdle (state, deltaTime)
state.timer = state.timer+deltaTime
if (state.timer>5000) then
return true
end
return false
end
patrol:Connect(idle, gotoIdle, 'patrol>5sec')
local function pass() return true end
normal:Connect(idle, pass)
o:SetState(idle)
return o
end
沒有留言:
張貼留言