我正在使用光泽作为我的主要库在 haskell 中制作乒乓球游戏。玩家控制的桨的移动与鼠标的 x 坐标相关联,并随着移动而更新。问题是,球在移动时不会与桨发生碰撞。
movePaddle :: Event -> Game -> Game
movePaddle (EventMotion (x,y)) g = g {nextPos = max 50 . min 750 $ (x+400)}
movePaddle _ g = g
movePaddle 更新玩家桨的下一个位置。
moveBall :: Game -> Float -> Game
moveBall g f = g {dir = dirn, ball = (xt, yt)}
然后,moveBall 根据碰撞更新球的移动方向,并调整其坐标。
updatePaddle :: Game -> Game
updatePaddle g = g {p1 = nextPos g}
最后,updatePaddle 更新了球拍在游戏中的实际位置。
我的主要功能如下所示:
main = play
(InWindow "pong" (800, 800) (300, 300))
white
60
(Game 400 400 (400, 400) 0.72 5 400)
gameDraw
movePaddle
updatePaddle . (flip moveBall)
我尝试仅在鼠标移动时更新状态,但球不会移动。如果我让它独立移动,同时在事件期间更新它,它会在鼠标移动期间加倍速度。我可以做些什么来产生适当的碰撞,同时仍然能够移动桨?
编辑:这是我的moveBall
代码:
moveBall :: Float -> Game -> Game
moveBall f g = g {dir = dirn, ball = (xt, yt)}
where
xn = fst (ball g) + f * vel g * cos (dir g)
yn = snd (ball g) + f * vel g * sin (dir g)
dirx
|(max 10 $ min 790 xn) == xn = 1
|otherwise = -1
diry
|(max 10 $ min 790 yn) == yn = 1
|otherwise = -1
dirn
|dirx == -1 = pi - diry * dir g
|(diry == -1) && (dirx == 1) = diry * dir g
|max (p1 g - 50) (min (p1 g + 50) xn) == xn && (yn <= 30) = paddleAngle (p1 g) xn
|max (p2 g - 50) (min (p2 g + 50) xn) == xn && (yn >= 770) = - paddleAngle (p2 g) xn
|otherwise = (dir g)
xt = (f * vel g * cos dirn) + normalize (fst (ball g))
yt = (f * vel g * sin dirn) + normalize (snd (ball g))