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
相关产品推荐
相关产品推荐

