Page 1 of 1
splitting my code into multiple lua files using filesystem.load
Posted: Sat May 14, 2016 10:20 pm
by bkwrm
So my main lua file is used as a main menu, graphics settings and so on. What I would like to be able to do is to have each level as it's own main lua file that I than transfer control to. I do use require for various functions, but for my own sanity I would like to split up the main game as much as possible.
Code: Select all
chunk = love.filesystem.load("testLevel.lua") -- load the chunk
local result = chunk() -- execute the chunk
This ...kind of works. It only runs code inside the love.update and love.draw blocks and I haven't yet figured out a way to return back to where I was in the main calling lua file. Some of this can be done with doneOnce type variables or loading anything needed in the main file right before transfering to the new lua file, but scripting errors in the called lua file produce some wacky feedback on the crash screen making debugging a pain in the backside.
Basically is there anything I'm missing that would make this easier? Should probably add that dofile tries to run things in my /love/ install directory by default (and not the game one) so that isn't really an option.
Re: splitting my code into multiple lua files using filesystem.load
Posted: Sat May 14, 2016 11:25 pm
by Beelz
What you're looking for is require:
Code: Select all
local file = require 'filename' -- no .lua
--Then, if the file returns a table you can use the values and methods from there.
print('Map name: ' .. file.title)
print('Map size: ' .. file.size.w .. ', ' .. file.size.h)
In 'filename.lua':
Code: Select all
-- create the table we will return
local map = {}
-- add whatever
map.title = 'Map 1'
map.size = {w=5000}, h=5000}
-- return the table
return map
Or you can simplify that:
Code: Select all
local map = {
title = 'Map1',
size = {w=5000, h=5000}
}
return map
Re: splitting my code into multiple lua files using filesystem.load
Posted: Sat May 14, 2016 11:59 pm
by bkwrm
Thanks for the reply, I already am using require a lot to organize my functions (collisions, menu options, and so on). I was under the impression that require was mostly used to support the main file though?
Like your example is loading a table with the map settings, which is a perfect use for require. I would like to take it a step farther and separate all my loading, updating, and drawing for that part of the game organized and ran from a separate file. Just makes it easier for me to keep things from influencing or tripping up each other as I get farther into development. This i really just for me to mentally keep things organized easier
I realize I'm overthinking it, I'm just surprised that lua has no functionality to use more than one main.lua easily :/ I'd use love.filesystem.load, but that doesn't run love.load as well as no debugging errors.
Thanks for the help though, I guess I was just hoping that I'd missed something.
Re: splitting my code into multiple lua files using filesystem.load
Posted: Sun May 15, 2016 1:25 am
by Beelz
Same thing, just include the functions...
Code: Select all
-- create the table we will return
local map = {
title = 'Map1',
size = {w=5000, h=5000}
}
function map.update(dt)
-- update
end
function map.draw()
-- draw
end
return map
Then with multiple levels:
Code: Select all
-- Make a table of map tables
local levels = {
map1 = require 'mapfile1',
map2 = require 'mapfile2',
map3 = require 'mapfile3'
}
-- Keep Track
local curLvl = 'map1'
function love.update(dt)
-- update only current
levels[curLvl].update(dt)
end
function love.draw()
-- draw only current
levels[curLvl].draw()
end
Re: splitting my code into multiple lua files using filesystem.load
Posted: Sun May 15, 2016 2:19 am
by bkwrm
I will have to fiddle with that when I get home from work, I thought everything in a module though had to be inside a function, and than you called those functions as you needed them? You never ran the module from top to bottom, you only ran the function as you called them from the main.lua.
Does it run through the module as soon as you require it? I was sticking them in the very beginning of my main.lua to make sure all the functions were available as needed.
Thanks, you gave me a few ideas.
Re: splitting my code into multiple lua files using filesystem.load
Posted: Sun May 15, 2016 1:46 pm
by Beelz
Anything not inside a function will be run as soon as you require the file... If they are in functions, you must call the functions for anything to happen. So say you had a config file that sets globals for your game:
gameConfig.lua
Code: Select all
ScreenW = 800
ScreenH = 600
bgColor = {50,200,180}
-- Note there is no return at the end, and nothing is local...
-- This will insert these varibles into the global spectrum for your game to use.
Then just require it without declaring a variable(because it doesn't return a table):
Code: Select all
require 'gameConfig'
function love.load()
-- Using the globals we set
love.window.setMode(ScreenW, ScreenH)
love.graphics.setBackgroundColor(bgColor)
end
However, for the sake of organization, I prefer to use tables:
Code: Select all
local cfg = {
ScreenW = 800,
ScreenH = 600,
bgColor = {50,200,180}
}
return cfg
Then call upon the table for the values:
Code: Select all
CONFIG = require 'gameConfig'
function love.load()
love.window.setMode(CONFIG.ScreenW, CONFIG.ScreenH)
love.graphics.setBackgroundColor(CONFIG.bgColor)
end
Re: splitting my code into multiple lua files using filesystem.load
Posted: Sun May 15, 2016 10:35 pm
by bkwrm
Thank you! Every example I've seen showed using modules like a function library basically. A lot of what you are showing me I already knew, I just had no idea you could run a module from top to bottom, this changes things a lot
EDIT: Just tested this, it does run the update and draw functions on it's own. Does not run the load function but that's not really needed since I can just put my loading stuff before the update and draw functions. Also it error codes correctly. This is exactly what I was looking for, thanks again!