gpt4 book ai didi

haskell - 功能性 Banana Traveler - 独立于计时器和玩家的事件

转载 作者:行者123 更新时间:2023-12-02 16:30:03 26 4
gpt4 key购买 nike

我现在正在 Traveler 中尝试处理独立于玩家的游戏状态更新。作为引用,该项目是 here (开发分支是与此问题相关的分支)。

Libraries/Universe/GameState.hs 有一个函数 updateGS,用于处理所有玩家对游戏状态的更新。 EventNetwork 现在看起来像这样。

makeNetworkDescription :: AddHandler PlayerCommand ->
AddHandler () ->
TChan GameState ->
IO EventNetwork
makeNetworkDescription addCommandEvent tickHandler gsChannel = compile $ do
eInput <- fromAddHandler addCommandEvent
eTick <- fromAddHandler tickHandler
let bGameState = accumB initialGS $ updateGS <$> eInput
eGameState <- changes bGameState
reactimate $ (\n -> (atomically $ writeTChan gsChannel n)) <$> eGameState

实现这个计时器的问题是,我看过的所有示例都有与我的物理模拟不同的用例。这个游戏不涉及物理。我正在尝试使用计时器来独立于玩家操作来评估游戏状态。目前,我唯一想要管理的就是超空间旅行。完全实现后,从一个星球移动到另一个星球会将特工位置更改为右超空间。现在需要发生的是,当发生 tick 时,distanceTraversed 就会增加 1。然后,如果 distanceTraversed 等于 totalDistanceAgent 的位置将变为 Left Planet

那么从 EventNetwork 的角度来看,这会是什么样子?

let bHyperspace = accumB initialGS $ foo <$> eTick

现在组合行为

let bBaz = (++) <$> bGameState <*> bHyperspace

这是正确的道路吗?

最佳答案

这个问题有点模糊,不容易回答,但我会尽力。

首先,查看您的代码,我发现您将实际的游戏逻辑“外包”给了整体 GameState 类型和 updateGS 函数,这很奇怪。现在,这并不是一件坏事,只是以这种方式使用 FRP 没有任何好处。您可以完全删除 makeNetworkDescription 函数,并使用 addCommandEvent 手动注册偶数处理程序。

FRP 的好处是您可以将游戏状态建模为行为和事件的网络。如果状态足够模块化,那么这将显着简化代码。


其次,关于你关于超空间旅行建模的问题。

这是一种方法:

-- indicates whether hyperspace travel is currently happening
bTravelling :: Behavior t Bool

-- increment travel distance, but only when travelling
bTravelDistance :: Behavior t Distance
bTravelDistance = accumB 0 $ (+1) <$> whenE bTravelling eTick

-- calculate player location from travel distance
bPlayerLocation :: Behavior t Location
bPlayerLocation =
(\distance -> if distance > total then Left Planet else Right HyperSpace)
<$> bTravelDistance

不过,您可能想在游戏中多次重复此过程。不幸的是,reactive-banana 目前不提供“先做这个,然后做那个”的抽象。有动态事件切换,但可能有点笨拙。

关于haskell - 功能性 Banana Traveler - 独立于计时器和玩家的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16484322/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com