From d69542cbb08a53343fd6c6c0801dd3531ebadd4b Mon Sep 17 00:00:00 2001 From: entar Date: Sat, 7 Jun 2025 23:01:36 +0700 Subject: [PATCH] LAYERS --- characters/bf-car-dead.json | 56 +++++++++++++++++++++ modules/states/playstate.lua | 13 +++-- modules/types/character.lua | 1 + modules/types/note.lua | 3 +- modules/types/render.lua | 97 +++++++++++++++++++++--------------- stages/stage.lua | 3 ++ 6 files changed, 129 insertions(+), 44 deletions(-) create mode 100644 characters/bf-car-dead.json diff --git a/characters/bf-car-dead.json b/characters/bf-car-dead.json new file mode 100644 index 0000000..691df2a --- /dev/null +++ b/characters/bf-car-dead.json @@ -0,0 +1,56 @@ +{ + "animations": [ + { + "offsets": [ + 37, + 11 + ], + "loop": false, + "fps": 24, + "anim": "firstDeath", + "indices": [], + "name": "BF dies" + }, + { + "offsets": [ + 37, + 5 + ], + "loop": true, + "fps": 24, + "anim": "deathLoop", + "indices": [], + "name": "BF Dead Loop" + }, + { + "offsets": [ + 37, + 69 + ], + "loop": false, + "fps": 24, + "anim": "deathConfirm", + "indices": [], + "name": "BF Dead confirm" + } + ], + "no_antialiasing": false, + "image": "sprites/characters/BOYFRIEND_DEAD", + "position": [ + 0, + 350 + ], + "healthicon": "bf", + "flip_x": false, + "healthbar_colors": [ + 49, + 176, + 209 + ], + "camera_position": [ + 700, + -300 + ], + "sing_duration": 4, + "scale": 1 +} \ No newline at end of file diff --git a/modules/states/playstate.lua b/modules/states/playstate.lua index d046f5a..21cc49b 100644 --- a/modules/states/playstate.lua +++ b/modules/states/playstate.lua @@ -151,11 +151,12 @@ local function state(songName, songDifficulty) for index, module in next, modules do if module.onClose then module.onClose() + modules[index] = nil end end end - modules = nil + modules = {} if not dead then inst:stop() @@ -187,11 +188,12 @@ local function state(songName, songDifficulty) for index, module in next, modules do if module.onClose then module.onClose() + modules[index] = nil end end end - modules = nil + modules = {} inst:stop() inst:release() @@ -570,7 +572,7 @@ local function state(songName, songDifficulty) for i = 0, 3 do local receptor = myTypes.Rect("sprites/NOTE_assets.png", "sprites/NOTE_assets.json") receptor:Frame("arrow"..directions[i+1], 0) - + receptor.layer = 9 receptor.position = myTypes.Vector2(600 + (79* i), settings.Downscroll and 430 or 0) receptor.ui = true -- So it doesnt move with the camera. @@ -579,6 +581,8 @@ local function state(songName, songDifficulty) local splash = myTypes.Sprite("sprites/noteSplashes.png", "sprites/noteSplashes.json") + splash.layer = 11 + splash.position = myTypes.Vector2(550 + (79* i), settings.Downscroll and 380 or -50) splash.ui = true @@ -591,6 +595,7 @@ local function state(songName, songDifficulty) receptor.position = myTypes.Vector2(50 + 79 * i, settings.Downscroll and 430 or 0) + receptor.layer = 9 receptor.ui = true -- So it doesnt move with the camera. end @@ -627,6 +632,7 @@ local function state(songName, songDifficulty) for i, module in next, modules do for i, func in next, module do + if type(func) ~= "function" then goto evilContinue end local newEnv = getfenv(func) newEnv.game = { characters=characters, @@ -638,6 +644,7 @@ local function state(songName, songDifficulty) zoom=zoom } setfenv(func, newEnv) + ::evilContinue:: end module.characters = characters end diff --git a/modules/types/character.lua b/modules/types/character.lua index 9e8258e..39bbc92 100644 --- a/modules/types/character.lua +++ b/modules/types/character.lua @@ -42,6 +42,7 @@ function module.character(name) sprite.position = module.myTypes.Vector2(parsed.position[1], parsed.position[2]) sprite.flipX = parsed.flip_x + sprite.layer = 5 local newCharacter = setmetatable({ scale = parsed.scale, diff --git a/modules/types/note.lua b/modules/types/note.lua index 4402d10..d7ab31d 100644 --- a/modules/types/note.lua +++ b/modules/types/note.lua @@ -33,9 +33,10 @@ function NoteClass:spawn() local sprite = module.types.Rect("sprites/NOTE_assets.png", "sprites/NOTE_assets.json") self.sprite = sprite - + sprite.layer = 10 local spriteName if self.hold then + sprite.layer = 9 if self.holdEnd then spriteName = string.format("%s hold end", sprites[self.direction]) if self.flipY then diff --git a/modules/types/render.lua b/modules/types/render.lua index daa9072..c1a5297 100644 --- a/modules/types/render.lua +++ b/modules/types/render.lua @@ -35,7 +35,8 @@ function module.Sprite(image, sheet) looping = false, extraOffset = module.myTypes.Vector2(0,0), rect = false, - modifier = 1 + modifier = 1, + layer = 0 }, Sprite) for index, sprite in next, atlas do @@ -78,7 +79,8 @@ function module.Sprite(image, sheet) extraOffset = module.myTypes.Vector2(0,0), rect = false, modifier = 1, - allowedFrame = 0 + allowedFrame = 0, + layer = 0 }, Sprite) Sprites[#Sprites+1] = newSprite @@ -176,54 +178,66 @@ function module.updateSprites(dt) end function module.drawSprites() + local everything = {} + for index, image in next, Images do - if not image.ui then - local cameraOffset = module.cameraPosition - love.graphics.draw(image.image, image.position.x + cameraOffset.x * image.modifier , image.position.y + cameraOffset.y * image.modifier, image.rotation, image.resize.x * (image.flipX and -1 or 1), image.resize.y * (image.flipY and -1 or 1)) - end + everything[#everything+1] = image + image.isImage = true end for index, sprite in next, Sprites do - if sprite.animation and sprite.quads and sprite.quads[sprite.animation] then - local quad = sprite.quads[sprite.animation][sprite.frame] or sprite.quads[sprite.animation][0] - if quad then - if quad.offset.x == 0 and quad.offset.y == 0 and sprite.quads[sprite.animation][0].offset.x ~= 0 then - quad.offset.x = sprite.quads[sprite.animation][0].offset.x - quad.offset.y = sprite.quads[sprite.animation][0].offset.y + everything[#everything+1] = sprite + sprite.isSprite = true + end + + for index, rect in next, Rects do + everything[#everything+1] = rect + rect.isRect = true + end + + table.sort(everything, function(a, b) + return a.layer < b.layer + end) + + for index, thing in ipairs(everything) do + + if thing.isImage then + local cameraOffset = thing.ui and module.myTypes.Vector2() or module.cameraPosition + love.graphics.draw(thing.image, thing.position.x + cameraOffset.x * thing.modifier , thing.position.y + cameraOffset.y * thing.modifier, thing.rotation, thing.resize.x * (thing.flipX and -1 or 1), thing.resize.y * (thing.flipY and -1 or 1)) + elseif thing.isSprite then + local sprite = thing + if sprite.animation and sprite.quads and sprite.quads[sprite.animation] then + local quad = sprite.quads[sprite.animation][sprite.frame] or sprite.quads[sprite.animation][0] + if quad then + if quad.offset.x == 0 and quad.offset.y == 0 and sprite.quads[sprite.animation][0].offset.x ~= 0 then + quad.offset.x = sprite.quads[sprite.animation][0].offset.x + quad.offset.y = sprite.quads[sprite.animation][0].offset.y + end + if sprite.flipX and not quad.flipped then + quad.flipped = true + quad.offset.x = -quad.offset.x + end + + local cameraOffset = sprite.ui and module.myTypes.Vector2() or module.cameraPosition or module.myTypes.Vector2() + + love.graphics.draw(sprite.image, quad.quad, (sprite.position.x + (sprite.position.x - quad.offset.x - sprite.extraOffset.x) + cameraOffset.x * sprite.modifier), (sprite.position.y + (sprite.position.y - quad.offset.y - sprite.extraOffset.y) + cameraOffset.y * sprite.modifier), 0, quad.resize.x * (sprite.flipX and -1 or 1), quad.resize.y* (sprite.flipY and -1 or 1)) end - if sprite.flipX and not quad.flipped then + end + elseif thing.isRect then + local rect = thing + if rect.animation then + local quad = rect.quads[rect.animation][0] + if rect.flipX and not quad.flipped then quad.flipped = true quad.offset.x = -quad.offset.x end - local cameraOffset = sprite.ui and module.myTypes.Vector2() or module.cameraPosition or module.myTypes.Vector2() + local cameraOffset = rect.ui and module.myTypes.Vector2() or module.cameraPosition or module.myTypes.Vector2() - love.graphics.draw(sprite.image, quad.quad, (sprite.position.x + (sprite.position.x - quad.offset.x - sprite.extraOffset.x) + cameraOffset.x * sprite.modifier), (sprite.position.y + (sprite.position.y - quad.offset.y - sprite.extraOffset.y) + cameraOffset.y * sprite.modifier), 0, quad.resize.x * (sprite.flipX and -1 or 1), quad.resize.y* (sprite.flipY and -1 or 1)) + love.graphics.draw(rect.image, quad.quad, (rect.position.x + (rect.position.x - quad.offset.x - rect.extraOffset.x) + cameraOffset.x * rect.modifier), (rect.position.y + (rect.position.y - quad.offset.y - rect.extraOffset.y) + cameraOffset.y * rect.modifier), 0, quad.resize.x * (rect.flipX and -1 or 1), quad.resize.y* (rect.flipY and -1 or 1)) end end end - - for index, rect in next, Rects do - if rect.animation then - local quad = rect.quads[rect.animation][0] - if rect.flipX and not quad.flipped then - quad.flipped = true - quad.offset.x = -quad.offset.x - end - - local cameraOffset = rect.ui and module.myTypes.Vector2() or module.cameraPosition or module.myTypes.Vector2() - - love.graphics.draw(rect.image, quad.quad, (rect.position.x + (rect.position.x - quad.offset.x - rect.extraOffset.x) + cameraOffset.x * rect.modifier), (rect.position.y + (rect.position.y - quad.offset.y - rect.extraOffset.y) + cameraOffset.y * rect.modifier), 0, quad.resize.x * (rect.flipX and -1 or 1), quad.resize.y* (rect.flipY and -1 or 1)) - end - end - - for index, image in next, Images do - if image.ui then - local cameraOffset = image.ui and module.myTypes.Vector2() - - love.graphics.draw(image.image, (image.position.x) + cameraOffset.x, image.position.y + cameraOffset.y, image.rotation, image.resize.x * (image.flipX and -1 or 1), image.resize.y) - end - end end function module.Rect(image, sheet) @@ -249,7 +263,8 @@ function module.Rect(image, sheet) looping = false, extraOffset = module.myTypes.Vector2(0,0), rect = false, - modifier = 1 + modifier = 1, + layer = 0 }, Sprite) for index, sprite in next, atlas do @@ -291,7 +306,8 @@ function module.Rect(image, sheet) looping = false, extraOffset = module.myTypes.Vector2(0,0), rect = false, - modifier = 1 + modifier = 1, + layer = 0 }, Sprite) Sprites[#Sprites+1] = newSprite @@ -323,7 +339,8 @@ function module.Image(path, scrollFactor) resize = module.myTypes.Vector2(1,1), position = module.myTypes.Vector2(), modifier = scrollFactor or 1, - rotation = 0 + rotation = 0, + layer = 0 }, Image) Images[#Images+1] = newImage diff --git a/stages/stage.lua b/stages/stage.lua index 73fdf67..e86e386 100644 --- a/stages/stage.lua +++ b/stages/stage.lua @@ -3,13 +3,16 @@ local myTypes = require("modules.types") return { onCreate = function(song) local back = myTypes.Image("images/stage/stageback.png") + back.layer = -10 back.position = myTypes.Vector2(-800, 50) local front = myTypes.Image("images/stage/stagefront.png") + front.layer = -1 front.position = myTypes.Vector2(-900, 1000) local curtains = myTypes.Image("images/stage/stagecurtains.png") curtains.position = myTypes.Vector2(-1150, 50) curtains.modifier = 1.3 + curtains.layer = 5 end } \ No newline at end of file