Haskell基于Gloss开发Pong游戏EventMotion控制paddle碰撞检测失效问题
问题根源
你的帧状态更新顺序错误,碰撞检测时拿不到最新的paddle位置:
- 你当前的主函数帧更新逻辑为
updatePaddle . (flip moveBall),函数组合的执行顺序是先运行moveBall计算球的移动与碰撞,再同步paddle的最新位置到p1字段 moveBall内的paddle碰撞逻辑依赖p1字段,用到的始终是上一帧的旧paddle位置,自然无法触发碰撞- 之前遇到的速度翻倍问题,是因为你把球的更新逻辑同时放到了事件回调和帧更新回调中,鼠标移动时球会被重复计算位移。
解决方案
调整帧更新的执行顺序:先同步paddle的最新位置,再计算球的位移与碰撞。
把主函数中play的最后一行参数修改为:
\delta g -> moveBall delta (updatePaddle g)
逻辑验证
修改后每帧的执行流程为:
- 若有鼠标移动事件,先通过
movePaddle更新nextPos字段(仅记录目标位置,不修改paddle实际位置、不碰球的状态) - 每帧固定更新时,先执行
updatePaddle把nextPos同步到p1字段,拿到包含最新paddle位置的状态 - 把最新状态传入
moveBall,此时碰撞检测用的paddle位置和你视觉上看到的位置完全一致,即可正常触发碰撞,也不会出现球速度翻倍的问题。
内容的提问来源于stack exchange,提问作者heightweight
相关产品推荐
相关产品推荐

