0

我正在尝试在 ActionScript 3 中编写一个 roguelike 游戏。在这种类型的游戏中,角色和物品以复杂且不可预测的方式进行交互,因此游戏内事件的长链可以在一个回合的空间内发生,每一个由上一个导致的,并且经常发生在前一个正确完成其进程之前。当我发现,在这样的混乱中,我需要提示玩家输入并立即采取行动,然后其他任何事情继续发生,似乎出现了一个问题。

如果 UI 在单独的线程上运行,这样玩家可以输入输入并且我可以接收它而不必从当前正在执行的整个函数堆栈中返回,那么理智的方法是简单地调用(从任何巨大的嵌套函数调用我碰巧在里面)一个等待玩家输入然后对其进行操作的函数。但在 AS3 中,这是不可能的;在返回之前等待输入的函数只会导致程序挂起。

针对此类问题,人们说正确的解决方案是将我的操作分解为多个部分,这样我就可以等待用户输入,然后继续我正在做的事情。对于通常提供此类建议的琐碎示例来说,这很可爱并且可以优雅地工作,但是在这种情况下,不可预测且经常随机发生的事件可能会同时导致数十个复杂事件链,其中任何一个都可能突然需要在任何时候用户输入,“恢复我正在做的事情”的概念似乎是一项艰巨的任务。

我是否别无选择,只能将游戏中发生的所有事情存储为一个数据结构,该数据结构描述了事件的所有细节,包括到目前为止的进展情况,这样我就可以突然放弃我正在做的事情等待玩家输入,然后重建之前的状态,不管它可能多么复杂?与从任何地方简单地调用“get_input”函数然后继续我快乐的方式相比,这项任务的繁琐似乎足以阻止我或任何人使用 AS3。我错过了什么?有没有办法解决这个问题,不会让我发疯,或者我应该把这当作 AS3 不适合这项工作的工具的暗示?

4

1 回答 1

0

关于数据结构 - 我认为是的,你做得对。关于用户输入的“即时”请求 - 您应该在某处定义一段时间,任何持续时间少于此的时间都被视为即时事件,并且永远不应要求用户在“继续?”行中输入。现在,您希望有一个事件来触发比主事件更短的事件,这是可以做到的,并且 AS3 对于这种类型的事件处理是正常的 - 但是,为了让玩家能够提供输入,您有释放 enterFrame 侦听器或用于处理事件链的任何进程。因此,例如,您可以这样做:

var userInputRequested:Boolean=false;
while (!userInputRequested && (yourEventsToBeProcessed>0)) {
    userInputRequested=processOneTurnOfOneEvent();
}

显然,你的游戏应该能够同时处理一个事件一段时间,比如一个事件“你的角色正在穿上盔甲”,因为我见过一个像这样的冗长事件的 roguelike。好的,这个事件被推送到你的事件链中,yourEventsToBeProcessed 现在是非零的。这个循环在计算游戏时间的同时处理一个穿着事件(!!!如果你错过了这个,你就有大麻烦了。它应该符合“当我们到达处理这个量子的最后一个事件时,推进一个量子并且从第一个事件开始”)直到事件成功完成,否则会弹出另一个随机事件(“狗头人进入视野!” - 它可能不需要用户输入,但“狗头人在攻击范围内”可能)。基本上,“移动你的世界”事件在该链中始终处于活动状态,但不计入在该循环中检查的计数器中,否则您的玩家将永远等待世界。现在,这样的事件对玩家可见,如果“processOneTurnOfOneEvent()”返回 true,则循环结束,enterFrame 侦听器可能会为用户提供输入内容的方法,并耐心等待,直到收到输入。

于 2012-10-05T05:10:22.040 回答