Kivy游戏开发:矩形与Quad碰撞检测左侧失效问题求助
问题根源
你的ball_collide_brick函数只检查了矩形的左下角坐标(rect_coordinates[0])是否落在Quad的边界内,完全忽略了矩形宽度和高度覆盖的区域。当矩形从左侧靠近Quad时,左下角还没进入Quad的x范围,即便矩形右侧已经侵入Quad,碰撞检测也不会触发。
修复方案
改用**轴对齐矩形碰撞(AABB)**的标准逻辑:判断两个矩形在x轴和y轴上都有重叠区域,就说明发生了碰撞。
修改后的代码如下:
def ball_collide_brick(self, bi_x, bi_y): # 获取砖块的AABB边界 brick_x_min, brick_y_min = self.get_brick_coordinate(bi_x, bi_y) brick_x_max, brick_y_max = self.get_brick_coordinate(bi_x+1, bi_y+1) # 获取矩形的AABB边界 rect_x_min = self.rect_coordinates[0][0] rect_y_min = self.rect_coordinates[0][1] rect_x_max = rect_x_min + self.rect_coordinates[1][0] rect_y_max = rect_y_min + self.rect_coordinates[1][1] # 标准AABB碰撞判断:两个矩形在x和y轴都有重叠 x_overlap = rect_x_min < brick_x_max and rect_x_max > brick_x_min y_overlap = rect_y_min < brick_y_max and rect_y_max > brick_y_min return x_overlap and y_overlap
额外优化点
- 删掉原函数里无用的循环
for i in range(0, 1),该循环仅执行一次,没有实际作用。 - 可以直接用
self.rect.pos和self.rect.size计算矩形边界,无需依赖rect_coordinates,代码更简洁:
def ball_collide_brick(self, bi_x, bi_y): brick_x_min, brick_y_min = self.get_brick_coordinate(bi_x, bi_y) brick_x_max, brick_y_max = self.get_brick_coordinate(bi_x+1, bi_y+1) rect_x_min = self.rect.pos[0] rect_y_min = self.rect.pos[1] rect_x_max = rect_x_min + self.rect.size[0] rect_y_max = rect_y_min + self.rect.size[1] x_overlap = rect_x_min < brick_x_max and rect_x_max > brick_x_min y_overlap = rect_y_min < brick_y_max and rect_y_max > brick_y_min return x_overlap and y_overlap
内容的提问来源于stack exchange,提问作者Enahon Wilfred
相关产品推荐
相关产品推荐

