如何使用DLR實現無狀態遊戲NPC聊天 - 即IronPython?使用DLR實現無狀態遊戲NPC聊天腳本
無國籍意味着這樣的事情:
npc.AddText("Are you dead?")
playerIsDead = npc.GetYesNo()
if playerIsDead:
npc.AddText("You can't be dead!")
npc.SendOk()
else:
npc.AddText("Okay.")
npc.SendOk()
npc.End()
相反的:
def Talk(state, action, input):
if action == -1:
npc.End()
elif state == 0:
npc.AddText("Are you dead?")
npc.GetYesNo()
elif state == 1:
if input:
npc.AddText("You can't be dead!")
npc.SendOk()
else:
npc.AddText("Okay.")
npc.SendOk()
npc.End()
看到區別?
我想過一種解決方案:每個NPC對話使用一個線程,以及AutoResetEvents或類似的東西。不可行,因爲在現實生活中,可能會有許多NPC對話(數百個,如果不是數千個)同時進行。不想要幾千個線程。
另一種方式是讓GetYesNo()等方法不返回任何東西,而不是簡單地發送對話框包到客戶端,並以某種方式暫停/塊/暫停腳本。然後,當接收到輸入時,它將放入ScriptScope中的一個不斷命名的變量「輸入」中。
唯一的問題是,在這種情況下,如何阻止腳本,而不需要每個腳本都有專用線程?
我知道它是可行的在C++和Lua,具有e.g GetYesNo只需發送腳本,並調用lua_yield。當收到輸入時,調用其中一個lua_push(例如lua_pushinteger)方法,然後調用lua_resume。
此外,有沒有人有更好的解決方案?
謝謝。
對不起,我unaccepting的答案,因爲它並不完全回答這個問題得出結論; IPY可能支持PEP342,但它似乎沒有通過其託管API公開它。 – angelsl 2011-12-30 15:23:13