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),
o = o or {}
setmetatable(o, self)
self.__index = self
+ o.path.vector = o.position
o:recordPosition()
return o
end
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
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()
end
end
end
- self.position = self.position + self.vector * self.acceleration * dt
+ self.position:add(self.vector * self.acceleration * dt)
end
-- 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')
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
-- 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