You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell基于Gloss开发Pong游戏EventMotion控制paddle碰撞检测失效问题

问题根源

你的帧状态更新顺序错误,碰撞检测时拿不到最新的paddle位置:

  • 你当前的主函数帧更新逻辑为 updatePaddle . (flip moveBall),函数组合的执行顺序是先运行moveBall计算球的移动与碰撞,再同步paddle的最新位置到p1字段
  • moveBall内的paddle碰撞逻辑依赖p1字段,用到的始终是上一帧的旧paddle位置,自然无法触发碰撞
  • 之前遇到的速度翻倍问题,是因为你把球的更新逻辑同时放到了事件回调和帧更新回调中,鼠标移动时球会被重复计算位移。

解决方案

调整帧更新的执行顺序:先同步paddle的最新位置,再计算球的位移与碰撞。
把主函数中play的最后一行参数修改为:

\delta g -> moveBall delta (updatePaddle g)

逻辑验证

修改后每帧的执行流程为:

  1. 若有鼠标移动事件,先通过movePaddle更新nextPos字段(仅记录目标位置,不修改paddle实际位置、不碰球的状态)
  2. 每帧固定更新时,先执行updatePaddle把nextPos同步到p1字段,拿到包含最新paddle位置的状态
  3. 把最新状态传入moveBall,此时碰撞检测用的paddle位置和你视觉上看到的位置完全一致,即可正常触发碰撞,也不会出现球速度翻倍的问题。

内容的提问来源于stack exchange,提问作者heightweight

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:36:05