我想要管理游戏输入的方式是轮询 TChan,然后在 eTick 发生时创建一个事件。但我尝试的方式有效吗?
数据UAC = UAC(AID,PlayerCommand)派生Show
makeNetworkDescription :: forall t . Frameworks t =>
TChan UAC ->
AddHandler () ->
TChan GameState ->
Moment t ()
makeNetworkDescription commandChannel tickHandler gsChannel = do
eTick <- fromAddHandler tickHandler
bCChannel <- fromPoll $ grabCommands commandChannel
let eCChannel = bCChannel <@ eTick
...
reactimate ...
grabCommands :: TChan UAC -> IO [UAC]
grabCommands unval = do
(atomically $ readTChan unval) `untilM` (atomically $ isEmptyTChan unval)
来自 fromPoll
的文档
“输入,通过频繁轮询可变数据(例如当前时间)来获取行为。每当事件网络处理输入事件时,都会更新生成的行为。”
我的理解正确吗? TChan 是从其他代码填充的,然后每个 eTick
我清空它并获取另一个 Event t [UAC]
?
也许我的理解是错误的,或者这个计算对于 fromPoll 来说太昂贵了。在这种情况下,更好的方向是什么?
最佳答案
我在游戏中也遇到了同样的问题。我决定尝试使事件网络尽可能不受特定于实现的内容(例如输入协议(protocol))的影响。相反,我阻塞事件网络外部的 IO 线程,并将处理后的事件从那里发送到事件网络(使用类似于响应式(Reactive)香蕉示例中使用的 EventSource
“设计模式”。
这样做的原因是,这样事件网络只需处理定义明确且简单的输入命令,并且不需要 fromPoll
。细节(例如输入是否来自本地输入或网络、输入事件是否格式良好、如何处理错误)在程序的其他部分完成。
另一方面,如果您的游戏设计为仅在游戏周期内处理输入并且必须缓冲输入事件,那么您将需要一些地方来保存它们。我想,TChan 和其他任何方式都可以做到这一点。
关于haskell - 功能 Banana Traveler - 输入处理 : Will this do what I want?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17238196/