Lua递归滚动菜单不起作用



嘿,伙计们,我只是想知道为什么我的菜单不起作用,我已经编码了大约8个小时了,只是不知道出了什么问题。

Menu = {
    label = "Mahin Menu",
    current = current or true,
    open = open or true,
    subMenus = {}
}
function Menu.newSubMenu()
    return {
        setup = Menu.setup,
        print = Menu.print,
        toggleOpen = Menu.toggleOpen,
        getCurrentMenu = Menu.getCurrentMenu,
        getLastMenu = Menu.getLastMenu,
        getNextMenu = Menu.getNextMenu,
        getPrevMenu = Menu.getPrevMenu
    }
end
function Menu:setup(m_parent, m_label, m_action)
    self.parent = m_parent
    self.label = m_label
    self.action = m_action
    self.subMenus = {}
    self.current = false
    self.open = false
    table.insert(m_parent.subMenus, self)
end
function Menu:print(indent)
    io.write(string.rep("    ", indent))
    if #self.subMenus>0 then
        if self.open == true then
            io.write("[-]")
        else
            io.write("[+]")
        end
    else
        io.write("   ")
    end
    if self.current == true then
        io.write("<" .. self.label .. ">")
    else
        io.write(" " .. self.label)
    end
    io.write("n")
    if #self.subMenus>0 and self.open == true then
        for i=1,#self.subMenus do
            self.subMenus[i]:print(indent+1)
        end
    end
end
function Menu:toggleOpen()
    if self.open == true then
        self.open = false
    else
        self.open = true
    end
end
function Menu:getCurrentMenu()
    if self.current == true then
        return self
    else
        for k=1,#self.subMenus do
            local v = self.subMenus[k]:getCurrentMenu()
            if v ~= nil then
                return v
            end
        end
    end
end
function Menu:getLastMenu()
    if self.open == true and #self.subMenus > 0 then
        return self.subMenus[#self.subMenus]:getLastMenu()
    else
        return self
    end
end
function Menu:getNextMenu(bool)
    bool = bool or false
    if bool == false then
        if #self.subMenus > 0 and self.open == true then
            return self.subMenus[1]
        end
    end
    if self.parent then
        if self.parent.subMenus[#self.parent.subMenus] == self then
            self.parent:getNextMenu(true)
        else
            for i=1,#self.parent.subMenus do
                if self.parent.subMenus[i] == self then
                    print(self.parent.subMenus[i+1].label)
                    return self.parent.subMenus[i+1]
                end
            end
        end
    else
        return self
    end
end
function Menu:getPrevMenu()
    if self.parent then
        for k=1,#self.parent.subMenus do
            if self.parent.subMenus[k] == self then
                if k == 1 then
                    return self.parent
                elseif #self.parent.subMenus[k-1].subMenus > 0 and self.parent.subMenus[k-1].open == true then
                    local x = self.parent.subMenus[k-1]
                    while #x.subMenus > 0 and x.open == true do
                        x = x.subMenus[#x.subMenus]
                    end
                    return x
                else
                    return self.parent.subMenus[k-1]
                end
            end
        end
    else
        return self
    end
end
Test = Menu.newSubMenu()
Test:setup(Menu, "Test item")
Mahi = Menu.newSubMenu()
Mahi:setup(Menu, "Mahi item")
Mahi.open = true
Testx = Menu.newSubMenu()
Testx:setup(Mahi, "Lalall")
Testx.open= true
Sadmad = Menu.newSubMenu()
Sadmad:setup(Testx, "Woot")
Asd = Menu.newSubMenu()
Asd:setup(Menu, "Asd menu")
Asd.current = true
Menu.current = false
repeat
    print(string.rep("n",2))
    Menu:print(0)
    x=io.read()
    if x == "z" then
        x = Menu:getCurrentMenu()
        print(Menu:getCurrentMenu().label)
        print(Menu:getCurrentMenu():getNextMenu().label)
        y = Menu:getCurrentMenu():getNextMenu()
        x.current = false
        y.current = true
    elseif x == "a" then
        x = Menu:getCurrentMenu()
        y = Menu:getCurrentMenu():getPrevMenu()
        x.current = false
        y.current = true
    end
until x == "sad"

"这是代码,当我试图将当前菜单从"Asd菜单"向下移动时,它会出错:

menu.lua:150: attempt to index a nil value

这没有任何意义,这是明确声明的,我试着添加打印,他们总是给我Asd菜单如果我尝试从Woot转移到Asd菜单,也是如此,同样的错误,我不知道为什么,因为我添加了那些打印

print(Menu:getCurrentMenu().label)
print(Menu:getCurrentMenu():getNextMenu().label)

他们确实给了我Asd菜单,但它说试图在第二行打印一个零值,但它确实打印了?我没主意了,有什么帮助吗?

第92行中缺少一个return语句。

请注意,这一行实际上并没有返回任何内容,因此函数返回的是nil。在将其更改为return self.parent:getNextMenu(true)之后,它似乎正在工作。

最新更新