两个aabb碰撞当且仅当在x轴和y轴上均重叠;正确写法是用否定式分离逻辑:return !(a.max_x

直接用分离轴定理的退化形式判断:两个AABB在x轴和y轴上都重叠,才算碰撞。写错一个轴或不等号方向反了,结果就不可靠。
怎么写 intersects 函数才不出错
核心是「四边不分离」逻辑,别手写四组 && 判断,容易漏项或括号错位。推荐用否定式表达:
return !(a.max_x- 用
而不是 <code>,保证边对边接触也被视为碰撞(绝大多数游戏/UI 场景需要) - 结构体字段必须统一为
min_x/max_x这类命名,避免混用left/right和x/w导致边界计算错位 - 不检查
min_x 等合法性——这该在构造时做,不是每次检测都做
用 SDL_Rect 或 sf::FloatRect 时别自己算
你已经在用成熟库,就别重复造轮子:
- SDL2:直接调
SDL_HasIntersection(&a, &b),它内部处理了空矩形(w 或 <code>h )、整数溢出、坐标系适配 - SFML:用
sf::FloatRect::intersects(),传getGlobalBounds()得到的是世界坐标下已变换的 AABB,但注意——旋转后仍是轴对齐矩形,不是真实轮廓 - 如果自己封装了
Rect类,别让intersects接收裸坐标,而应强制要求输入是合法min/max对,否则 y 轴方向一反,整个判断就翻车
为什么常见错误总出在 y 轴
因为坐标系没统一:
- SDL、Windows GDI、大多数 UI 框架:y 向下增长 → 上方矩形满足
a.y + a.h - OpenGL NDC、数学惯用、部分物理引擎:y 向上增长 → 上方矩形满足
a.y >= b.y + b.h - 最稳做法:不依赖
y名称含义,显式转成top/bottom:int a_top = a.y; int a_bottom = a.y + a.h;,然后统一用a_bottom 判上方分离 - 一旦混用坐标系定义,
intersects可能永远返回false,哪怕视觉上明显重叠
真正难的不是写对那四行比较,而是确保所有矩形数据从源头开始就用同一套 min/max 语义,并且 y 方向解释始终一致。边界接触要不要算碰撞、空矩形如何处理、浮点 NaN 是否可能传入——这些细节在上线前必须明确,不能靠“看起来差不多”。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











