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

Processing制作Pong游戏校准球碰撞:实现边缘优先触发而非中心碰撞

核心问题

你所有碰撞检测逻辑都是基于球的中心点坐标判断,没有计入球本身的尺寸,同时存在绘制坐标和碰撞计算坐标不一致的问题,才会出现半颗球移出后才触发反弹的情况。


具体修改步骤

  • 先补充基础定义,修正绘制逻辑:你已经用diam = 10定义了球的直径,先声明半径变量float r = diam / 2;同时你当前绘制球时写的image(img, x/2, y)和碰撞计算用的x坐标完全不匹配,改为image(img, x, y)即可对齐逻辑位置和显示位置。
  • 修改上下边缘碰撞逻辑:将原有的中心点触达判断,改为球的边缘碰到屏幕就触发反弹:
// 替换原上下边缘碰撞代码
if ( y + r >= height || y - r <= 0 ) {
  speedY *= -1;
  // 追加位置修正避免卡进屏幕边缘
  y = y + r >= height ? height - r : r;
}
  • 修改左侧墙碰撞逻辑:左侧墙是宽度20的矩形,右边缘坐标为20,球的左边缘碰到20就触发反弹:
// 替换原左侧墙碰撞代码
if (x - r <= 20) {
  speedX *= -1.1;
  speedY *= 1.1;
  // 追加位置修正避免卡进墙内
  x = 20 + r;
}
  • 修改 paddle 碰撞逻辑:你当前代码把 paddle 定义在屏幕中间(x坐标为width/2),如果是做标准Pong游戏要放在右侧,建议先把paddle绘制代码改为rect(width-50, mouseY-rectSize/2, 50, rectSize),再替换碰撞判断逻辑:
// 替换原paddle碰撞代码,对应paddle放在右侧的场景
if ( x + r >= width -50 && x <= width -50 && y + r >= mouseY - rectSize/2 && y - r <= mouseY + rectSize/2 ) {
  speedX *= -1;
  // 追加位置修正避免卡进paddle
  x = width -50 - r;
}
  • 可选优化:你当前reset()函数里speedX = random(5, 5)是固定值5,如果要实现开局随机发球方向,可以改为speedX = random(1) > 0.5 ? 5 : -5,speedY同理调整即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:06:10