From: Clifton James Palmer Date: Sat, 8 Dec 2018 07:31:54 +0000 (-0600) Subject: Added vector class X-Git-Url: http://git.purplebirdman.com/lightcycles-love.git/commitdiff_plain/49619a3f3f26e831923e425ad7ecf1cd08520212?ds=sidebyside Added vector class --- diff --git a/main.lua b/main.lua index 2995ef8..c364b13 100644 --- a/main.lua +++ b/main.lua @@ -1,9 +1,10 @@ -- main +require 'vec2' require 'player' function love.load() - player = Player:new({position={x=100, y=100}, vector={x=Player.acceleration, y=0}}) + player = Player:new({position=vec2:new(100,100), vector=Player.vectors.right}) end function love.draw() diff --git a/player.lua b/player.lua index 42c0f62..c84b4f8 100644 --- a/player.lua +++ b/player.lua @@ -1,12 +1,26 @@ +require 'vec2' + Player = {} Player.name = 'player' 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.position = vec2:new(0, 0) +Player.vector = vec2:new(0, 0) Player.path = {} +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 {} @@ -40,20 +54,15 @@ function Player:recordPosition() 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() + 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 - - self.position.x = self.position.x + self.vector.x * dt - self.position.y = self.position.y + self.vector.y * dt + self.position = self.position + self.vector * self.acceleration * dt end diff --git a/vec2.lua b/vec2.lua new file mode 100644 index 0000000..4d6a011 --- /dev/null +++ b/vec2.lua @@ -0,0 +1,61 @@ +vec2 = {} +vec2.x = 0 +vec2.y = 0 +vec2.__index = vec2 + +function vec2:new(x,y) + return setmetatable({x=x, y=y}, self) +end + +function vec2:length() + return math.sqrt(self.x * self.x + self.y * self.y) +end + +function vec2:normalize() + local len = self:length() + if len > 0 then + self.x = self.x / len + self.y = self.y / len + end +end + +function vec2:__tostring() + return "("..tonumber(self.x)..","..tonumber(self.y)..")" +end + +local function isvector(v) + return type(v) == 'table' and type(v.x) == 'number' and type(v.y) == 'number' +end + +function vec2:__eq(v) + assert(isvector(v), "Expected a vec2 type") + return self.x == v.x and self.y == v.y +end + +function vec2:__add(v) + assert(isvector(v), "Expected a vec2 type") + return vec2:new(self.x + v.x, 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) +end + +function vec2:__mul(a) + if type(a) == 'number' then + return vec2:new(self.x * a, self.y * a) + else + assert(isvector(a), "Expected a number or vec2 type") + return vec2:new(self.x * a.x, self.y * a.y) + end +end + +function vec2:__div(a) + if type(a) == 'number' then + return vec2:new(self.x / a, self.y / a) + else + assert(isvector(a), "Expected a number or vec2 type") + return vec2:new(self.x / a.x, self.y / a.y) + end +end