2010-11-15 42 views
1

如何使用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。

此外,有沒有人有更好的解決方案?

謝謝。

回答

1

如果IronPython支持fpr PEP342(通過增強型生成器的協同程序),您可以將它們用於您的場景:http://docs.python.org/whatsnew/2.5.html#pep-342(例如npc.GetYesNo()的收益並將值發回生成器並從那裏繼續)。

+0

對不起,我unaccepting的答案,因爲它並不完全回答這個問題得出結論; IPY可能支持PEP342,但它似乎沒有通過其託管API公開它。 – angelsl 2011-12-30 15:23:13