繁体   English   中英

在乒乓球游戏中使用 EventMotion 移动球拍使其无法记录碰撞

[英]Using EventMotion to move my paddle in a game of pong makes it unable to register collisions

我正在 haskell 使用 gloss 作为我的主要图书馆制作乒乓球游戏。 玩家控制的桨的移动与鼠标的 x 坐标相关联,并在移动时更新。 问题是,球在移动时不会与球拍发生碰撞。

movePaddle :: Event -> Game -> Game
movePaddle (EventMotion (x,y)) g = g {nextPos = max 50 . min 750 $ (x+400)}
movePaddle _ g = g

movePaddle 更新玩家桨的下一个 position。

moveBall :: Game -> Float -> Game
moveBall g f = g {dir = dirn, ball = (xt, yt)}

然后,moveBall 根据碰撞更新球移动的方向,并调整其坐标。

updatePaddle :: Game -> Game
updatePaddle g = g {p1 = nextPos g}

最后,updatePaddle更新游戏中球拍的实际position。

我的主要 function 看起来像这样:

main = play
  (InWindow "pong" (800, 800) (300, 300))
  white
  60
  (Game 400 400 (400, 400) 0.72 5 400)
  gameDraw
  movePaddle
  updatePaddle . (flip moveBall)

我尝试仅在鼠标移动时更新 state,但球不会移动。 如果我让它独立移动,同时也在事件期间更新它,它会在鼠标移动期间加倍速度。 我该怎么做才能在仍然能够移动桨的同时产生适当的碰撞?

编辑:这是我的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))

解决了。 事实证明,我在注册碰撞时看错了桨,混淆了我的坐标,因此桨 1 的碰撞被注册在屏幕顶部,桨 2 所在的位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM