]> Untitled Git - lightcycles-love.git/commitdiff
Added vector class
authorClifton James Palmer <clifton.palmer@gmail.com>
Sat, 8 Dec 2018 07:31:54 +0000 (01:31 -0600)
committerClifton James Palmer <clifton.palmer@gmail.com>
Sat, 8 Dec 2018 07:31:54 +0000 (01:31 -0600)
main.lua
player.lua
vec2.lua [new file with mode: 0644]

index 2995ef8583f63a1ee800c5791ea33a3cf08708ac..c364b1300c11dea9cc187791e7b5a7993ff8a521 100644 (file)
--- a/main.lua
+++ b/main.lua
@@ -1,9 +1,10 @@
 -- main
 
 -- main
 
+require 'vec2'
 require 'player'
 
 function love.load()
 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()
 end
 
 function love.draw()
index 42c0f62938f57f16ad9821ff74d81cd88b6cda7f..c84b4f8a97686d728997f764c8ba40bcdb70b005 100644 (file)
@@ -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 = {}
 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.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 {}
 
 function Player:new(o)
     o = o or {}
@@ -40,20 +54,15 @@ function Player:recordPosition()
 end
 
 function Player:update(dt)
 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
     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
 end
diff --git a/vec2.lua b/vec2.lua
new file mode 100644 (file)
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