Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function resolveCollisions()
- for i, obj1_key in ipairs(entityLib) do
- for j, obj2_key in ipairs(entityLib) do
- obj1 = obj1_key.obj
- obj2 = obj2_key.obj
- for k, obj1_id in ipairs(obj1) do
- for l, obj2_id in ipairs(obj2) do
- if obj1_id ~= obj2_id then
- collideEntity(obj1, obj1_id, obj2, obj2_id)
- end
- end
- end
- end
- for j, obj2_key in ipairs(blockLib) do
- obj1 = obj1_key.obj
- obj2 = obj2_key.obj
- for k, obj1_id in ipairs(obj1) do
- for l, obj2_id in ipairs(obj2) do
- if obj2_id["flags"]["collision"] then
- collideBlock(obj1, obj1_id, obj2, obj2_id)
- end
- end
- end
- end
- end
- end
- function collideBlock(obj1, id1, obj2, id2)
- x1, y1 = entity.getPos(id1)
- w1, h1 = entity.getSize(obj1)
- x2, y2 = block.getPos(id2)
- w2, h2 = block.getSize(obj2)
- local width = math.min(x1+w1, x2+w2) - math.max(x1, x2)
- local height = math.min(y1+h1, y2+h2) - math.max(y1, y2)
- dir = isColliding(x1, y1, w1, h1, x2, y2, w2, h2)
- if dir == "top" then
- entity.addPos(id1, 0, height)
- entity.setVel(id1, nil, 0)
- elseif dir == "bottom" then
- entity.addPos(id1, 0, height*-1)
- entity.ground(id1)
- elseif dir == "left" then
- entity.addPos(id1, width, 0)
- xVel = entity.getVel(id1)
- if xVel < 0 then
- entity.setVel(id1, 10, nil)
- end
- elseif dir == "right" then
- entity.addPos(id1, width*-1, 0)
- xVel = entity.getVel(id1)
- if xVel > 0 then
- entity.setVel(id1, -10, nil)
- end
- end
- end
- function collideEntity(obj1, id1, obj1, id2)
- x1, y1 = entity.getPos(id1)
- w1, h1 = entity.getSize(obj1)
- x2, y2 = entity.getPos(id2)
- w2, h2 = entity.getSize(obj2)
- local width = math.min(x1+w1, x2+w2) - math.max(x1, x2)
- local height = math.min(y1+h1, y2+h2) - math.max(y1, y2)
- dir = isColliding(x1, y1, w1, h1, x2, y2, w2, h2)
- if dir == "top" then
- entity.addPos(id1, 0, height/2)
- entity.setVel(id1, nil, 0)
- entity.addPos(id2, 0, height/2*-1)
- entity.setVel(id2, nil, 0)
- entity.ground(id2)
- elseif dir == "bottom" then
- entity.addPos(id1, 0, height/2*-1)
- entity.setVel(id1, nil, 0)
- entity.ground(id1)
- entity.addPos(id2, 0, height/2)
- entity.setVel(id2, nil, 0)
- elseif dir == "left" then
- entity.addPos(id1, width/2, 0)
- xVel1 = entity.getVel(id1)
- entity.addPos(id2, width/2*-1, 0)
- xVel2 = entity.getVel(id2)
- if obj1 ~= player and obj2 ~= player then
- if xVel1 < 0 then
- entity.setVel(id1, 1, nil)
- end
- if xVel2 > 0 then
- entity2.setVel(id2, -1, nil)
- end
- end
- elseif dir == "right" then
- entity.addPos(id1, width/2*-1, 0)
- xVel1 = entity.getVel(id1)
- entity.addPos(id2, width/2, 0)
- xVel2 = entity.getVel(id2)
- if obj1 ~= player and obj2 ~= player then
- if xVel1 < 0 then
- entity.setVel(id1, 1, nil)
- end
- if xVel2 > 0 then
- entity.setVel(id2, -1, nil)
- end
- end
- end
- end
- function isColliding(x1, y1, w1, h1, x2, y2, w2, h2)
- local p1x, p1y = math.max(x1, x2), math.max(y1, y2)
- local p2x, p2y = math.min(x1+w1, x2+w2), math.min(y1+h1, y2+h2)
- if p2x-p1x > 0 and p2y-p1y > 0 then
- return getCollisionSide(x1, y1, w1, h1, x2, y2, w2, h2)
- end
- end
- function getCollisionSide(x1, y1, w1, h1, x2, y2, w2, h2)
- local m1x, m1y = x1+w1/2, y1+h1/2
- local m2x, m2y = x2+w2/2, y2+h2/2
- if math.abs(m1x-m2x) > math.abs(m1y-m2y) then
- if m1x-m2x < 0 then
- return "right"
- else
- return "left"
- end
- else
- if m1y-m2y < 0 then
- return "bottom"
- elseif m1y-m2y > 0 then
- return "top"
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement