colored circles program
This commit is contained in:
parent
abcd5371d8
commit
40fe3c84cf
6 changed files with 110 additions and 6 deletions
7
main.lua
7
main.lua
|
|
@ -12,9 +12,13 @@ Baton = require 'lib/baton/baton'
|
||||||
---@type Timer
|
---@type Timer
|
||||||
Timer = require 'lib/hump/timer'
|
Timer = require 'lib/hump/timer'
|
||||||
|
|
||||||
-- objects --
|
-- generic objects --
|
||||||
Room = require 'obj/Room'
|
Room = require 'obj/Room'
|
||||||
Area = require 'obj/Area'
|
Area = require 'obj/Area'
|
||||||
|
GameObject = require 'obj/GameObject'
|
||||||
|
|
||||||
|
-- game objects --
|
||||||
|
Circle = require 'obj/game/Circle'
|
||||||
|
|
||||||
function love.load()
|
function love.load()
|
||||||
---@type Room|nil
|
---@type Room|nil
|
||||||
|
|
@ -46,6 +50,7 @@ end
|
||||||
function love.update(dt)
|
function love.update(dt)
|
||||||
input:update(dt)
|
input:update(dt)
|
||||||
if current_room then current_room:update(dt) end
|
if current_room then current_room:update(dt) end
|
||||||
|
if input:pressed('f1') then gotoRoom('Stage') end
|
||||||
end
|
end
|
||||||
|
|
||||||
function love.draw()
|
function love.draw()
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
---@class Area:Object
|
---@class Area:Object
|
||||||
---@field room Room
|
---@field room Room
|
||||||
|
---@field game_objects GameObject[]
|
||||||
local Area = Object:extend()
|
local Area = Object:extend()
|
||||||
|
|
||||||
---Instantiates area
|
---Instantiates area
|
||||||
|
|
@ -13,7 +14,10 @@ end
|
||||||
---Updates area
|
---Updates area
|
||||||
---@param dt number
|
---@param dt number
|
||||||
function Area:update(dt)
|
function Area:update(dt)
|
||||||
for _, game_object in ipairs(self.game_objects) do game_object:update(dt) end
|
for i, game_object in ipairs(self.game_objects) do
|
||||||
|
if game_object:isDead() then table.remove(self.game_objects, i) end
|
||||||
|
game_object:update(dt)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
---Draws area
|
---Draws area
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,11 @@
|
||||||
---@module 'obj/GameObject'
|
---@module 'obj/GameObject'
|
||||||
|
|
||||||
---@class GameObject:Object
|
---@class GameObject:Object
|
||||||
---@field area number
|
---@field area Area
|
||||||
---@field x number
|
---@field x number
|
||||||
---@field y number
|
---@field y number
|
||||||
---@field opts table|nil
|
---@field opts table|nil
|
||||||
|
---@field super GameObject
|
||||||
local GameObject = Object:extend()
|
local GameObject = Object:extend()
|
||||||
|
|
||||||
---Instantiates game object
|
---Instantiates game object
|
||||||
|
|
@ -28,4 +29,25 @@ end
|
||||||
---Draw game object
|
---Draw game object
|
||||||
function GameObject:draw() end
|
function GameObject:draw() end
|
||||||
|
|
||||||
|
---Mark object for destruction
|
||||||
|
function GameObject:destroy()
|
||||||
|
if self.timer then
|
||||||
|
self.timer:clear() -- cancel all tweens/after/every
|
||||||
|
self.timer = nil
|
||||||
|
end
|
||||||
|
self.dead = true
|
||||||
|
end
|
||||||
|
|
||||||
|
---Returns whether object is marked for destruction
|
||||||
|
---@return boolean
|
||||||
|
function GameObject:isDead()
|
||||||
|
return self.dead == true
|
||||||
|
end
|
||||||
|
|
||||||
|
---Kill object (meant to be overridden)
|
||||||
|
---**default behavior:** self:destroy()
|
||||||
|
function GameObject:kill()
|
||||||
|
self:destroy()
|
||||||
|
end
|
||||||
|
|
||||||
return GameObject
|
return GameObject
|
||||||
|
|
|
||||||
16
obj/Room.lua
16
obj/Room.lua
|
|
@ -1,16 +1,26 @@
|
||||||
---@module 'obj/Room'
|
---@module 'obj/Room'
|
||||||
|
|
||||||
---@class Room:Object
|
---@class Room:Object
|
||||||
|
---@field area Area room area
|
||||||
|
---@field id string room id
|
||||||
|
---@field super Room
|
||||||
local Room = Object:extend()
|
local Room = Object:extend()
|
||||||
|
|
||||||
---Instantiates room.
|
---Instantiates room.
|
||||||
function Room:new() end
|
function Room:new()
|
||||||
|
self.area = Area(self)
|
||||||
|
self.id = UUID()
|
||||||
|
end
|
||||||
|
|
||||||
---Updates room (see [love.update()](lua://love.update))
|
---Updates room (see [love.update()](lua://love.update))
|
||||||
---@param dt number delta time
|
---@param dt number delta time
|
||||||
function Room:update(dt) end
|
function Room:update(dt)
|
||||||
|
self.area:update(dt)
|
||||||
|
end
|
||||||
|
|
||||||
---Draws graphics (see [love.draw()](lua://love.draw))
|
---Draws graphics (see [love.draw()](lua://love.draw))
|
||||||
function Room:draw() end
|
function Room:draw()
|
||||||
|
self.area:draw()
|
||||||
|
end
|
||||||
|
|
||||||
return Room
|
return Room
|
||||||
|
|
|
||||||
36
obj/game/Circle.lua
Normal file
36
obj/game/Circle.lua
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
---@class Circle:GameObject circle object
|
||||||
|
---@field area Area area of circle
|
||||||
|
---@field x number horizontal position of circle
|
||||||
|
---@field y number vertical position of circle
|
||||||
|
---@field radius number radius of circle
|
||||||
|
---@field mode string drawing mode of circle
|
||||||
|
local Circle = GameObject:extend()
|
||||||
|
|
||||||
|
function Circle:new(area, x, y, config)
|
||||||
|
Circle.super.new(self, area, x or 400, y or 300)
|
||||||
|
self.tweened = false
|
||||||
|
self.current_radius = 0
|
||||||
|
self.radius = config.radius or 50
|
||||||
|
self.mode = config.mode or "fill"
|
||||||
|
self._r, self._g, self._b = love.math.random(0.1, 1.0), love.math.random(0.1, 1.0), love.math.random(0.1, 1.0)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Circle:update(dt)
|
||||||
|
Circle.super.update(self, dt)
|
||||||
|
if not self.tweened then
|
||||||
|
self.tweened = true
|
||||||
|
self.timer:tween(0.4, self, {current_radius = self.radius}, 'in-out-cubic')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function Circle:draw()
|
||||||
|
Circle.super.draw(self)
|
||||||
|
love.graphics.setColor(self._r, self._g, self._b)
|
||||||
|
love.graphics.circle(self.mode, self.x, self.y, self.current_radius)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Circle:kill()
|
||||||
|
self.timer:tween(0.4, self, {current_radius = 0}, 'in-out-cubic', function() self:destroy() end)
|
||||||
|
end
|
||||||
|
|
||||||
|
return Circle
|
||||||
27
rooms/Stage.lua
Normal file
27
rooms/Stage.lua
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
---@class Stage:Room
|
||||||
|
local Stage = Room:extend()
|
||||||
|
|
||||||
|
function Stage:new()
|
||||||
|
Stage.super.new(self)
|
||||||
|
self.timer = Timer()
|
||||||
|
end
|
||||||
|
|
||||||
|
function Stage:update(dt)
|
||||||
|
Stage.super.update(self, dt)
|
||||||
|
|
||||||
|
if input:pressed('action') then
|
||||||
|
local latest_object = self.area:addGameObject('Circle', love.math.random(1, 800), love.math.random(1, 600))
|
||||||
|
end
|
||||||
|
|
||||||
|
if input:pressed('right') then
|
||||||
|
for _, game_object in ipairs(self.area.game_objects) do
|
||||||
|
game_object:kill()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function Stage:draw()
|
||||||
|
Stage.super.draw(self)
|
||||||
|
end
|
||||||
|
|
||||||
|
return Stage
|
||||||
Loading…
Add table
Reference in a new issue