commit 24e11beccdb6b4cf7224bd08ff318699521ae642 Author: Er2 Date: Wed Apr 27 21:32:52 2022 +0300 init diff --git a/games/.gitkeep b/games/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/main.lua b/main.lua new file mode 100644 index 0000000..4af53cb --- /dev/null +++ b/main.lua @@ -0,0 +1,149 @@ + +local root = 'games/' + +-- games library and selection +local gms = {} +local sel = 1 +local sgme + +-- some internals +local cx, cy, cw, ch +local f, bf + +function love.resize(x, y) + W, H = x, y + + if resize then resize(W, H) end + + collectgarbage 'collect' -- because new font isn't clears +end + +function resize() + cw, ch = W / 1.25, H / 1.25 + cx, cy = (W - cw) / 2, (H - ch) / 2 + + local th = math.min(W, H) / 8 + + f = love.graphics.newFont(th / 3) + bf = love.graphics.newFont(th / 2) +end + +love.resize(love.graphics.getDimensions()) + +local function gmeNew(cont, dir, file) + local gme = { + name = 'No name', + desc = 'No description provided.', + dir = dir, + main = 'main.lua', + } + local fi = false + cont = cont or '' + cont = cont:gsub('[^\\]#[^\n]*', '') + for v in cont:gmatch '([^\n]+)' do + local k, v = v:match '^%s*([%w_]+)%s*=%s*(.*)%s*$' + if k == 'name' + or k == 'desc' + or k == 'main' + then gme[k] = v + fi = true + elseif k + then error('unknown field "'.. k ..'" in "'.. file ..'"') + end + end + if not fi then + gme.name = dir + end + table.insert(gms, gme) +end + +for _, v in pairs(love.filesystem.getDirectoryItems(root)) do + local file = v..'/'.. 'info.ll' + gmeNew(love.filesystem.read(root .. file), v, file) +end + +local pf, mx, mb, mpb +local function update() + mx = love.mouse.getX() + mpb = mb + mb = 0 + if love.mouse.isDown(1) then mb = 1 + end + + if mpb == 1 and mb == 0 then + if mx <= cx then + sel = sel - 1 + if sel < 1 then sel = #gms end + elseif mx >= cx + cw then + sel = sel + 1 + if sel > #gms then sel = 1 end + else sgme = gms[sel] + end + end +end + +local function draw() + love.graphics.polygon('fill', + 8, H / 2, + 32, H / 2 - 32, + 32, H / 2 + 32) + + love.graphics.polygon('fill', + W - 8, H / 2, + W - 32, H / 2 - 32, + W - 32, H / 2 + 32) + + local oy, t = 0, '' + local gme = gms[sel] + if gme then + local ph = ch / 1.5 + love.graphics.rectangle('line', cx, cy, cw, ch) + love.graphics.rectangle('fill', cx, cy, cw, ph) + + oy = cy + ph + love.graphics.setFont(bf) + love.graphics.print(gme.name, cx, oy) + oy = oy + bf:getHeight(gme.name) + love.graphics.setFont(f) + love.graphics.print(gme.desc, cx, oy) + + else oy = H / 2 + t = 'No games' + love.graphics.setFont(bf) + love.graphics.print(t, (W - bf:getWidth(t)) / 2, oy) + oy = oy + bf:getHeight(t) + love.graphics.setFont(f) + t = 'There is no projects/games to run' + love.graphics.print(t, (W - f:getWidth(t)) / 2, oy) + end +end + +function love.handlers.quit(c) + -- for some cases when event handler (like this one below) can't correctly close + os.exit(c or 0) +end + +while not sgme do + -- event handling + love.event.pump() + for n, a,b,c,d,e,f in love.event.poll() do + love.handlers[n](a,b,c,d,e,f) + end + + -- update and drawing + update() + love.graphics.origin() + love.graphics.clear(0, 0, 0) + draw() + love.graphics.present() + love.timer.sleep(0.001) +end + +love.graphics.setNewFont() +resize = nil +require(root .. sgme.dir ..'/'.. sgme.main:sub(1, -5)) + +-- things left: +-- W and H global variables +-- love.resize and optional global resize function +-- love.handlers.quit - modified but can be required diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..8b5c30d --- /dev/null +++ b/readme.md @@ -0,0 +1,32 @@ +# Love Loader + +Custom menu for selecting game from multiple for Love2D. + +# How it works? + +If simple: just place games in `games` folder with structure like `games/yourgame/main.lua` + +If technically: creates local variables functions and variables. +Creates the loop until game wasn't selected with manual event handling and redrawing. + +# Things left or API + +We are not keep environment super clear (except local variables ;)) +so there are some variables can be used in game: + +`W` and `H` variables: width and height of the screen, controlled by love.resize function. +`love.resize` and optional `resize` payload: functions called when screen size when changed and at boot. +`love.handlers.quit`: function on exit which can be called until game was selected to keep responsive or for custom love.run function. + +# Fill game information + +To fill game information in game folder need to create `info.ll` file. + +Syntax is `k = v` with `# comments` + +``` +# are there needed any comments? +name = New awesome game using Love Loader +desc = Some descripion about the game. +# main = optional main file instead of `main.lua` +```