3

我一直坚持使用 Haskell/Yampa (=Arrows)(使用 HOOD)为我的游戏对象生成调试输出。

我的引擎基本上运行一个游戏对象列表,这些对象生成输出状态(线、圆),然后渲染。

data Output = Circle Position2 Double | Line Vector2

output :: [Output] -> IO ()
output oos = mapM render oos

render :: Output -> IO ()
render (Circle p r) = drawCircle p r
render (Line   vec) = drawLine (Point2 0 0) vec

玩家对象只是向右移动并表示为(定位的)圆圈。

playerObject :: SF () Output -- SF is an Arrow run by time
   p <- mover (Point2 0 0) -< (Vector2 10 0)
   returnA -< (Circle p 2.0)

mover 只是一个简单的积分器(加速度-> 速度-> 位置),我想在其中观察速度并将其作为调试输出渲染为(未定位的)线。

mover :: Position2 -> SF Vector2 Position2
mover position0 = proc acceleration -> do
    velocity <- integral -< acceleration -- !! I want to observe velocity
    position <- (position0 .+^) ^<< integral -< velocity
    returnA -< position

如何为我的游戏对象函数的内部值创建额外的图形调试输出?

实际应该发生的是在输出中,首先渲染实际对象(圆),但还要渲染额外的调试输出(运动矢量作为线)。可能我可以用 HOOD 实现这一点,但我仍然不熟悉 Haskell 并且不知道如何为我的案例采用 HOOD 教程。

4

2 回答 2

2

我不知道 HOOD 但 Debug.Trace 很简单:

> import Debug.Trace
> mover position0 = proc acceleration -> do
> > velocity <- integral -< acceleration
> > position <- trace ("vel:" ++ show velocity ++ "\n") $
> > > > > > > > > > > (position0 .+^) ^<< integral -< velocity
> > returnA -< position

请注意,它不应该放在定义速度的线上。

于 2010-07-15T13:15:58.287 回答
1

您可能想要做的是mover更灵活,以支持添加要呈现的带外调试信息(的值velocity)。我认为 HOOD 与您的问题无关,因为您已经拥有 FRP 框架来处理不断变化的值。只需安排输出速度。

就像是:

mover :: Position2 -> SF Vector2 (Position2, Vector2)
mover position0 = proc acceleration -> do
    velocity <- integral -< acceleration -- !! I want to observe velocity
    position <- (position0 .+^) ^<< integral -< velocity
    returnA -< (position, velocity)

playerObject :: SF () [Output]
   (p, v) <- mover (Point2 0 0) -< (Vector2 10 0)
   returnA -< [Circle p 2.0, Line v]
于 2011-07-02T02:47:43.370 回答