我想管理游戏输入的方法是轮询一个TChan,然后在eTick发生时创建一个事件。但是我尝试它的方式会起作用吗?
data UAC = UAC (AID,PlayerCommand) deriving 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而言太贵了。在那种情况下,更好的方向是什么?
答案 0 :(得分:2)
我在游戏中遇到了同样的问题。我决定尽量保持事件网络免受特定于实现的东西(例如输入协议)的影响。相反,我阻止事件网络之外的IO线程,并从那里将处理过的事件发送到事件网络(使用类似EventSource
&#34;设计模式&#34;在反应性香蕉示例中使用。< / p>
这样做的原因是事件网络必须只处理明确定义的简单输入命令,并且不需要fromPoll
。如果输入来自本地输入或网络,如果输入事件格式正确,如何处理错误,则在程序的其他部分中完成详细信息(
另一方面,如果你的游戏设计只是在游戏滴答期间处理输入并且输入事件必须被缓冲,那么你需要一些地方来保存它们。我猜想,TChan会以任何其他方式完成这一伎俩。