3

我想为我的游戏管理输入的方式是轮询 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 来说太昂贵了。在这种情况下,更好的方向是什么?

4

1 回答 1

2

我在比赛中也面临同样的问题。我决定尽量让事件网络不受特定于实现的东西(例如输入协议)的影响。相反,我阻塞在事件网络外部的 IO 线程中,并从那里将处理后的事件发送到事件网络(使用类似于EventSource响应式香蕉示例中使用的“设计模式”之类的东西。

这样做的原因是,事件网络必须以这种方式仅处理定义明确且简单的输入命令,并且fromPoll不需要。细节(例如输入是否来自本地输入或网络,输入事件是否格式正确,如何处理错误)在程序的其他部分完成。

另一方面,如果你的游戏设计是这样的,输入只在游戏滴答期间被处理并且输入事件必须被缓冲,那么你将需要一些地方来保存它们。我想,Tchan 会像其他任何方式一样做到这一点。

于 2013-06-23T21:12:12.010 回答