From: Clifton James Palmer Date: Sun, 9 Dec 2018 00:46:26 +0000 (-0600) Subject: Fixed crashes better. Bug on collision on 1st line. Cannot tell who crashed. X-Git-Url: http://git.purplebirdman.com/lightcycles-love.git/commitdiff_plain/0937f63ff7efb3ec6707adabdfe3d52a3296315b?ds=inline Fixed crashes better. Bug on collision on 1st line. Cannot tell who crashed. --- diff --git a/main.lua b/main.lua index 69591dd..a0d0ca7 100644 --- a/main.lua +++ b/main.lua @@ -14,9 +14,7 @@ function love.update(dt) if love.keyboard.isDown('escape') then love.event.quit() end - if not scene.paused then - scene:update(dt) - end + scene:update(dt) end function love.quit() diff --git a/player.lua b/player.lua index 0a37a0b..9ec8fcd 100644 --- a/player.lua +++ b/player.lua @@ -9,6 +9,7 @@ Player.acceleration = 100 Player.position = vec2:new(0, 0) Player.vector = vec2:new(0, 0) Player.path = {} +Player.path.vector = Player.position Player.vectors = { up = vec2:new(0, -1), down = vec2:new(0, 1), @@ -26,6 +27,7 @@ function Player:new(o) o = o or {} setmetatable(o, self) self.__index = self + o.path.vector = o.position o:recordPosition() return o end @@ -35,10 +37,17 @@ function Player:__tostring() end function Player:drawPath() - if #self.path >= 4 then + local points = {} + local node = self.path + while node do + table.insert(points, node.vector.x) + table.insert(points, node.vector.y) + node = node.prev + end + if #points >= 4 then love.graphics.setLineWidth(2) love.graphics.setColor(self.color) - love.graphics.line(self.path) + love.graphics.line(points) end end @@ -51,17 +60,18 @@ function Player:draw() self.width, self.height ) - - -- add current position - self:recordPosition() self:drawPath() - table.remove(self.path) - table.remove(self.path) end function Player:recordPosition() - table.insert(self.path, self.position.x) - table.insert(self.path, self.position.y) + local v = vec2:new(self.position.x, self.position.y) + self.position = v + print('Recording position for '..tostring(self)..': '..tostring(self.position)) + local node = {} + node.vector = v + node.prev = self.path + self.path.next = node + self.path = node end function Player:multiple_keys_are_pressed() @@ -87,5 +97,5 @@ function Player:update(dt) end end end - self.position = self.position + self.vector * self.acceleration * dt + self.position:add(self.vector * self.acceleration * dt) end diff --git a/scene.lua b/scene.lua index 83960e6..213d34a 100644 --- a/scene.lua +++ b/scene.lua @@ -68,23 +68,23 @@ function doLinesIntersect(x1,y1, x2,y2, x3,y3, x4,y4) -- if lines are parallel, no intersection! elseif x1 == x2 and y3 == y4 then intersect = ( - x3 <= x1 and x1 <= x4 + x3 < x1 and x1 < x4 or - x4 <= x1 and x1 <= x3 + x4 < x1 and x1 < x3 ) and ( - y1 <= y3 and y3 <= y2 + y1 < y3 and y3 < y2 or - y2 <= y3 and y3 <= y1 + y2 < y3 and y3 < y1 ) elseif x3 == x4 and y1 == y2 then intersect = ( - x1 <= x3 and x3 <= x2 + x1 < x3 and x3 < x2 or - x2 <= x3 and x3 <= x1 + x2 < x3 and x3 < x1 ) and ( - y3 <= y1 and y1 <= y4 + y3 < y1 and y1 < y4 or - y4 <= y1 and y1 <= y3 + y4 < y1 and y1 < y3 ) else print('You should never see this message') @@ -100,32 +100,24 @@ function doLinesIntersect(x1,y1, x2,y2, x3,y3, x4,y4) return intersect end -function doesLineIntersectPlayerPaths(path, x1,y1, x2,y2) - local cache = {} - cache.a = {} - cache.b = {} +function doesLineIntersectPlayerPaths(node, v1, v2) -- for every line in path, -- check intersection with player line - for k,v in pairs(path) do - if #cache.a == 2 then - if #cache.b == 2 then - if doLinesIntersect(x1,y1, x2,y2, cache.a[1],cache.a[2], cache.b[1],cache.b[2]) then - return true - end - end - cache.b = cache.a - cache.a = {} + while node and node.prev do + local v3 = node.vector + local v4 = node.prev.vector + if doLinesIntersect(v1.x,v1.y, v2.x,v2.y, v3.x,v3.y, v4.x,v4.y) then + return true end - table.insert(cache.a,v) + node = node.prev end return false end -- love collision handler function collision(player) - print('Player '..tostring(player)..' crashed!') + print(player..' crashed!') scene.paused = true - --love.event.quit() end love.handlers.collision = collision @@ -133,24 +125,24 @@ function scene:handleCollisions() -- calculate the last line for each player from current position -- check if line intersects any other path line -- if so, raise collision event for player + -- only check last line for intersection, since all the rest should be ok for _,player in pairs(self.players) do - local x1 = player.path[#player.path-1] - local y1 = player.path[#player.path] - local x2 = player.position.x - local y2 = player.position.y - - -- check intersection against each existing path + local v1 = player.path.vector + local v2 = player.path.prev.vector for _,player2 in pairs(self.players) do - if doesLineIntersectPlayerPaths(player2.path, x1, y1, x2, y2) then - love.event.push('collision', player) + if doesLineIntersectPlayerPaths(player2.path, v1, v2) then + love.event.push('collision', tostring(player)) + break end end end end function scene:update(dt) - self:updatePlayers(dt) - self:handleCollisions() + if not self.paused then + self:updatePlayers(dt) + self:handleCollisions() + end end -- quit diff --git a/vec2.lua b/vec2.lua index 4d6a011..34fe853 100644 --- a/vec2.lua +++ b/vec2.lua @@ -37,6 +37,12 @@ function vec2:__add(v) return vec2:new(self.x + v.x, self.y + v.y) end +function vec2:add(v) + assert(isvector(v), "Expected a vec2 type") + self.x = self.x + v.x + self.y = self.y + v.y +end + function vec2:__sub(v) assert(isvector(v), "Expected a vec2 type") return vec2:new(self.x - v.x, self.y - v.y)