如何使用DLR实现无状态游戏NPC聊天 - 即IronPython?
无国籍意味着这样的事情:
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中常量命名的变量“input”中。
唯一的问题是,在这种情况下,如何阻止脚本,而不是每个脚本都有专用的线程?
我知道它在使用Lua的C ++中是可行的,例如GetYesNo只是发送脚本,并调用lua_yield。收到输入后,将调用其中一个lua_push(例如lua_pushinteger)方法,然后调用lua_resume。
另外,有没有人有更好的解决方案?
感谢。
答案 0 :(得分:1)
如果IronPython支持fpr PEP342(通过增强型生成器协同处理),您可以将它们用于您的场景:http://docs.python.org/whatsnew/2.5.html#pep-342(例如npc.GetYesNo()
上的产量并将值发送回生成器并从那里继续)