我目前正在开发一款利用活性香蕉和SDL的小游戏.由于目标主要是为了更多地了解反应性香蕉和FRP,我尝试使用动态切换来设置游戏对象的集合,但到目前为止还没有取得多大成功.
在Bartab示例中,我发现了唯一使用事件切换的示例,最终触发在集合中创建新条目的事件是从事件网络外部获取的,而不是使用内部事件.我的问题是:这是唯一的方法,还是这个例子的特例?
在活性香蕉中是否还有更多动态事件切换示例?
根据我的理解,我得到一个时刻t(Anytime Behavior a),使用execute创建一个事件t(Anytime Behavior a),然后用于更新携带集合的Behavior.使用trimB对从触发事件创建的行为创建时刻t(任意时间行为a).如果此触发事件源自事件网络,则不会使用错误消息"无法推断(t~t1)"进行编译.我不确定〜确切意味着什么,但它显然会抛出错误,因为事件网络的两个框架值(t)和这个新的Moment值是不同的.
所以,长话短说,我不明白反应香蕉中的事件切换是如何工作的,我不知道为什么.它在理论上应该相对简单.
编辑:
-- Event Network
-- ==========================
setupNetwork :: forall t. Frameworks t => (EventSource Command, EventSource ()) -> IORef SpriteMap -> GameMap -> Moment t ()
setupNetwork ((addHandlerE, _), (addHandlerT, _)) sprites map = do
-- Input Events
----------------
eInput <- fromAddHandler addHandlerE -- Player Commands
eFrame <- fromAddHandler addHandlerT -- Event on each Frame
let
[...]
eSpawnEvent :: Event t (DSCoord)
eSpawnEvent = extractCoord <$> eLeftClick
where
extractCoord (LeftClick c) …Run Code Online (Sandbox Code Playgroud) 我现在正在学习Haskell和Yampa,并对重新启动函数有疑问.
reactimate :: IO a -- init
-> (Bool -> IO (DTime, Maybe a)) -- sense
-> (Bool -> b -> IO Bool) -- actuate
-> SF a b -- signal function
-> IO ()
Run Code Online (Sandbox Code Playgroud)
正如你在类型签名中看到的那样,sense函数的部分输出是函数当前和上一次调用之间的时间差.在我看到的例子中,这个时间差是在意义上"手动"计算的,使用IORef来保持前一次调用的值.
你必须使用外部状态跟踪时差这似乎很奇怪,为什么在重新计算功能中不进行这种计算?IORef是处理它的好方法吗?