-- 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()
+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 {}
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
--- /dev/null
+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