【发布时间】:2016-10-22 18:26:07
【问题描述】:
我正在尝试在 Haskell 中旋转图片,使用当前时间作为旋转函数的值。我有以下main 函数:
main :: IO ()
main = do
args <- getArgs
time <- round <$> getPOSIXTime
let initial' = initial time
let (w, h, display) = chooseDisplay args
let background = black
let fps = 60
play display background fps initial' (draw w h) eventHandler timeHandler
三角形 (=player) 存储在“世界”数据类型中: 模块型号在哪里
data World = World {
-- all kinds of World properties --
player :: Picture
}
然后我有一个函数initial初始化世界,还有一个函数playerBody,给定一个旋转值,返回player的图片:
initial :: Int -> World
initial _ = World{player = playerBody 0}
playerBody :: Float -> Picture
playerBody rot = Rotate rot $ color red $ Polygon[(-10, 100), (10, 100), (0, 125)]
draw函数定义如下:
draw :: Float -> Float -> World -> Picture
draw _ _ world = player world
它目前只返回playerPicture。
现在,在我的 timeHandler 模块中,我想使用时间(在main 函数中提供给 timeHandler)来旋转player,如下所示:
timeHandler :: Float -> World -> World
timeHandler time = (\world -> world {player = playerBody time} )
这不起作用。我用一个常量值(在 timeHandler 函数中)替换了time,这确实旋转了图片。所以看起来time 没有更新..我做错了什么?
【问题讨论】:
-
不是一个答案:有一点要明确的是,
main中的time和timeHandler中的time彼此无关——事实上,它们甚至没有相同的类型。前者是执行getPosixTime得到的局部值,后者是独立函数定义中的参数。他们只是碰巧同名。 -
我知道这个@duplode!但是,根据
play函数的描述,timeHandler应该以秒为单位给出时间.. -
好吧——只是你在“
main函数中给 timeHandler”的措辞让我有点困惑。 (您不会自己将time提供给`timeHandler`;相反,Gloss 会在play实现中的某个地方自行获取它。) -
无论如何,如果我正确理解the docs,您的程序的预期行为将是每秒将图片旋转一度(即每帧1/60度),对吗?
-
没错,这就是我所期望的。