Search code examples
oopmodulelualove2d

OOP GUI Error: main.lua:4: attempt to index local (a boolean value)... Issue with modules


Today, I was messing around with trying to make a gui class for game I'd like to start making in LOVE2D. I decided to try and use OOP to make creating new menus easier in the future. The OOP works great until I try and put it into it's own module, where it gives me the error above. I've double and triple checked my code against similar code and I can't find the problem. I've also looked it up and there are similar threads, but nothing that helps my problem. Here is the relevant code...

From the main.lua

local gui = {
x = 0, y = 0, 
width = 0, height = 0, 

popupSpeed = 300,

active = false,

color = {red = 0, blue = 0, green = 0, alpha = 0},

menuType = "",

--buttons = require "Game/buttons"
}

And from the gui.lua...

local newGUI = require "Game/gui"

local menus = { 
    playerInv = newGUI.new()
}
function love.load()
    menus.playerInv:createDropDown("right" , _, 30, 100, love.graphics.getHeight() - 60, 50, 128, 50, 255)
end

function gui.new() 
    newMenu = {}
    for k, v in pairs(gui) do
        newMenu[k] = v
    end
    return newMenu
end

function gui:createDropDown(direction, x, y, width, height, red, blue, green, alpha)
    self.red = red
    self.blue = blue
    self.green = green
    self.alpha = alpha
    if direction == "right" then 
        self.x = love.graphics.getWidth() - width
        self.y = y
        self.width = width
        self.height = height
        self.menuType = "rightDropDown"
    elseif direction == "left" then
        self.x = 0
        self.y = y
        self.widthMax = width
        self.height = height
        self.menuType = "leftDropDown"
    elseif direction == "down" then
        self.x = x
        self.y = y
        self.width = width
        self.heightMax = height
        self.menuType = "regDropDown"
    end
end

function gui:drawGui()
    if self.active == true then
        love.graphics.setColor(self.red, self.blue, self.green, self.alpha)
        love.graphics.rectangle("fill", self.x, self.y, self.width, self.height, 10, 10, 6) 
    end
end

Solution

  • I'm assuming the first snippet is Game/gui and that the second part is main.lua, if this is so, You are attempting to call .new() function which is clearly absent on your Game/gui file. You need to move all of gui's functions to it's own file as well, this includes gui.new(), gui:createDropDown and gui:drawGui() last but not least, you have to return gui at the end of it's own file.

    Your main file should end up somewhat like this:

    local newGUI = require "Game/gui"
    
    local menus = { 
        playerInv = newGUI.new()
    }
    function love.load()
        menus.playerInv:createDropDown("right" , _, 30, 100, love.graphics.getHeight() - 60, 50, 128, 50, 255)
    end
    

    and Game/gui somewhat like this:

    local gui = {} -- With all the stuff inside
    
    function gui.new() 
    -- With all the stuff it had inside
    end
    
    function gui:createDropDown()
    -- With all the stuff it had inside
    end
    
    function gui:drawGui()
    -- With all the stuff it had inside
    end
    
    return gui
    

    You see, you forgot to move its functions to its own file, and return gui itself. Don't forget to replace what i omitted on Game/gui!