如何检测移动图像与其他移动图像是否发生触碰碰撞
图形应用移动图像碰撞检测实现方法
核心检测原理
针对规则矩形的移动图像,业界最常用的是轴对齐包围盒(AABB)碰撞检测,逻辑简单、性能开销极低,非常适合多元素实时移动的图形场景:两个矩形只要在X轴、Y轴两个方向的投影都存在重叠,即判定为发生碰撞。
参考代码逻辑说明
下方是针对小车类游戏场景的简化版碰撞检测实现,适配对方车辆单向向玩家车辆移动的场景:
def check_crash(): # 获取玩家车辆的左上角坐标 (x,y) = c.coords(my_car) # 遍历所有敌方车辆 for car in other_carss : # 获取当前敌方车辆的左上角坐标 (car_x,car_y) = c.coords(car) # 第一步判断Y轴是否重叠:玩家车辆顶部低于敌方车辆底部,且玩家车辆底部高于等于敌方车辆底部 if y < (car_y+ other_cars_height) and (y + my_car_height) >= (car_y+ other_cars_height): # 第二步判断X轴是否重叠:玩家车辆左边界在敌方车辆的左右边界范围内 if x > car_x and x < (car_x + other_cars_width): # 触发碰撞后的业务逻辑:删除敌方车辆、扣除玩家生命值 c.delete(car) lose_a_life() # 每100ms重复执行一次碰撞检测,和画面刷新逻辑对齐 root.after(100, check_crash)
通用场景扩展
如果两个图像是任意方向自由移动的,替换为通用版AABB碰撞判断条件即可,适配所有矩形元素碰撞场景:
if (x < car_x + other_cars_width and x + my_car_width > car_x and y < car_y + other_cars_height and y + my_car_height > car_y): # 此处写入碰撞触发后的逻辑 pass
优化建议
- 性能优化:如果移动元素数量较多,可以提前做空间分区,仅对同一屏幕分区内的元素做碰撞判断,减少无效循环
- 精度优化:如果是不规则形状的图像,可以先用AABB做粗筛,再对粗筛命中的元素做像素级碰撞校验,平衡性能和检测精度
- 逻辑优化:调整
after方法的延时参数和你应用的画面刷新帧率对齐,避免出现碰撞漏判的情况
内容的提问来源于stack exchange,提问作者Reem Abd AlAziz
相关产品推荐
相关产品推荐

