From 391e2ab1b720b0d88793870fb5459b84ed0f090c Mon Sep 17 00:00:00 2001 From: checamon Date: Mon, 27 Dec 2021 20:43:37 +0100 Subject: [PATCH] new clock --- main.lua | 6 +++++- src/Clock.lua | 37 +++++++++++++++++++++++++++++++++++ src/Dependencies.lua | 1 + src/Level.lua | 12 ++++++++++-- src/Segment.lua | 4 ++-- src/constants.lua | 4 +++- src/entity/entity_defs.lua | 32 ++++++++++++++++++++++++++++++ src/states/game/PlayState.lua | 15 ++++++++++++-- 8 files changed, 103 insertions(+), 8 deletions(-) create mode 100644 src/Clock.lua diff --git a/main.lua b/main.lua index dae8a77..a47ae2c 100644 --- a/main.lua +++ b/main.lua @@ -60,7 +60,11 @@ function love.keypressed(key) if key == 'escape' then love.event.quit() end - + + if key == 'f' then + push:switchFullscreen() + end + love.keyboard.keysPressed[key] = true end diff --git a/src/Clock.lua b/src/Clock.lua new file mode 100644 index 0000000..3959f56 --- /dev/null +++ b/src/Clock.lua @@ -0,0 +1,37 @@ +Clock = Class {} + +function Clock:init(timelimit, direction) + self.timeLimit = timelimit + self.direction = direction + self.color = {56 / 255, 56 / 255, 56 / 255, 1} + self.currentTime = "" + self.timer = 0 + self.startTime = self:getOsTime() +end + +function Clock:update(dt) + local passed = math.floor((self:getOsTime() - self.startTime) * 10 + 0.5) + if self.direction == 'down' then + self.currentTime = tostring(self.timeLimit - passed) + else + self.currentTime = tostring(passed) + end +end + +function Clock:render() + TODO TODO + if self.currentTime * 1 <= 10 then + local a = math.abs(math.cos(love.timer.getTime() * .85 % 2 * math.pi)) + love.graphics.setColor(.8, .12, .12, a) + else + love.graphics.setColor(self.color[1], self.color[2], self.color[3], + self.color[4]) + end + love.graphics.setFont(gFonts['medium']) + love.graphics.printf('Time: ' .. self.currentTime, 0, 5, VIRTUAL_WIDTH, + 'right') + love.graphics.setFont(gFonts['small']) + love.graphics.setColor(1, 1, 1, 1) +end + +function Clock:getOsTime() return os.clock() end diff --git a/src/Dependencies.lua b/src/Dependencies.lua index 8f238f6..876c92a 100644 --- a/src/Dependencies.lua +++ b/src/Dependencies.lua @@ -10,6 +10,7 @@ Timer = require 'lib/knife.timer' require 'src/Animation' require 'src/constants' require 'src/StateMachine' +require 'src/Clock' require 'src/Util' require 'src/Level' diff --git a/src/Level.lua b/src/Level.lua index 725da47..dc5c0f9 100644 --- a/src/Level.lua +++ b/src/Level.lua @@ -1,11 +1,11 @@ -- require('mobdebug').start() Level = Class {} -function Level:init(stage) +function Level:init(def, stage) self.stage = stage self.points = {} self.player = {} - self.segments = self:createLevel() + self.segments = self:createLevelFromDef(def, stage) self.polygon = self:createPolygon() self.mesh = poly2mesh(self.points) end @@ -31,6 +31,14 @@ function Level:renderBackground() end end +function Level:createLevelFromDef(def, stage) + local level = {} + for i, seg in pairs(def[1].segments) do + table.insert(level, Segment(seg.p1, seg.p2, seg.width, seg.face) ) + end + return level +end + function Level:createLevel() local level = { [1] = Segment({LEVEL_RENDER_OFFSET, LEVEL_RENDER_OFFSET_TOP}, { diff --git a/src/Segment.lua b/src/Segment.lua index 745fa9c..2081990 100644 --- a/src/Segment.lua +++ b/src/Segment.lua @@ -17,12 +17,12 @@ function Segment:init(firstPoint, secondPoint, lineWidth, face, color) end function Segment:render() - love.graphics.setColor(self.color.r, self.color.g, self.color.b, 255) + love.graphics.setColor(self.color.r, self.color.g, self.color.b, 1) love.graphics.setLineWidth(self.lineWidth) love.graphics.line(self.firstPointX, self.firstPointY, self.secondPointX, self.secondPointY) - love.graphics.setColor(255, 255, 255, 255) + love.graphics.setColor(1, 1, 1, 1) -- debug -- love.graphics.setFont(gFonts['small']) diff --git a/src/constants.lua b/src/constants.lua index 4be6a3d..3ccf333 100644 --- a/src/constants.lua +++ b/src/constants.lua @@ -9,4 +9,6 @@ WINDOW_HEIGHT = 720 LEVEL_RENDER_OFFSET_TOP = 30 LEVEL_RENDER_OFFSET = 10 -TILE_SIZE = 16 \ No newline at end of file +TILE_SIZE = 16 + +LINE_WIDTH = .5 \ No newline at end of file diff --git a/src/entity/entity_defs.lua b/src/entity/entity_defs.lua index ca40069..a2e349d 100644 --- a/src/entity/entity_defs.lua +++ b/src/entity/entity_defs.lua @@ -44,4 +44,36 @@ ENTITY_DEFS = { } } } +} + +LEVELS_DEF = { + [1] = { + segments = + { + { + p1 = {LEVEL_RENDER_OFFSET, LEVEL_RENDER_OFFSET_TOP}, + p2 = {VIRTUAL_WIDTH - LEVEL_RENDER_OFFSET, LEVEL_RENDER_OFFSET_TOP}, + width = LINE_WIDTH, + face = 'down' + }, + { + p1 = {VIRTUAL_WIDTH - LEVEL_RENDER_OFFSET, LEVEL_RENDER_OFFSET_TOP}, + p2 = {VIRTUAL_WIDTH - LEVEL_RENDER_OFFSET, VIRTUAL_HEIGHT - LEVEL_RENDER_OFFSET}, + width = LINE_WIDTH, + face = 'left' + }, + { + p1 = {VIRTUAL_WIDTH - LEVEL_RENDER_OFFSET, VIRTUAL_HEIGHT - LEVEL_RENDER_OFFSET}, + p2 = {LEVEL_RENDER_OFFSET, VIRTUAL_HEIGHT - LEVEL_RENDER_OFFSET}, + width = LINE_WIDTH, + face = 'up' + }, + { + p1 = {LEVEL_RENDER_OFFSET, VIRTUAL_HEIGHT - LEVEL_RENDER_OFFSET}, + p2 = {LEVEL_RENDER_OFFSET, LEVEL_RENDER_OFFSET_TOP}, + width= LINE_WIDTH, + face = 'right' + }, + }, + }, } \ No newline at end of file diff --git a/src/states/game/PlayState.lua b/src/states/game/PlayState.lua index b3c7441..1fdec92 100644 --- a/src/states/game/PlayState.lua +++ b/src/states/game/PlayState.lua @@ -5,12 +5,13 @@ PlayState = Class{__includes = BaseState} function PlayState:init() self.name = 'PlayState' self.stage = 1 - self.level = Level(self.stage) + self.level = Level(LEVELS_DEF, self.stage) self.player = Player ( ENTITY_DEFS['player'] , self.level) self.level.player = self.player self.balls = {} self:createBalls() self.level.balls = self.balls + self.clock = Clock(30,"down") gSounds['music']:setLooping(true) gSounds['music']:play() @@ -23,6 +24,7 @@ end function PlayState:update(dt) self.level:update(dt) self.player:update(dt) + self.clock:update(dt) self:updateBalls(dt, self.level) self:checkEndLevel(self.level) end @@ -39,6 +41,7 @@ function PlayState:render() love.graphics.printf('Stage '..tostring(self.stage), 0, 5, VIRTUAL_WIDTH, 'center') + self.clock:render() self.level:render() self.player:render() self:renderBalls(dt) @@ -83,6 +86,13 @@ function PlayState:checkEndLevel (level) if level:getPerimeter() < 500 then self:nextStage() end + + -- check if clock finished counting limit time + if self.clock.direction == 'up' and self.clock.currentTime * 1 > self.clock.timeLimit then + self:gameOver() + elseif self.clock.direction == 'down' and self.clock.currentTime * 1 <= 0 then + self:gameOver() + end end function PlayState:renderBalls(dt) @@ -101,7 +111,8 @@ function PlayState:nextStage() gStateStack:push(FadeOutState({ r = 255/255, g = 255/255, b = 255/255}, 1,function() self.stage = self.stage + 1 - self.level = Level(self.stage) + self.level = Level(LEVELS_DEF,self.stage) + self.clock = Clock(self.clock.timeLimit + 3 * #self.balls,"down") self.player:reset() self.player.score = self.player.score + self.player.multiplier * #self.balls self.player.multiplier = self.player.multiplier + #self.balls