首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用DLR实现无状态游戏NPC聊天脚本

使用DLR实现无状态游戏NPC聊天脚本
EN

Stack Overflow用户
提问于 2010-11-15 17:07:57
回答 1查看 300关注 0票数 1

如何使用DLR -即IronPython实现无状态游戏NPC聊天?

无状态意思是这样的:

代码语言:javascript
复制
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()

而不是:

代码语言:javascript
复制
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“中。

唯一的问题是,在这种情况下,如何阻止脚本,而不是每个脚本都有专用的线程?

我知道在C++中使用Lua是可行的,例如让GetYesNo简单地发送脚本,然后调用lua_yield。当接收到输入时,将调用其中一个lua_push (例如lua_pushinteger)方法,然后调用lua_resume。

还有,有没有更好的解决方案?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2010-11-15 18:15:48

如果IronPython支持fpr PEP342 (通过增强的生成器实现的协程),那么您可以在您的场景中使用它们:http://docs.python.org/whatsnew/2.5.html#pep-342 (例如,在npc.GetYesNo()上生成并将值发送回生成器,然后从那里继续)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4182835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档