From 1ec185cc3aba2dd234a8e8c65e039a6803c9ec27 Mon Sep 17 00:00:00 2001 From: Kazhnuz Date: Sat, 1 Aug 2020 13:34:39 +0200 Subject: [PATCH] improvement: use a common object for parallax handling --- .../modules/drawing/parallaxBackground.lua} | 87 +++++++++----- .../game/modules/world/maps/shoot.lua | 106 +----------------- .../scenes/battlesystem/world.lua | 7 +- 3 files changed, 69 insertions(+), 131 deletions(-) rename sonic-radiance.love/{scenes/battlesystem/map.lua => game/modules/drawing/parallaxBackground.lua} (54%) diff --git a/sonic-radiance.love/scenes/battlesystem/map.lua b/sonic-radiance.love/game/modules/drawing/parallaxBackground.lua similarity index 54% rename from sonic-radiance.love/scenes/battlesystem/map.lua rename to sonic-radiance.love/game/modules/drawing/parallaxBackground.lua index 71d7b57..962ecbf 100644 --- a/sonic-radiance.love/scenes/battlesystem/map.lua +++ b/sonic-radiance.love/game/modules/drawing/parallaxBackground.lua @@ -1,24 +1,26 @@ -local Map = Object:extend() +local ParallaxBackground = Object:extend() local maputils = require "scenes.battlesystem.utils" -local HEIGHT = 5 -local BOTTOM_BORDER = 1 - -function Map:new(world, type, terrain) - self.world = world - self.assets = self.world.assets - self.scene = self.world.scene +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") @@ -31,27 +33,27 @@ end -- GET FUNCTIONS -- Get information from the map -function Map:getTotalHeight() - return HEIGHT + BOTTOM_BORDER; +function ParallaxBackground:getTotalHeight() + return self.height + self.bottomBorder; end -function Map:getTerrain(x, y) - if (y <= HEIGHT) then +function ParallaxBackground:getTerrain(x, y) + if (y <= self.height) then return 0 else return nil end end -function Map:isInGrid(x, y) +function ParallaxBackground:isInGrid(x, y) return ( self:getTerrain(x, y) ~= nil ) end -function Map:getStartY() +function ParallaxBackground:getStartY() return 240 - (self:getTotalHeight() * 20) - 10 end -function Map:gridToPixel(x, y, center) +function ParallaxBackground:gridToPixel(x, y, center) local pixelx, pixely local center = center or false local x, y = x, y @@ -70,7 +72,7 @@ end -- DRAW FUNCTIONS -- Draw the battle map -function Map:generateFloor(tile) +function ParallaxBackground:generateFloor(tile) local canvas = love.graphics.newCanvas(31*16, self:getTotalHeight() * 20) local tile = tile or 1 @@ -99,14 +101,24 @@ function Map:generateFloor(tile) return texture end - -function Map:draw() - self:drawBackgrounds() - self:drawBorders() - love.graphics.draw(self.texture.floor, maputils.CONST.STARTX, self:getStartY()) +function ParallaxBackground:draw() + self:drawParallax(0, -self:getStartY(), 424, 240) end -function Map:drawBackgrounds() +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() @@ -123,12 +135,31 @@ function Map:drawBackgrounds() end -function Map:drawBorders() - local border = self.datas.borders + 1 - for i=1, 7 do - self.assets.tileset["borders"]:drawTile(border, (i-1)*80, self:getStartY()-10 , 0, 1, 1) - self.assets.tileset["borders"]:drawTile(border, (i-1)*80, 240-10, 0, 1, 1) +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 -return Map +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, 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 diff --git a/sonic-radiance.love/game/modules/world/maps/shoot.lua b/sonic-radiance.love/game/modules/world/maps/shoot.lua index 9d31340..cf3c1e9 100644 --- a/sonic-radiance.love/game/modules/world/maps/shoot.lua +++ b/sonic-radiance.love/game/modules/world/maps/shoot.lua @@ -4,13 +4,15 @@ local ShootMap = BaseMap:extend() local TILESIZE = 31 local TESTZONE = "forest" -local zoneDatas = require "datas.gamedata.maps.shoot.zones" +local zoneDatas = require "datas.gamedata.maps.shoot.zones" +local Background = require "game.modules.drawing.parallaxBackground" + function ShootMap:new(world, maptype, mapname) ShootMap.super.new(self, world) self:setPadding(0, 0, 0, 0) - self:generateTextures(2, "tunnel") + self.parallaxBackground = Background(world.scene, 5, 1, "tunnel") end function ShootMap:loadCollisions() @@ -34,112 +36,14 @@ function ShootMap:loadActors() -- Empty Placeholder function end -function ShootMap:generateTextures(tile, background) - - self.texture = {} - self.texture.floor = self:generateFloor(tile) - self.texture.border = love.graphics.newImage("assets/backgrounds/borders.png") - self.quads = {} - local w, h = self.texture.border:getDimensions() - self.quads.borders = love.graphics.newQuad(0, tile*10, 80, 10, w, h) - - self:addParallax(background) -end - -function ShootMap:generateFloor(tile) - local canvas = love.graphics.newCanvas(31*16, 100) - local tile = tile or 1 - - local tileTexture = love.graphics.newImage("assets/backgrounds/normaltile.png") - local tileQuad = {} - local w, h = tileTexture:getDimensions() - tileQuad[1] = love.graphics.newQuad( 0, tile*24, 40, 24, w, h) - tileQuad[2] = love.graphics.newQuad(40, tile*24, 40, 24, w, h) - - love.graphics.setCanvas( canvas ) - - for i=1, 5 do - for j=0, 18 do - local tiley = (i-1)*20 - 4 - local tilex = (j-2)*31 + (i-1)*10 - local variant = 1 + ((i + j) % 2) - love.graphics.draw(tileTexture, tileQuad[variant], tilex, tiley) - end - end - - love.graphics.setCanvas( ) - - local imagedata = canvas:newImageData() - local texture = love.graphics.newImage( imagedata ) - imagedata:release() - canvas:release() - return texture -end - function ShootMap:draw() for i=1, 10 do --love.graphics.draw(self.texture.floor, ((i-1)*31*16), 0) end end -function ShootMap:addParallax(filename) - -- Empty Placeholder function - local filename = filename or "forest" - local backfolder = "assets/backgrounds/parallax/" - filename = backfolder .. filename - self.texture.back1 = love.graphics.newImage(filename .. "-back.png") - self.texture.back2 = love.graphics.newImage(filename .. "-fore.png") - self.texture.cliff = love.graphics.newImage(filename .. "-cliff.png") -end - function ShootMap:drawParallax(x, y, w, h) - - self:drawBackground(x, y, w, h) - self:drawForeground(x, y + 10, w, h) - 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:drawBorder(x, y + 10) - self:drawBorder(x, y - 100) - self:drawCliff(x, y - 110, w, h) + self.parallaxBackground:drawParallax(x, y, w, h) end -function ShootMap:drawBackground(x, y, w, h) - local w2, h2 = self.texture.back1:getDimensions() - local imax = math.ceil(w / w2) + 1 - for i=1, imax do - local x1 = (x / 5) % w2 - love.graphics.draw(self.texture.back1, (i-1)*w2 - x1, 0, 0, 1, 1, 0, 0) - end -end - -function ShootMap:drawForeground(x, y, w, h) - local w2, h2 = self.texture.back2:getDimensions() - local imax = math.ceil(w / w2) + 1 - for i=1, imax do - local x1 = (x / 2) % w2 - love.graphics.draw(self.texture.back2, (i-1)*w2 - x1, -y, 0, 1, 1, 0, h2) - end -end - -function ShootMap:drawBorder(x, y) - for i=1, 7 do - local x2 = x % 80 - love.graphics.draw(self.texture.border, self.quads.borders, (i-1)*80 - x2, -y, 0, 1, 1) - end -end - -function ShootMap:drawCliff(x, y, w, h) - local w2, h2 = self.texture.cliff:getDimensions() - local imax = math.ceil(w / w2) + 1 - for i=1, imax do - local x1 = (x) % w2 - love.graphics.draw(self.texture.cliff, (i-1)*w2 - x1, -y, 0, 1, 1, 0, 0) - end -end - - return ShootMap diff --git a/sonic-radiance.love/scenes/battlesystem/world.lua b/sonic-radiance.love/scenes/battlesystem/world.lua index 83ef709..75a5907 100644 --- a/sonic-radiance.love/scenes/battlesystem/world.lua +++ b/sonic-radiance.love/scenes/battlesystem/world.lua @@ -1,7 +1,7 @@ local World = Object:extend() local maputils = require "scenes.battlesystem.utils" -local Map = require "scenes.battlesystem.map" +local Map = require "game.modules.drawing.parallaxBackground" local TweenManager = require "game.modules.tweenmanager" @@ -11,6 +11,9 @@ local POSITIONS = { {x = 2, y = 6}, } +local HEIGHT = 5 +local BORDER_BOTTOM = 2 + local gui = require "game.modules.gui" -- INIT FUNCTIONS @@ -25,7 +28,7 @@ function World:new(scene, battlefile) self.actors = {} self.globalID = 0 - self.map = Map(self, "city") + self.map = Map(scene, HEIGHT, BORDER_BOTTOM, "city") self.isBattleActive = false end