跳转至内容

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