отладочный вывод игровых объектов в Haskell / Yampa и HOOD - PullRequest
3 голосов
/ 15 июля 2010

Я застрял с генерацией отладочного вывода для моих игровых объектов, используя 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 для моего случая.

Ответы [ 2 ]

2 голосов
/ 15 июля 2010

Я не знаю, 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

Обратите внимание, что его нельзя ставить на линию, определяющую скорость.

1 голос
/ 02 июля 2011

Что вы, вероятно, хотите сделать, это сделать 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]
...