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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 07:54:00