Advertisement
Snusmumriken

simple_collision

Aug 14th, 2019 (edited)
342
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 1.35 KB | None | 0 0
  1. local M = {}
  2.  
  3. --
  4. function M.aabb(x1, y1, w1, h1, x2, y2, w2, h2)
  5.     return not ((x2 > x1 + w1) or (x2 + w2 < x1) or
  6.                 (y2 > y1 + h1) or (y2 + h2 < y1))
  7. end
  8.  
  9. function M.aabbPoint(x1, y1, x2, y2, w2, h2)
  10.     return ((x1 > x2) and (x1 < x2 + w2) and
  11.             (y1 > y2) and (y1 < y2 + h2))
  12. end
  13.  
  14.  
  15.  
  16. function M.intersect(x1, y1, w1, h1, x2, y2, w2, h2)
  17.     local mx1 = x1
  18.     local my1 = y1
  19.     local Mx1 = x1 + w1
  20.     local My1 = y1 + h1
  21.  
  22.     if mx1 > Mx1 then
  23.         mx1, Mx1 = Mx1, mx1
  24.     end
  25.  
  26.     if my1 > My1 then
  27.         mx1, Mx1 = Mx1, mx1
  28.     end
  29.  
  30.     local mx2 = x2
  31.     local my2 = y2
  32.     local Mx2 = x2 + w2
  33.     local My2 = y2 + h2
  34.  
  35.     if mx2 > Mx2 then
  36.         mx2, Mx2 = Mx2, mx2
  37.     end
  38.  
  39.     if my2 > My2 then
  40.         mx2, Mx2 = Mx2, mx2
  41.     end
  42.  
  43.     local rx = math.max(mx1, mx2)
  44.     local ry = math.max(my1, my2)
  45.     local rw = math.min(Mx1, Mx2)
  46.     local rh = math.min(My1, My2)
  47.  
  48.     rw = rw - rx
  49.     rh = rh - ry
  50.  
  51.     return rw > 0 and rh > 0, rx, ry, rw, rh
  52. end
  53.  
  54. function M.collide(x1, y1, w1, h1, x2, y2, w2, h2)
  55.   if not M.aabb(x1, y1, w1, h1, x2, y2, w2, h2) then
  56.     return false, 0, 0
  57.   end
  58.   local vx = x1 + w1 * .5 - x2 - w2 * .5
  59.   local vy = y1 + h1 * .5 - y2 - h2 * .5
  60.  
  61.   vx = vx > 0 and x2 + w2 - x1 or x2 - x1 - w1
  62.   vy = vy > 0 and y2 + h2 - y1 or y2 - y1 - h1
  63.   local xAxis = math.abs(vx) < math.abs(vy)
  64.  
  65.   return true, xAxis and vx or 0, xAxis and 0 or vy
  66. end
  67.  
  68. return M
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement