X-Git-Url: http://git.purplebirdman.com/lightcycles-love.git/blobdiff_plain/efb40087b3a510e92f88763de2e8b4d8da2d347f..HEAD:/player.lua diff --git a/player.lua b/player.lua index 42c0f62..0606cb8 100644 --- a/player.lua +++ b/player.lua @@ -1,59 +1,101 @@ +require 'vec2' + Player = {} -Player.name = 'player' +Player.name = 'none' Player.color = {255, 0, 0} Player.width = 5 Player.height = 5 -Player.acceleration = 100 -Player.position = {x=0, y=0} -Player.vector = {x=0, y=0} +Player.acceleration = 200 +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), + left = vec2:new(-1, 0), + right = vec2:new(1, 0), + } +Player.keys = { + w = 'up', + s = 'down', + a = 'left', + d = 'right', + } function Player:new(o) o = o or {} setmetatable(o, self) self.__index = self + o.path.vector = o.position o:recordPosition() return o end +function Player:__tostring() + return self.name +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 function Player:draw() love.graphics.setColor(self.color) - love.graphics.rectangle('fill', self.position.x, self.position.y, self.width, self.height) - - -- add current position - self:recordPosition() + love.graphics.rectangle( + 'fill', + self.position.x-self.width/2, + self.position.y-self.height/2, + self.width, + self.height + ) self:drawPath() - table.remove(self.path) - table.remove(self.path) end function Player:recordPosition() - table.insert(self.path, self.position.x + self.width/2) - table.insert(self.path, self.position.y + self.height/2) + 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:update(dt) - if love.keyboard.isDown("w") then - self.vector = {x=0, y=-self.acceleration} - self:recordPosition() - elseif love.keyboard.isDown("s") then - self.vector = {x=0, y=self.acceleration} - self:recordPosition() - elseif love.keyboard.isDown("a") then - self.vector = {x=-self.acceleration, y=0} - self:recordPosition() - elseif love.keyboard.isDown("d") then - self.vector = {x=self.acceleration, y=0} - self:recordPosition() +function Player:multiple_keys_are_pressed() + local count = 0 + for key,_ in pairs(self.keys) do + if love.keyboard.isDown(key) then + count = count + 1 + end end + return count > 1 +end - self.position.x = self.position.x + self.vector.x * dt - self.position.y = self.position.y + self.vector.y * dt +function Player:update(dt) + if not self:multiple_keys_are_pressed() then + for key, name in pairs(self.keys) do + if love.keyboard.isDown(key) + and self.vector ~= self.vectors[name] + and (self.vector + self.vectors[name]):length() > 0 + then + self.vector = self.vectors[name] + self:recordPosition() + break + end + end + end + self.position:add(self.vector * self.acceleration * dt) end