错误 main.lua:23:尝试索引 upvalue 'Menu' (布尔值)

2024-04-01

我正在尝试用 lua 和 love2d 制作一个主菜单,这是我第一次这样做,遗憾的是没有关于此事的教程,所以我自己尝试了一下。我一直遇到这个错误,我不知道如何解决它,请帮助!

完整错误消息: 错误main.lua:23:尝试索引upvalue“菜单”(布尔值)回溯main.lua:23:在函数“load”中[C]:在函数“xpcall”中[C]:在函数“xpcall”中

菜单文件

local Menu = {}
local game_state = 'menu'
local menus = { 'Play', 'Quit' }
local selected_menu_item = 1
local window_width
local window_height
local font_height

local Map = require("map")

-- functions
local draw_menu
local menu_keypressed
local draw_game
local game_keypressed

function Menu:load()

  -- get the width and height of the game window in order to center menu items
  self.window_width, self.window_height = love.graphics.getDimensions()

  -- use a big font for the menu
  self.font = love.graphics.newFont("assets/bit.ttf", 36)

  -- get the height of the font to help calculate vertical positions of menu items
  self.font_height = font:getHeight()

end

function Menu:update(dt)

end

function Menu:draw()
  local horizontal_center = self.window_width / 2
  local vertical_center = self.window_height / 2
  local start_y = vertical_center - (self.font_height * (#menus / 2))

  -- draw guides to help check if menu items are centered, can remove later
  -- love.graphics.setColor(1, 1, 1, 0.1)
  -- love.graphics.line(horizontal_center, 0, horizontal_center, window_height)
  -- love.graphics.line(0, vertical_center, window_width, vertical_center)

  -- draw game title
  love.graphics.setColor(1, 1, 1, 1)
  love.graphics.printf("Breakout", 0, 150, window_width, 'center')

  -- draw menu items
  for i = 1, #menus do

    -- currently selected menu item is yellow
    if i == selected_menu_item then
      love.graphics.setColor(1, 1, 0, 1)

    -- other menu items are white
    else
      love.graphics.setColor(1, 1, 1, 1)
    end

    -- draw this menu item centered
    love.graphics.printf(menus[i], 0, start_y + self.font_height * (i-1), self.window_width, 'center')

  end

end

function Menu:keypressed(key)

  -- pressing Esc on the main menu quits the game
  if key == 'escape' then
    love.event.quit()

  -- pressing up selects the previous menu item, wrapping to the bottom if necessary
  elseif key == 'up' then

    selected_menu_item = selected_menu_item - 1

    if selected_menu_item < 1 then
      selected_menu_item = #menus
    end

  -- pressing down selects the next menu item, wrapping to the top if necessary
  elseif key == 'down' then

    selected_menu_item = selected_menu_item + 1

    if selected_menu_item > #menus then
      selected_menu_item = 1
    end

  -- pressing enter changes the game state (or quits the game)
  elseif key == 'return' or key == 'kpenter' then

    if menus[selected_menu_item] == 'Play' then
      Map:load()
    elseif menus[selected_menu_item] == 'Quit' then
      love.event.quit()
    end

  end

end

主文件

love.graphics.setDefaultFilter("nearest", "nearest")
local Player = require("player")
local Coin = require("coin")
local GUI = require("gui")
local Spike = require("spike")
local Camera = require("camera")
local Stone = require("stone")
local Enemy = require("enemy")
local Map = require("map")
local Enemy2 = require("enemy2")
local Sound = require("sound")
local Menu = require("menu")

function love.load()
    Sound:init("music", "sfx/music.wav", "static")
    Sound:init("breeze", "sfx/breeze.mp3", "static")
    Enemy.loadAssets()
    Enemy2.loadAssets()
    Map:load()
    background = love.graphics.newImage("assets/background2.png")
    Player:load()
    GUI:load()
    Menu:load()
end

function love.update(dt)
    Sound:update()
    World:update(dt)
    Player:update(dt)
    Coin.updateAll(dt)
    Stone.updateAll(dt)
    Enemy.updateAll(dt)
    Enemy2.updateAll(dt)
    GUI:load(dt)
    Spike:updateAll(dt)
    Camera:setPosition(Player.x, 0)
    Map:update(dt)
    Menu:load()
end

function love.draw()
    love.graphics.draw(background)
    Map.level:draw(-Camera.x, -Camera.y, Camera.scale, Camera.scale)

    Menu:draw()
    Camera:apply()
    Player:draw()
    Enemy.drawAll()
    Enemy2.drawAll()
    Coin.drawAll()
    Spike.drawAll()
    Stone.drawAll()
    Camera:clear()

    GUI:draw()
end

function love.playmusic()
    loopingMusic = Sound:play("music", "sfx", 0.05, 1)
    loopingMusic:setLooping(true)
end

function love.playBreeze()
    loopingBreeze = Sound:play("breeze", "sfx", 0.3, 1)
    loopingBreeze:setLooping(true)
end

function love.keypressed(key)
    Player:jump(key)
    Menu:keypressed(key)
    if key == "m" then
        Sound:stop("sfx")
    end
end

function beginContact(a, b, collision)
    if Coin.beginContact(a, b, collision) then 
        return
    end
    if Spike.beginContact(a, b, collision) then 
        return end
    Enemy.beginContact(a, b, collision)
    Enemy2.beginContact(a, b, collision)
    Player:beginContact(a, b, collision)
end

function endContact(a, b, collision)
    Player:endContact(a, b, collision)
end

function endGame()
    love.event.quit()
end

您的 menu.lua 不会返回您的表菜单。

所以协助menu = require("menu")导致menu指的是Menu but to true.

来自Lua手册 http://www.lua.org/manual/5.4/manual.html#pdf-requirel:

一旦找到加载器,require就会用一个单一的调用调用加载器 参数,模组名称。如果加载器返回任何值,则需要分配 package.loaded[modname] 的返回值。如果装载机返回 没有值并且没有为 package.loaded[modname] 分配任何值, 然后 require 为该条目分配 true。无论如何,要求 返回 package.loaded[modname] 的最终值。

因此,在 main.lua 的第 23 行中,您实际上是在尝试索引 true(一个布尔值)。Menu:load()

Add return Menu到 menu.lua 的末尾

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

错误 main.lua:23:尝试索引 upvalue 'Menu' (布尔值) 的相关文章

  • Java旋转非方形JPanel组件

    由于操作系统限制 我正在尝试旋转填充有文本标签的 GridLayout 以模拟纵向视图 它们所在的 JPanel 不是方形的 因此当旋转 90 度时 标签会根据 JPanel 的尺寸被切断 是否可以根据旋转调整布局大小以仍然适合 JPane
  • 如何在vim中将菜单键(“应用程序键”)映射到Escape键?

    我认为使用菜单键退出 vim 的插入模式将是一件很棒的事情 使用 Super 键也很好 但我不确定是否可能 因为 Super 键是一个修饰符 无论如何 我找不到任何与此相关的内容 寻求您的帮助并提前致谢 我认为没有任何方法可以配置 Vim
  • Python 终端菜单?终端着色?终端进度显示?

    我有一个广泛使用 Python 2 风格 的项目 我想知道是否有终端菜单库或类似的东西 我希望通过使用箭头键突出显示选项 一些颜色等简化一些选项 为我的脚本注入一些风味和活力 我隐约记得有一种方法可以制作 bash shell 终端菜单 但
  • Java Swing - JLabel 位置

    我在设置 Jlabel 位置时遇到问题 我将内容窗格设置为某个 JPanel 我创建并尝试添加我的 JLabel JLabel mainTitle new JLabel SomeApp mainTitle setFont new Font
  • 自动化 Windows UI 测试方法

    我们正在寻求设置自动化 UI 测试 并想知道最好的方法是什么 潜在的陷阱是什么 设置费用是否昂贵 提前致谢 B 自动化测试最大的消耗可能是时间 有很多非常昂贵的工具 但也有免费的工具 即使是昂贵的工具的成本也不太可能与正确设置自动化测试所需
  • Swing 组件 - 禁用布局中的调整大小

    我有一个自定义 GUI 组件 它基于 Swing 的 JPanel 该组件放置在使用 BorderLayout 的 JFrame 中 当我调整框架大小时 该组件会不断调整大小 我怎样才能避免这种情况 我希望组件无论发生什么情况都保持相同的大
  • 为什么 LuaJIT 这么好?

    编辑 不幸的是 LuaJIT 已从下面链接的比较中删除 This 比较 http shootout alioth debian org u64 which programming languages are fastest php编程语言的
  • 按钮和窗口之间的空间

    我这里有这段代码 其想法是在主窗口中在文本区域旁边有两个按钮 但我尚未添加 在尝试使用 GridBagLayout 并在此过程中扯掉我的头发后 我决定不使用布局并在不可调整大小的窗口内手动放置按钮 import java awt impor
  • 根据条件更改 JSlider 的最小值和最大值

    我正在 Netbeans 中创建 Swing GUI 此 GUI 的目的是打开一个 缓冲 图像 在 JLabel 中作为图标 并对其应用仿射变换 现在我正在做 4 个转换 如下所示 现在 每个变换都需要两个滑块来更改 X 和 Y 值 但旋转
  • 常见的 Web UI 样式

    在接下来的几天里 我必须向我的一位客户展示一个 Web 应用程序的原型 问题是我不太擅长 CSS 最糟糕的是我几乎对得到的结果不满意 编写业务逻辑对我来说没有任何挑战 但 UI 设计却占用了我 80 以上的时间 我不需要什么令人惊叹的东西
  • 如何删除在设计器模式下创建的插槽?

    我已经创建了按钮cancelButton 然后我创建了函数槽on cancelButton clicked 使用上下文菜单项Go to slot 但是 过了一段时间 我删除了这个按钮 不再需要 并尝试删除该函数 但编译器给出错误undefi
  • 在主窗体上使用 BeginInvoke 调用的网络任务未执行

    我使用 Visual Studio 2013 构建了一个具有单个表单的 C 应用程序 并且该应用程序有两个更新屏幕的例程 更新屏幕的例程需要在主线程上运行 因此我自己的线程 不与屏幕交互 在需要更新时调用主窗体上的 BeginInvoke
  • Qt Designer 与手动编码

    每次我使用图形工具包开始一个项目时 第一个冲突就会发生在如何处理视觉设计和小部件布局的决定上 图形工具还是手动编码 这是一个非常棘手 主观的问题 因为大多数人会根据个人喜好来决定 它还很大程度上取决于图形工具的质量 在这种情况下 我想只关注
  • ContentPane 和 JPanel 之间有什么关系?

    我发现了一个示例 其中将按钮添加到面板 实例JPanel 然后将面板添加到容器中 由getContentPane 然后容器通过构造被包含到JFrame 窗户 我尝试了两件事 我把容器扔掉了 更详细地说 我向面板添加了按钮 实例JPanel
  • lua中的权限问题

    是否需要在 corona build settings 中设置一些特定权限才能将高分永久保存在文件中 每次运行代码时都会出现 权限被拒绝 的错误 如何纠正这个错误 这是我尝试过的代码 function read score local f1
  • BlackBerry - 带居中位图的 ButtonField

    我有一个从 ButtonField 扩展的类 class BitmapButtonField extends ButtonField private Bitmap bitmap private int buttonWidth private
  • 我应该在 Android 1.x 和 2.x 应用程序中部署什么样的图标?

    事情是这样的 在 Android 1 5 和 1 6 中我们有图标设计指南 http developer android com guide practices ui guidelines icon design html 本指南中有应用程
  • F# 对于 OO 或命令式来说缺少什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • MATLAB - GUI 和 OPC 服务器

    我想在 MATLAB 中设计一个图形用户界面 可以使用 MATLAB 的过程控制对象链接和嵌入 OPC 工具箱连续读取数据 我怎样才能实现这个 我已经设计了图形用户界面 但我无法将数据读入图形用户界面 就这样做 type opctoolMA
  • 如何在 emacs lua-mode 中配置缩进?

    完整的 emacs 新手在这里 我在 Ubuntu 上使用 emacs 23 1 1emacs 入门套件 https github com technomancy emacs starter kit 我主要在 lua 模式下工作 安装了pa

随机推荐