Processing中实现红球触碰黑圆时显示‘You Have Won’的方法
需补充的核心实现逻辑
现有代码已覆盖主球控制、红球发射、边界碰撞反弹、小球减速、离屏对象移除的基础流程,只需补全以下模块即可达成目标交互效果:
- 圆形碰撞检测逻辑
两个圆形的交互判定不需要复杂的形状计算,直接使用Processing内置的dist()方法计算两圆心的直线距离,当距离值小于等于红球半径与黑色目标圆半径之和时,即判定二者发生接触。实现时遍历所有未离屏的运动红球,将每个红球的坐标、半径与黑色目标的固定坐标、半径代入公式判断,核心逻辑代码:// 假设黑色目标的坐标、半径提前存入全局变量targetX、targetY、targetR for (Ball redBall : activeRedBalls) { float thresholdDist = redBall.r + targetR; if (dist(redBall.x, redBall.y, targetX, targetY) <= thresholdDist) { // 命中后触发后续胜利逻辑 } } - 游戏胜利状态标记
新增一个全局布尔变量,例如boolean isWin = false;,初始值设为false。一旦检测到红球与目标发生碰撞,就立即将该变量修改为true。通过该标记做状态隔离,避免每帧重复触发碰撞逻辑、反复渲染文本的问题。 - 胜利提示文本渲染
在draw()循环的最终渲染层,判断如果isWin为true,就配置文本的样式(大小、颜色、对齐方式),在屏幕居中位置渲染指定提示文本。核心逻辑代码:if (isWin) { fill(0); textSize(32); textAlign(CENTER, CENTER); text("You Have Won", width/2, height/2); } - 实现注意事项
- 碰撞检测的执行顺序要放在每帧红球位置更新完成、对象渲染之前,避免帧间隔导致的穿模问题——也就是视觉上看到红球和目标碰上了,但因为用了上一帧的坐标算检测,导致提示没触发
- 因为黑色目标本身就固定在屏幕上半区,碰撞判断不需要额外给红球加y坐标范围的筛选条件,只要距离判定成立就算有效碰撞
- 触发胜利状态后,不需要对命中目标的红球做反弹、减速等后续处理,也不用因为红球离屏被移除就取消提示——靠布尔标记做状态持久化,保证提示一直显示
内容的提问来源于stack exchange,提问作者Prabs
相关产品推荐
相关产品推荐

