You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Android边界碰撞检测:特定碰撞场景的条件判断实现

碰撞检测场景的判断逻辑实现

嘿,我来帮你搞定这几个ImageView碰撞场景的判断逻辑,咱们先把每个场景的边界条件理清楚,再写对应的if语句:

首先假设我们已经通过getTop()getBottom()getLeft()getRight()方法拿到了ballRect(球的矩形)和brickRect(砖块的矩形)的四个边界值:ballTopballBottomballLeftballRightbrickTopbrickBottombrickLeftbrickRight

1. 先定义「ballRect落在brickRect顶部」的判断条件

这个场景是球稳稳“踩”在砖块顶部,此时垂直方向球的底部刚好碰到砖块顶部,且球的水平范围与砖块有重叠(避免只是垂直对齐但没真正落在上面):

// 判断ball是否落在brick顶部的条件(加小阈值避免像素级严格判断)
boolean isBallOnBrickTop = (ballBottom <= brickTop + 5) 
        && (ballBottom >= brickTop - 5)
        && ballLeft < brickRight
        && ballRight > brickLeft;

这里的±5是误差阈值,你可以根据View的移动速度调整数值——毕竟移动中的View很难刚好卡在完全像素对齐的状态,加个小范围能让判断更准确。

2. 触发负面响应的两种碰撞场景判断

我们需要触发负面响应的是brick的底部碰ball的顶部,或者brick的左侧碰ball的右侧,同时要排除掉上面「球落在砖顶部」的情况:

// 场景1:brick底部与ball顶部碰撞
boolean isBrickBottomHitBallTop = (brickBottom <= ballTop + 5)
        && (brickBottom >= ballTop - 5)
        && brickLeft < ballRight
        && brickRight > ballLeft;

// 场景2:brick左侧与ball右侧碰撞
boolean isBrickLeftHitBallRight = (brickLeft <= ballRight + 5)
        && (brickLeft >= ballRight - 5)
        && brickTop < ballBottom
        && brickBottom > ballTop;

// 最终判断:满足两种负面碰撞之一,且不是球落在砖顶部的状态
if ((isBrickBottomHitBallTop || isBrickLeftHitBallRight) && !isBallOnBrickTop) {
    // 这里写触发负面响应的代码,比如球反弹方向改变、扣分等
}

逻辑补充说明

  • 每个碰撞判断都加了阈值:避免因为移动动画的像素跳动导致碰撞漏判;
  • 水平/垂直重叠判断:比如判断brick底部碰ball顶部时,必须保证两者在水平方向有重叠——不然只是垂直对齐,实际没发生碰撞;
  • 排除「球落在砖顶部」的情况:确保即使球和砖顶部有接触,只要是“平稳落在上面”的状态,就不会误触发负面响应。

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

火山引擎 最新活动