165 lines
4.5 KiB
Lua
165 lines
4.5 KiB
Lua
local ParallaxBackground = Object:extend()
|
|
|
|
local maputils = require "scenes.battlesystem.utils"
|
|
|
|
function ParallaxBackground:new(scene, height, bottomBorder, type)
|
|
self.scene = scene
|
|
self.assets = self.scene.assets
|
|
|
|
self.datas = {}
|
|
self.datas.type = type or "forest"
|
|
|
|
self.height = height
|
|
self.bottomBorder = bottomBorder
|
|
|
|
local zones = require "datas.gamedata.maps.shoot.zones"
|
|
local datas = zones[self.datas.type]
|
|
self.datas.background = datas.background
|
|
self.datas.tiles = datas.tiles
|
|
self.datas.borders = datas.borders
|
|
|
|
self.assets:addTileset("normaltiles", "assets/backgrounds/normaltile")
|
|
self.assets:addTileset("borders", "assets/backgrounds/borders")
|
|
|
|
local backpath = "assets/backgrounds/parallax/" .. self.datas.background
|
|
self.assets:addImage("back1", backpath .. "-back.png")
|
|
self.assets:addImage("back2", backpath .. "-fore.png")
|
|
self.assets:addImage("cliff", backpath .. "-cliff.png")
|
|
|
|
self.texture = {}
|
|
self.texture.floor = self:generateFloor(tile)
|
|
end
|
|
|
|
-- GET FUNCTIONS
|
|
-- Get information from the map
|
|
|
|
function ParallaxBackground:getTotalHeight()
|
|
return self.height + self.bottomBorder;
|
|
end
|
|
|
|
function ParallaxBackground:getTerrain(x, y)
|
|
if (y <= self.height) then
|
|
return 0
|
|
else
|
|
return nil
|
|
end
|
|
end
|
|
|
|
function ParallaxBackground:isInGrid(x, y)
|
|
return ( self:getTerrain(x, y) ~= nil )
|
|
end
|
|
|
|
function ParallaxBackground:getStartY()
|
|
return 240 - (self:getTotalHeight() * 20) - 10
|
|
end
|
|
|
|
function ParallaxBackground:gridToPixel(x, y, center)
|
|
local pixelx, pixely
|
|
local center = center or false
|
|
local x, y = x, y
|
|
|
|
if (center) then
|
|
x = x + .5
|
|
y = y + .5
|
|
end
|
|
|
|
pixelx = maputils.CONST.STARTX + ((x-1) * 31) + ((y-1) * 10)
|
|
pixely = self:getStartY() + ((y-1) * 20)
|
|
|
|
return math.floor(pixelx), math.floor(pixely)
|
|
end
|
|
|
|
-- DRAW FUNCTIONS
|
|
-- Draw the battle map
|
|
|
|
function ParallaxBackground:generateFloor(tile)
|
|
local canvas = love.graphics.newCanvas(31*16, self:getTotalHeight() * 20)
|
|
local tile = tile or 1
|
|
|
|
love.graphics.setCanvas( canvas )
|
|
|
|
for i=1, self:getTotalHeight() do
|
|
for j=0, 18 do
|
|
local tiley = (i-1)*20
|
|
local tilex = (j-2)*31 + (i-1)*10
|
|
local variant = 1 + ((i + j) % 2)
|
|
local tiles = self.datas.tiles*2 + variant
|
|
if (not self:isInGrid(j, i)) then
|
|
love.graphics.setColor(.66, .66, .66, 1)
|
|
end
|
|
self.assets.tileset["normaltiles"]:drawTile(tiles, tilex, tiley)
|
|
utils.graphics.resetColor()
|
|
end
|
|
end
|
|
|
|
love.graphics.setCanvas( )
|
|
|
|
local imagedata = canvas:newImageData()
|
|
local texture = love.graphics.newImage( imagedata )
|
|
imagedata:release()
|
|
canvas:release()
|
|
return texture
|
|
end
|
|
|
|
function ParallaxBackground:draw()
|
|
self:drawParallax(0, -self:getStartY(), 424, 240)
|
|
end
|
|
|
|
function ParallaxBackground:drawParallax(x, y, w, h)
|
|
self:drawBackground(x, y, w, h)
|
|
self:drawForeground(x, y, w, h)
|
|
--love.graphics.draw(self.texture.floor, maputils.CONST.STARTX, self:getStartY())
|
|
local w2, _ = self.texture.floor:getDimensions()
|
|
for i=1, 2 do
|
|
local x2 = x % w2
|
|
love.graphics.draw(self.texture.floor, ((i-1)*31*16)-x2, -y)
|
|
end
|
|
self:drawBorders(x, y, w, h)
|
|
end
|
|
|
|
|
|
function ParallaxBackground:drawBackgrounds()
|
|
local w, _ = core.screen:getDimensions()
|
|
|
|
local w2, h2 = self.assets.images["back1"]:getDimensions()
|
|
local imax = math.ceil(w / w2) + 1
|
|
for i=1, imax do
|
|
self.assets.images["back1"]:draw((i-1)*w2, 0, 0, 1, 1)
|
|
end
|
|
|
|
local w2, h2 = self.assets.images["back2"]:getDimensions()
|
|
local imax = math.ceil(w / w2) + 1
|
|
for i=1, imax do
|
|
self.assets.images["back2"]:draw((i-1)*w2, self:getStartY()-h2, 0, 1, 1)
|
|
end
|
|
|
|
end
|
|
|
|
function ParallaxBackground:drawBackground(x, y, w, h)
|
|
local w2, h2 = self.assets.images["back1"]:getDimensions()
|
|
local imax = math.ceil(w / w2) + 1
|
|
for i=1, imax do
|
|
local x1 = (x / 5) % w2
|
|
self.assets.images["back1"]:draw((i-1)*w2 - x1, 0, 0, 1, 1, 0, 0)
|
|
end
|
|
end
|
|
|
|
function ParallaxBackground:drawForeground(x, y, w, h)
|
|
local w2, h2 = self.assets.images["back2"]:getDimensions()
|
|
local imax = math.ceil(w / w2) + 1
|
|
for i=1, imax do
|
|
local x1 = (x / 2) % w2
|
|
self.assets.images["back2"]:draw((i-1)*w2 - x1, -y-10, 0, 1, 1, 0, h2)
|
|
end
|
|
end
|
|
|
|
function ParallaxBackground:drawBorders(x, y)
|
|
local border = self.datas.borders + 1
|
|
for i=1, 7 do
|
|
local x2 = x % 80
|
|
self.assets.tileset["borders"]:drawTile(border, (i-1)*80 - x2, -y, 0, 1, 1, 0, 10)
|
|
self.assets.tileset["borders"]:drawTile(border, (i-1)*80 - x2, -(y-self:getTotalHeight()*20), 0, 1, 1)
|
|
end
|
|
end
|
|
|
|
return ParallaxBackground
|