area and game object boilerplate
This commit is contained in:
parent
3e3d332967
commit
abcd5371d8
9 changed files with 78 additions and 150 deletions
18
main.lua
18
main.lua
|
|
@ -14,9 +14,7 @@ Timer = require 'lib/hump/timer'
|
||||||
|
|
||||||
-- objects --
|
-- objects --
|
||||||
Room = require 'obj/Room'
|
Room = require 'obj/Room'
|
||||||
Circle = require 'obj/Circle'
|
Area = require 'obj/Area'
|
||||||
Rectangle = require 'obj/Rectangle'
|
|
||||||
Polygon = require 'obj/Polygon'
|
|
||||||
|
|
||||||
function love.load()
|
function love.load()
|
||||||
---@type Room|nil
|
---@type Room|nil
|
||||||
|
|
@ -48,9 +46,6 @@ 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('CircleRoom') end
|
|
||||||
if input:pressed('f2') then gotoRoom('RectangleRoom') end
|
|
||||||
if input:pressed('f3') then gotoRoom('PolygonRoom') end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function love.draw()
|
function love.draw()
|
||||||
|
|
@ -103,3 +98,14 @@ function gotoRoom(room_type, ...)
|
||||||
end
|
end
|
||||||
current_room = _G[room_type](...)
|
current_room = _G[room_type](...)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
---Generates and returns random UUID string
|
||||||
|
---@return string
|
||||||
|
function UUID()
|
||||||
|
local fn = function(x)
|
||||||
|
local r = math.random(16) - 1
|
||||||
|
r = (x == "x") and (r + 1) or (r % 4) + 9
|
||||||
|
return ("0123456789abcdef"):sub(r, r)
|
||||||
|
end
|
||||||
|
return (("xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"):gsub("[xy]", fn))
|
||||||
|
end
|
||||||
|
|
|
||||||
35
obj/Area.lua
Normal file
35
obj/Area.lua
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
---@module 'obj/Area'
|
||||||
|
|
||||||
|
---@class Area:Object
|
||||||
|
---@field room Room
|
||||||
|
local Area = Object:extend()
|
||||||
|
|
||||||
|
---Instantiates area
|
||||||
|
function Area:new(room)
|
||||||
|
self.room = room
|
||||||
|
self.game_objects = {}
|
||||||
|
end
|
||||||
|
|
||||||
|
---Updates area
|
||||||
|
---@param dt number
|
||||||
|
function Area:update(dt)
|
||||||
|
for _, game_object in ipairs(self.game_objects) do game_object:update(dt) end
|
||||||
|
end
|
||||||
|
|
||||||
|
---Draws area
|
||||||
|
function Area:draw()
|
||||||
|
for _, game_object in ipairs(self.game_objects) do game_object:draw() end
|
||||||
|
end
|
||||||
|
|
||||||
|
---Adds game object to area
|
||||||
|
---@param game_object_type string name of game object's class
|
||||||
|
---@param x number|nil horizontal position
|
||||||
|
---@param y number|nil vertical position
|
||||||
|
---@param opts table|nil additional arguments
|
||||||
|
function Area:addGameObject(game_object_type, x, y, opts)
|
||||||
|
local game_object = _G[game_object_type](self, x or 0, y or 0, opts or {})
|
||||||
|
table.insert(self.game_objects, game_object)
|
||||||
|
return game_object
|
||||||
|
end
|
||||||
|
|
||||||
|
return Area
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
---@class Circle:Object circle object
|
|
||||||
---@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 = Object:extend()
|
|
||||||
|
|
||||||
function Circle:new(config)
|
|
||||||
self.x = config.x or 400
|
|
||||||
self.y = config.y or 300
|
|
||||||
self.radius = config.radius or 50
|
|
||||||
self.mode = config.mode or "fill"
|
|
||||||
end
|
|
||||||
|
|
||||||
function Circle:update(dt) end
|
|
||||||
|
|
||||||
function Circle:draw()
|
|
||||||
love.graphics.circle(self.mode, self.x, self.y, self.radius)
|
|
||||||
end
|
|
||||||
|
|
||||||
return Circle
|
|
||||||
31
obj/GameObject.lua
Normal file
31
obj/GameObject.lua
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
---@module 'obj/GameObject'
|
||||||
|
|
||||||
|
---@class GameObject:Object
|
||||||
|
---@field area number
|
||||||
|
---@field x number
|
||||||
|
---@field y number
|
||||||
|
---@field opts table|nil
|
||||||
|
local GameObject = Object:extend()
|
||||||
|
|
||||||
|
---Instantiates game object
|
||||||
|
function GameObject:new(area, x, y, opts)
|
||||||
|
if opts then for k,v in pairs(opts) do self[k] = v end end
|
||||||
|
|
||||||
|
self.area = area
|
||||||
|
self.x = x
|
||||||
|
self.y = y
|
||||||
|
self.id = UUID()
|
||||||
|
self.dead = false
|
||||||
|
self.timer = Timer()
|
||||||
|
end
|
||||||
|
|
||||||
|
---Updates game object
|
||||||
|
---@param dt number
|
||||||
|
function GameObject:update(dt)
|
||||||
|
if self.timer then self.timer:update(dt) end
|
||||||
|
end
|
||||||
|
|
||||||
|
---Draw game object
|
||||||
|
function GameObject:draw() end
|
||||||
|
|
||||||
|
return GameObject
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
---@class Polygon:Object Polygon object
|
|
||||||
---@field mode string drawing mode of Polygon
|
|
||||||
---@field points any points of Polygon
|
|
||||||
local Polygon = Object:extend()
|
|
||||||
|
|
||||||
function Polygon:new(mode, ...)
|
|
||||||
self.mode = mode or "fill"
|
|
||||||
self.points = {...} or {100,100, 200,100, 150,200}
|
|
||||||
end
|
|
||||||
|
|
||||||
function Polygon:update(dt) end
|
|
||||||
|
|
||||||
function Polygon:draw()
|
|
||||||
love.graphics.polygon(self.mode, self.points)
|
|
||||||
end
|
|
||||||
|
|
||||||
return Polygon
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
||||||
---@class Rectangle:Object Rectangle object
|
|
||||||
---@field x number horizontal position of Rectangle
|
|
||||||
---@field y number vertical position of Rectangle
|
|
||||||
---@field mode string drawing mode of Rectangle
|
|
||||||
---@field width number width of Rectangle
|
|
||||||
---@field height number height of Rectangle
|
|
||||||
local Rectangle = Object:extend()
|
|
||||||
|
|
||||||
function Rectangle:new(config)
|
|
||||||
self.x = config.x or 400
|
|
||||||
self.y = config.y or 300
|
|
||||||
self.mode = config.mode or "fill"
|
|
||||||
self.width = config.width or 100
|
|
||||||
self.height = config.height or 60
|
|
||||||
end
|
|
||||||
|
|
||||||
function Rectangle:update(dt) end
|
|
||||||
|
|
||||||
function Rectangle:draw()
|
|
||||||
love.graphics.rectangle(self.mode, self.x, self.y, self.width, self.height)
|
|
||||||
end
|
|
||||||
|
|
||||||
return Rectangle
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
||||||
---@class CircleRoom:Room
|
|
||||||
---@field circle Circle
|
|
||||||
---@field super Room
|
|
||||||
---@field radtween number
|
|
||||||
---@field timer Timer
|
|
||||||
local CircleRoom = Room:extend()
|
|
||||||
|
|
||||||
function CircleRoom:new()
|
|
||||||
CircleRoom.super.new(self)
|
|
||||||
self.radtween = 50
|
|
||||||
self.circle = Circle{radius = self.radtween}
|
|
||||||
self.timer = Timer()
|
|
||||||
end
|
|
||||||
|
|
||||||
function CircleRoom:update(dt)
|
|
||||||
CircleRoom.super.update(self, dt)
|
|
||||||
if input:pressed('action') then
|
|
||||||
self.timer:tween(1, self.circle, {radius = 100}, 'in-out-cubic')
|
|
||||||
end
|
|
||||||
self.circle:update(dt)
|
|
||||||
self.timer:update(dt)
|
|
||||||
end
|
|
||||||
|
|
||||||
function CircleRoom:draw()
|
|
||||||
CircleRoom.super.draw(self)
|
|
||||||
self.circle:draw()
|
|
||||||
end
|
|
||||||
|
|
||||||
return CircleRoom
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
||||||
---@class PolygonRoom:Room
|
|
||||||
---@field polygon Polygon
|
|
||||||
---@field super Room
|
|
||||||
---@field timer Timer
|
|
||||||
local PolygonRoom = Room:extend()
|
|
||||||
|
|
||||||
function PolygonRoom:new()
|
|
||||||
PolygonRoom.super.new(self)
|
|
||||||
self.polygon = Polygon('fill', 100,100, 200,100, 150,200)
|
|
||||||
self.timer = Timer()
|
|
||||||
end
|
|
||||||
|
|
||||||
function PolygonRoom:update(dt)
|
|
||||||
PolygonRoom.super.update(self, dt)
|
|
||||||
if input:pressed('action') then
|
|
||||||
self.polygon.mode = 'line'
|
|
||||||
end
|
|
||||||
self.polygon:update(dt)
|
|
||||||
self.timer:update(dt)
|
|
||||||
end
|
|
||||||
|
|
||||||
function PolygonRoom:draw()
|
|
||||||
PolygonRoom.super.draw(self)
|
|
||||||
self.polygon:draw()
|
|
||||||
end
|
|
||||||
|
|
||||||
return PolygonRoom
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
||||||
---@class RectangleRoom:Room
|
|
||||||
---@field rectangle Rectangle
|
|
||||||
---@field super Room
|
|
||||||
---@field timer Timer
|
|
||||||
local RectangleRoom = Room:extend()
|
|
||||||
|
|
||||||
function RectangleRoom:new()
|
|
||||||
RectangleRoom.super.new(self)
|
|
||||||
self.rectangle = Rectangle{}
|
|
||||||
self.timer = Timer()
|
|
||||||
end
|
|
||||||
|
|
||||||
function RectangleRoom:update(dt)
|
|
||||||
RectangleRoom.super.update(self, dt)
|
|
||||||
if input:pressed('action') then
|
|
||||||
self.timer:tween(1, self.rectangle, {width = 50}, 'in-out-cubic')
|
|
||||||
end
|
|
||||||
self.rectangle:update(dt)
|
|
||||||
self.timer:update(dt)
|
|
||||||
end
|
|
||||||
|
|
||||||
function RectangleRoom:draw()
|
|
||||||
RectangleRoom.super.draw(self)
|
|
||||||
self.rectangle:draw()
|
|
||||||
end
|
|
||||||
|
|
||||||
return RectangleRoom
|
|
||||||
Loading…
Add table
Reference in a new issue