-- Metatable. local Player = { x = 14, y = 12, frame = 1, animation = "idle", moved = false, target_x = 14, call, } Player.__index = Player -- Craete new empty Player object. local function newPlayer() return setmetatable({}, Player) end -- Position related functions. function Player:getPosition() return self.x, self.y end function Player:setPosition(x, y) self.x, self.y = x, y return self end -- Facing. function Player:getFacing() if self.animation == "walk" then if (self.target_x - self.x) < 0 then return -1 end end return 1 end -- Target. function Player:setTarget(x, y, prop) if Game.inRange(x, y) then self.target_x = x self.prop = prop end end -- Change animation. function Player:changeAnimation(name) if self.animation ~= name then self.animation = name self.frame = 1 end return self end -- LÖVE2D callbacks. function Player:update() -- Animation. local frames = #Game.quads.player[self.animation] self.frame = (self.frame%frames)+1 -- Movement towards target. self.moved = false if math.abs(self.x - self.target_x) > 2 then self:changeAnimation("walk") else self:changeAnimation("idle") if self.prop then print("Using prop...") self.prop:use() self.prop = nil end end -- Walking. if self.animation == "walk" and not self.moved and (self.frame == 1 or self.frame == 3 or self.frame == 5) then self.x = self.x + self:getFacing() self.moved = true end end function Player:draw(scale) local quad = Game.quads.player[self.animation][self.frame] local sprite = Game.sprites.player local x, y = self:getPosition() love.graphics.setColor(255,255,255) love.graphics.draw(sprite, quad, (x)*scale, (y)*scale, 0, scale*self:getFacing(), scale, 4) end return newPlayer