code style

8/03/2007

愛心結緣義賣書展

610大姊姊那邊看到的

鄭豐喜基金會2007年公益活動『愛心結緣全面五折義賣書展

96年8月09日(四)~8月26日(日) 11:00 AM ~ 09:30 PM
會場: 統一元氣館~2樓、4樓(台北車站正對面、前大亞百貨)

最近很閒 應該會過去逛逛吧

8/02/2007

Simone

取自電影「Simone」,全名是Simulator One。這個工具的主要目標是利用script來編輯FSM,並且產生FSM示意圖以供參考。除此之外,透過即時編譯執行,我們可以立刻模擬FSM的行為,同時驗證script的正確性。此工具使用的腳本語言為Lua,產生FSM示意圖的函式庫為LuaGraph,建立GUI視窗的函式庫為wxLua


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