2010-07-15 72 views
3

我一直使用Haskell/Yampa(= Arrows)(与HOOD)为我的游戏对象生成调试输出。在Haskell/Yampa和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) 

动机只是一个简单的积分器(加速 - >网速度>位置)其中,I想观察速度并使其作为调试输出作为(unpositioned)线。

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教程。

回答

1

我不知道,但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

注意,它不应该被提上定义速度的线。

+0

这不会给图形输出,不过,在控制台上只是文本,并且一般有点有限。有时候'unsafePerformPrintfDebugging'就是你真正需要的,但我认为这里的提问者不止于此。 – 2010-07-15 13:50:38

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] 
+1

改变和打破界面正是我想要避免的。函数的签名应该保持不变,但函数体中数据流之间的一些额外注释会传递给外部系统并以视觉样式呈现。像GHood一样,但具有交互式程序功能。 – 2011-07-03 09:42:47

+0

如果您不介意重新计算(不幸的是,Yampa原则上应该能够避免这种情况,但是不会),您可以将Veloctiy计算分解为自己的标识符,然后从顶层访问它。或者你可以在远处做一些不安全的行为,将相关位传播到顶层。 – 2011-07-03 15:58:21