Advertisement
Guest User

Untitled

a guest
Nov 14th, 2014
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.49 KB | None | 0 0
  1. function resolveCollisions()
  2.     for i, obj1_key in ipairs(entityLib) do
  3.         for j, obj2_key in ipairs(entityLib) do
  4.             obj1 = obj1_key.obj
  5.             obj2 = obj2_key.obj
  6.             for k, obj1_id in ipairs(obj1) do
  7.                 for l, obj2_id in ipairs(obj2) do
  8.                     if obj1_id ~= obj2_id then
  9.                         collideEntity(obj1, obj1_id, obj2, obj2_id)
  10.                     end
  11.                 end
  12.             end
  13.         end
  14.  
  15.         for j, obj2_key in ipairs(blockLib) do
  16.             obj1 = obj1_key.obj
  17.             obj2 = obj2_key.obj
  18.             for k, obj1_id in ipairs(obj1) do
  19.                 for l, obj2_id in ipairs(obj2) do
  20.                     if obj2_id["flags"]["collision"] then
  21.                         collideBlock(obj1, obj1_id, obj2, obj2_id)
  22.                     end
  23.                 end
  24.             end
  25.         end
  26.     end
  27. end
  28.  
  29. function collideBlock(obj1, id1, obj2, id2)
  30.     x1, y1 = entity.getPos(id1)
  31.     w1, h1 = entity.getSize(obj1)
  32.     x2, y2 = block.getPos(id2)
  33.     w2, h2 = block.getSize(obj2)
  34.  
  35.     local width = math.min(x1+w1, x2+w2) - math.max(x1, x2)
  36.     local height = math.min(y1+h1, y2+h2) - math.max(y1, y2)
  37.  
  38.     dir = isColliding(x1, y1, w1, h1, x2, y2, w2, h2)
  39.  
  40.     if dir == "top" then
  41.         entity.addPos(id1, 0, height)
  42.         entity.setVel(id1, nil, 0)
  43.     elseif dir == "bottom" then
  44.         entity.addPos(id1, 0, height*-1)
  45.         entity.ground(id1)
  46.     elseif dir == "left" then
  47.         entity.addPos(id1, width, 0)
  48.         xVel = entity.getVel(id1)
  49.         if xVel < 0 then
  50.             entity.setVel(id1, 10, nil)
  51.         end
  52.     elseif dir == "right" then
  53.         entity.addPos(id1, width*-1, 0)
  54.         xVel = entity.getVel(id1)
  55.         if xVel > 0 then
  56.             entity.setVel(id1, -10, nil)
  57.         end
  58.     end
  59. end
  60.  
  61. function collideEntity(obj1, id1, obj1, id2)
  62.     x1, y1 = entity.getPos(id1)
  63.     w1, h1 = entity.getSize(obj1)
  64.     x2, y2 = entity.getPos(id2)
  65.     w2, h2 = entity.getSize(obj2)
  66.  
  67.     local width = math.min(x1+w1, x2+w2) - math.max(x1, x2)
  68.     local height = math.min(y1+h1, y2+h2) - math.max(y1, y2)
  69.  
  70.     dir = isColliding(x1, y1, w1, h1, x2, y2, w2, h2)
  71.  
  72.     if dir == "top" then
  73.         entity.addPos(id1, 0, height/2)
  74.         entity.setVel(id1, nil, 0)
  75.  
  76.         entity.addPos(id2, 0, height/2*-1)
  77.         entity.setVel(id2, nil, 0)
  78.         entity.ground(id2)
  79.     elseif dir == "bottom" then
  80.         entity.addPos(id1, 0, height/2*-1)
  81.         entity.setVel(id1, nil, 0)
  82.         entity.ground(id1) 
  83.  
  84.         entity.addPos(id2, 0, height/2)
  85.         entity.setVel(id2, nil, 0)
  86.     elseif dir == "left" then
  87.         entity.addPos(id1, width/2, 0)
  88.         xVel1 = entity.getVel(id1)
  89.  
  90.  
  91.         entity.addPos(id2, width/2*-1, 0)
  92.         xVel2 = entity.getVel(id2)
  93.    
  94.         if obj1 ~= player and obj2 ~= player then
  95.             if xVel1 < 0 then
  96.                 entity.setVel(id1, 1, nil)
  97.             end
  98.             if xVel2 > 0 then
  99.                 entity2.setVel(id2, -1, nil)
  100.             end
  101.         end
  102.     elseif dir == "right" then
  103.         entity.addPos(id1, width/2*-1, 0)
  104.         xVel1 = entity.getVel(id1)
  105.  
  106.         entity.addPos(id2, width/2, 0)
  107.         xVel2 = entity.getVel(id2)
  108.        
  109.         if obj1 ~= player and obj2 ~= player then
  110.             if xVel1 < 0 then
  111.                 entity.setVel(id1, 1, nil)
  112.             end
  113.             if xVel2 > 0 then
  114.                 entity.setVel(id2, -1, nil)
  115.             end
  116.         end
  117.     end
  118. end
  119.  
  120.  
  121. function isColliding(x1, y1, w1, h1, x2, y2, w2, h2)
  122.     local p1x, p1y = math.max(x1, x2), math.max(y1, y2)
  123.     local p2x, p2y = math.min(x1+w1, x2+w2), math.min(y1+h1, y2+h2)
  124.  
  125.     if p2x-p1x > 0 and p2y-p1y > 0 then
  126.         return getCollisionSide(x1, y1, w1, h1, x2, y2, w2, h2)
  127.     end
  128. end
  129.  
  130. function getCollisionSide(x1, y1, w1, h1, x2, y2, w2, h2)
  131.     local m1x, m1y = x1+w1/2, y1+h1/2
  132.     local m2x, m2y = x2+w2/2, y2+h2/2
  133.  
  134.     if math.abs(m1x-m2x) > math.abs(m1y-m2y) then
  135.         if m1x-m2x < 0 then
  136.             return "right"
  137.         else
  138.             return "left"
  139.         end
  140.     else
  141.         if m1y-m2y < 0 then
  142.             return "bottom"
  143.         elseif m1y-m2y > 0 then
  144.             return "top"
  145.         end
  146.     end
  147. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement