Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用DLR实现无状态游戏NPC聊天脚本_C#_.net_Dynamic Language Runtime - Fatal编程技术网

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

C# 使用DLR实现无状态游戏NPC聊天脚本,c#,.net,dynamic-language-runtime,C#,.net,Dynamic Language Runtime,如何使用DLR(即IronPython)实现无状态游戏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(s

如何使用DLR(即IronPython)实现无状态游戏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中一个不断命名的变量“input”中

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

<>我知道C++中的Lua是可行的,通过G.EySeNO简单地发送脚本,调用LuaYAdvices。当接收到输入时,调用其中一个lua_push(例如lua_pushinteger)方法,然后调用lua_resume

还有,有谁有更好的解决方案吗


谢谢。

如果IronPython支持fpr PEP342(通过增强型生成器协同路由),您可以在您的场景中使用它们:(例如,在
npc.GetYesNo()
上屈服,并将值发送回生成器并从那里继续)。

如果IronPython支持fpr PEP342(通过增强型生成器协同路由)您可以在您的场景中使用这些选项:(例如,在
npc.GetYesNo()
上屈服,然后将值发送回生成器并从那里继续)。

抱歉,我不接受答案,因为它不能确切地回答问题;IPY可能支持PEP342,但它似乎没有通过其宿主API公开它;IPY可能支持PEP342,但它似乎没有通过其宿主API公开它。