exercise 44
This commit is contained in:
parent
b2c6ff5050
commit
3e3d332967
9 changed files with 183 additions and 15 deletions
|
|
@ -1,8 +1,8 @@
|
||||||
---@diagnostic disable: undefined-field
|
|
||||||
---@meta
|
---@meta
|
||||||
---@module 'classic'
|
---@module 'classic'
|
||||||
|
|
||||||
---@class Object
|
---@class Object
|
||||||
|
---@field super Object|nil # Parent class methods (for inheritance)
|
||||||
local Object = {}
|
local Object = {}
|
||||||
|
|
||||||
---Create a new instance of the class.
|
---Create a new instance of the class.
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ function Timer:every(interval, func, ...) end
|
||||||
---@param duration number
|
---@param duration number
|
||||||
---@param subject table
|
---@param subject table
|
||||||
---@param target table
|
---@param target table
|
||||||
---@param easing? function
|
---@param easing? string
|
||||||
---@param after? function
|
---@param after? function
|
||||||
---@return function cancel_function
|
---@return function cancel_function
|
||||||
function Timer:tween(duration, subject, target, easing, after) end
|
function Timer:tween(duration, subject, target, easing, after) end
|
||||||
|
|
|
||||||
50
main.lua
50
main.lua
|
|
@ -1,7 +1,8 @@
|
||||||
-- debug
|
-- debug --
|
||||||
if os.getenv("LOCAL_LUA_DEBUGGER_VSCODE") == "1" then
|
if os.getenv("LOCAL_LUA_DEBUGGER_VSCODE") == "1" then
|
||||||
|
DEBUG = true
|
||||||
require("lldebugger").start()
|
require("lldebugger").start()
|
||||||
end
|
else DEBUG = false end
|
||||||
|
|
||||||
-- libraries --
|
-- libraries --
|
||||||
---@type Object
|
---@type Object
|
||||||
|
|
@ -13,6 +14,9 @@ Timer = require 'lib/hump/timer'
|
||||||
|
|
||||||
-- objects --
|
-- objects --
|
||||||
Room = require 'obj/Room'
|
Room = require 'obj/Room'
|
||||||
|
Circle = require 'obj/Circle'
|
||||||
|
Rectangle = require 'obj/Rectangle'
|
||||||
|
Polygon = require 'obj/Polygon'
|
||||||
|
|
||||||
function love.load()
|
function love.load()
|
||||||
---@type Room|nil
|
---@type Room|nil
|
||||||
|
|
@ -20,8 +24,10 @@ function love.load()
|
||||||
|
|
||||||
-- load rooms
|
-- load rooms
|
||||||
local room_files = {}
|
local room_files = {}
|
||||||
|
print('loading rooms:')
|
||||||
recursiveEnumerate('rooms', room_files)
|
recursiveEnumerate('rooms', room_files)
|
||||||
requireFiles(room_files)
|
for _,v in ipairs(room_files) do print('',v) end
|
||||||
|
requireFiles(room_files, true)
|
||||||
|
|
||||||
-- load input
|
-- load input
|
||||||
input = Baton.new {
|
input = Baton.new {
|
||||||
|
|
@ -30,7 +36,8 @@ function love.load()
|
||||||
right = {'key:right', 'key:d'},
|
right = {'key:right', 'key:d'},
|
||||||
up = {'key:up', 'key:w'},
|
up = {'key:up', 'key:w'},
|
||||||
down = {'key:down', 'key:s'},
|
down = {'key:down', 'key:s'},
|
||||||
action = {'key:z', 'key:space'}
|
action = {'key:z', 'key:space'},
|
||||||
|
f1 = {'key:f1'}, f2 = {'key:f2'}, f3 = {'key:f3'}
|
||||||
},
|
},
|
||||||
pairs = {
|
pairs = {
|
||||||
move = {'left', 'right', 'up', 'down'}
|
move = {'left', 'right', 'up', 'down'}
|
||||||
|
|
@ -41,6 +48,9 @@ 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()
|
||||||
|
|
@ -54,22 +64,29 @@ function recursiveEnumerate(folder, file_list)
|
||||||
local items = love.filesystem.getDirectoryItems(folder)
|
local items = love.filesystem.getDirectoryItems(folder)
|
||||||
for _, item in ipairs(items) do
|
for _, item in ipairs(items) do
|
||||||
local file = folder .. '/' .. item
|
local file = folder .. '/' .. item
|
||||||
---@diagnostic disable-next-line: undefined-field
|
local info = love.filesystem.getInfo(file)
|
||||||
if love.filesystem.isFile(file) then
|
|
||||||
table.insert(file_list, file)
|
if info then -- exists (covers both files and directories)
|
||||||
---@diagnostic disable-next-line: undefined-field
|
if info.type == "file" then
|
||||||
elseif love.filesystem.isDirectory(file) then
|
table.insert(file_list, file)
|
||||||
recursiveEnumerate(file, file_list)
|
elseif info.type == "directory" then
|
||||||
|
recursiveEnumerate(file, file_list)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
---Load files table as lua modules.
|
---Load files table as lua modules.
|
||||||
---@param files table table containing files to be loaded
|
---@param files table table containing files to be loaded
|
||||||
function requireFiles(files)
|
---@param should_return boolean|nil whether required files return a table/object
|
||||||
|
function requireFiles(files, should_return)
|
||||||
|
local returns = should_return or false
|
||||||
for _, file in ipairs(files) do
|
for _, file in ipairs(files) do
|
||||||
local file = file:sub(1, -5)
|
local module = file:sub(1, -5)
|
||||||
require(file)
|
if not returns then require(module) else
|
||||||
|
local filename = module:match("([^/]+)$")
|
||||||
|
_G[filename] = require(module)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -77,5 +94,12 @@ end
|
||||||
---@param room_type string the name of the room as registered
|
---@param room_type string the name of the room as registered
|
||||||
---@param ... any arguments passed to the room constructor
|
---@param ... any arguments passed to the room constructor
|
||||||
function gotoRoom(room_type, ...)
|
function gotoRoom(room_type, ...)
|
||||||
|
local Class = _G[room_type]
|
||||||
|
if not Class then
|
||||||
|
error("room '"..room_type.."' not found in _G")
|
||||||
|
end
|
||||||
|
if type(Class) ~= "table" and type(Class) ~= "function" then
|
||||||
|
error("room '"..room_type.."' is not callable (got "..type(Class)..", does room return itself?)")
|
||||||
|
end
|
||||||
current_room = _G[room_type](...)
|
current_room = _G[room_type](...)
|
||||||
end
|
end
|
||||||
|
|
|
||||||
21
obj/Circle.lua
Normal file
21
obj/Circle.lua
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
---@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
|
||||||
17
obj/Polygon.lua
Normal file
17
obj/Polygon.lua
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
---@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
|
||||||
23
obj/Rectangle.lua
Normal file
23
obj/Rectangle.lua
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
---@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
|
||||||
29
rooms/CircleRoom.lua
Normal file
29
rooms/CircleRoom.lua
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
---@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
|
||||||
27
rooms/PolygonRoom.lua
Normal file
27
rooms/PolygonRoom.lua
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
---@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
|
||||||
27
rooms/RectangleRoom.lua
Normal file
27
rooms/RectangleRoom.lua
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
---@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