view main.lua @ 6:301a5bd338fb

define mob graphics in the map
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sat, 15 Dec 2012 14:30:07 +0100
parents 98ab870293bc
children dd17a136b402
line wrap: on
line source

local ATL = require("AdvTiledLoader") 
local anim8 = require("anim8") 
local sprite = require("sprite") 

local SPRITES = {}
local SHADOWS = {}
local MAP
local tx, ty = 0, 0
local DX = {0, 1, 0, -1}
local DY = {-1, 0, 1, 0}
local SHADOW_IMAGE
local MOBS_IMAGE
local GRID = anim8.newGrid(64, 64, 128, 128)
local scroll_speed = 250
local scroll_margin = 64


function newMob(x, y, cells)
    local mob = {}
    mob.sprite = sprite.newSprite(
        x - 32, y - 60, MOBS_IMAGE,
        anim8.newAnimation('loop', GRID(cells), 0.25)
    )
    mob.shadow = sprite.newShadow(SHADOW_IMAGE, mob.sprite)
    table.insert(SPRITES, mob.sprite)
    table.insert(SHADOWS, mob.shadow)
    return mob
end

function makeVillain(villain)
    function villain.sprite:walk(dt, dir)
        local x = self.x + DX[dir] * dt * 250
        local y = self.y + DY[dir] * dt * 250
        local tx, ty = math.floor((x+32)/48), math.floor((y+60)/48)
        local cell = MAP.layers['control']:get(tx, ty)
        if cell and cell.properties and cell.properties.block == 0 then
            self.x = x
            self.y = y
        end
    end
    function villain.sprite:update(dt)
        local villain = self
        if love.keyboard.isDown("up") then villain:walk(dt, 1) end
        if love.keyboard.isDown("right") then villain:walk(dt, 2) end
        if love.keyboard.isDown("down") then villain:walk(dt, 3) end
        if love.keyboard.isDown("left") then villain:walk(dt, 4) end
        if villain.x + tx < scroll_margin then
            tx = tx + dt * scroll_speed
        else
            if villain.x + tx > 800 - 64 - scroll_margin then
                tx = tx - dt * scroll_speed
            end
        end
        if villain.y + ty < scroll_margin then
            ty = ty + dt * scroll_speed
        else
            if villain.y + ty > 600 - 64 - scroll_margin then
                ty = ty - dt * scroll_speed
            end
        end
        sprite.Sprite.update(self, dt)
    end
    return villain
end

function love.load()
    SHADOW_IMAGE = love.graphics.newImage('shadow.png')
    MOBS_IMAGE = love.graphics.newImage('mobs.png')
    MAP = ATL.Loader.load('level01.tmx') 
    MAP.drawObjects = false
    for i, data in pairs(MAP.layers['mobs'].objects) do
        if data.name == 'villain' then
            local mob = newMob(data.x, data.y, '1-2,1')
            makeVillain(mob)
        else
            local mob = newMob(data.x, data.y, data.properties.cells or '1-2,2')
        end
    end
end


function love.draw()
    love.graphics.translate(math.floor(tx), math.floor(ty))
    MAP:autoDrawRange(math.floor(tx), math.floor(ty), 1, 0)
    MAP:draw()
    for k, shadow in pairs(SHADOWS) do
        shadow:draw()
    end
    for k, sprite in pairs(SPRITES) do
        sprite:draw()
    end
end


function love.update(dt)
    for k, sprite in pairs(SPRITES) do
        sprite:update(dt)
    end
    table.sort(SPRITES, function (a, b) return a.y < b.y end)
end