26. 碰撞,AABB,Box2D
3.22,周日,碰撞这块手写也太麻烦了,真想一个简单的 AABB 直接带过。
bump.lua
全力重写 bump,力争看懂每一行代码。
lua
local World = Object:extend()
local DELTA = 1e-10
-- 返回符号
local function sign(x)
if x > 0 then return 1 end
if x == 0 then return 0 end
return -1
end
-- a 和 b 中哪个更接近 x
local function nearest(x, a, b)
return math.abs(a - x) < math.abs(b - x) and a or b
end
-- 求点 (px,py) 到矩形最近的角(返回该角坐标)
local function rect_getNearestCorner(x, y, w, h, px, py)
return nearest(px, x, x + w), nearest(py, y, y + h)
end
-- 判断点是否在矩形内部(严格大于 DELTA,避免边界抖动)
local function rect_containsPoint(x, y, w, h, px, py)
return px - x > DELTA and py - y > DELTA and x + w - px > DELTA and y + h - py > DELTA
end
-- 获取矩形中心点的平方距离
local function rect_getSquareDistance(x1, y1, w1, h1, x2, y2, w2, h2)
local dx = (x1 + w1 / 2) - (x2 + w2 / 2)
local dy = (y1 + h1 / 2) - (y2 + h2 / 2)
return dx * dx + dy * dy
end
return World