diff --git a/animation.lua b/animation.lua new file mode 100644 index 0000000..bbcf30f --- /dev/null +++ b/animation.lua @@ -0,0 +1,30 @@ +local __Animation = { + spriteSheet = nil, + quads = nil, + fps = 12, + currentTime = 0 +} + +function Animation(image, width, height) + local animation = {} + animation.spriteSheet = image; + animation.quads = {}; + + for y = 0, image:getHeight() - height, height do + for x = 0, image:getWidth() - width, width do + table.insert(animation.quads, love.graphics.newQuad(x, y, width, height, image:getDimensions())) + end + end + + return setmetatable(animation, { __index = __Animation }) +end + +function __Animation:getFrame() + local frametime = 1 / self.fps + local frame = math.floor(self.currentTime / frametime) + return self.quads[frame + 1] +end + +function __Animation:update(dt) + self.currentTime = (self.currentTime + dt) % (#self.quads / self.fps) +end diff --git a/asset_bundle.lua b/asset_bundle.lua new file mode 100644 index 0000000..6ef99ce --- /dev/null +++ b/asset_bundle.lua @@ -0,0 +1,47 @@ +require "option.option" + +AssetBundle = { + root = "/assets", + files = {} +} + +function AssetBundle:load() + local function enumerate(path) + local tree = {} + + local contents = love.filesystem.getDirectoryItems(path) + for _, v in pairs(contents) do + local newPath = path .. "/" .. v + local type = love.filesystem.getInfo(newPath).type + if type == "file" then + local data = self.loadFile(newPath) + if data:is_some() then + tree[self.cutExtension(v)] = data:unwrap() + end + end + if type == "directory" then + tree[v] = enumerate(newPath) + end + end + + return tree + end + + self.files = enumerate(self.root) +end + +function AssetBundle.loadFile(path) + local filedata = love.filesystem.newFileData(path) + local ext = filedata:getExtension() + if (ext == "png") then + local img = love.graphics.newImage(path) + img:setFilter("nearest", "nearest") + return + Some(img) + end + return None +end + +function AssetBundle.cutExtension(filename) + return string.match(filename, '(.+)%.(.+)') +end diff --git a/player.png b/assets/fallback.png similarity index 100% rename from player.png rename to assets/fallback.png diff --git a/assets/sprites/deer/walk_e.png b/assets/sprites/deer/walk_e.png new file mode 100644 index 0000000..abfb279 Binary files /dev/null and b/assets/sprites/deer/walk_e.png differ diff --git a/assets/sprites/deer/walk_w.png b/assets/sprites/deer/walk_w.png new file mode 100644 index 0000000..945723d Binary files /dev/null and b/assets/sprites/deer/walk_w.png differ diff --git a/deer_walking.png b/deer_walking.png new file mode 100644 index 0000000..abfb279 Binary files /dev/null and b/deer_walking.png differ diff --git a/deer_walking_l.png b/deer_walking_l.png new file mode 100644 index 0000000..945723d Binary files /dev/null and b/deer_walking_l.png differ diff --git a/entity.lua b/entity.lua new file mode 100644 index 0000000..064bf8b --- /dev/null +++ b/entity.lua @@ -0,0 +1,13 @@ +local __Entity = { + sprite = {}, + position = Vec3 {}, + velocity = Vec3 {} +} + +function __Entity:update() + +end + +local __Sprite = { + +} diff --git a/main.lua b/main.lua index 54c353b..57fd384 100644 --- a/main.lua +++ b/main.lua @@ -31,8 +31,6 @@ end function Player:init() self.position = vec2(0, 0) self.velocity = vec2(0, 0) - - self.sprite = love.graphics.newImage("player.png") end function Player:update(dt) @@ -63,18 +61,32 @@ function Player:update(dt) -- print(vec2_length(self.velocity)) end +require "animation" +require "asset_bundle" + +AssetBundle:load() + + function love.load() Player:init() + local sheet_r = AssetBundle.files.sprites.deer.walk_e + local sheet_l = AssetBundle.files.sprites.deer.walk_w + + animation_r = Animation(sheet_r, 64, 64) + animation_l = Animation(sheet_l, 64, 64) end function love.update(dt) Player:update(dt) + animation_r:update(dt) + animation_l:update(dt) end function love.draw() - love.graphics.draw(Player.sprite, Player.position().x, Player.position().y) + local animation = Player.velocity().x > 0 and animation_r or animation_l + love.graphics.draw(animation.spriteSheet, animation:getFrame(), Player.position().x, Player.position().y, 0, 4, 4) end function love.conf(t) t.console = true -end \ No newline at end of file +end