display.remove(obj) 不起作用,为什么?(lua)

在这个程序中,当你点击对象 moon 时,函数 changeScene() 应该从 end.lua 切换到 start.lua 场景(以重新启动游戏)。

但是在 start.lua 中,moon 仍然在显示屏上。

因此,在 changeScene() 中,我添加了 display.remove(moon) 但它没有起作用。

我也尝试了 moon:removeSelf()sceneGroup:remove(3)

此外,我不知道为什么 moon:removeSelf() 会显示此错误:

错误:运行时错误
                    end.lua: 13: 尝试为全局 'moon'(一个无值的变量)索引
                    堆栈跟踪:
                      end.lua:13: 在函数中“?”
                      ?: 在函数中 <?:190>

我到底做错了什么?

end.lua

local composer = require("composer")

local scene = composer.newScene()

-- create()
function scene:create(event)

   local sceneGroup = self.view

   local function changeScene()
       --moon:removeSelf()
       --sceneGroup:remove(3)
       display.remove(moon)
       --moon = nil
       composer.removeScene("end")
       composer.gotoScene("start",{effect = "slideUp",time = 500})
   end

   local text = display.newText(correctAnswers.."/10 正确", display.contentCenterX, 280,native.systemFont,50)
   text.y = display.contentCenterY-100
   sceneGroup:insert(text)

   local text2 = display.newText("按下月亮重新开始", display.contentCenterX,280,native.systemFont,20)
   text2.x = display.contentCenterX
   text2.y = display.contentCenterY+200
   transition.blink(text2,{time=2500})
   sceneGroup:insert(text2)

   local floor = display.newImageRect("floor.png",300,50)
   floor.x = display.contentCenterX
   floor.y = display.viewableContentHeight+100

   local moon = display.newImageRect("balloon.png",112,112)
   moon.x = math.random(40,display.contentWidth-40)
   moon.y = 50
   moon.alpha = 0.8

   local physics = require("physics")
   physics.start()
   physics.addBody(floor,"static")
   physics.addBody(moon,"dynamic",{radius=50,bounce=0.5})

   moon:addEventListener("tap",changeScene)

end
点赞
用户12568711
用户12568711

在 Lua 中,当我们使用函数时,无论何时在其中调用变量,它都必须是 local,但当我们在函数内调用函数外的变量时,它必须是 global

移除 moon 变量声明中的 local 并查看它是否解决了问题。

2020-08-23 16:29:01
用户6879826
用户6879826

在函数内部使用局部变量是可以的。但是变量只能在作用域内使用

当然,在函数定义的参数列表中的变量在函数内部是在作用域内的。但是未在参数列表中的变量也可以被使用,前提是它们在函数定义的时候在作用域内。在 OP 代码中, changeScene 函数没有参数,因此在函数中使用的任何变量都必须在函数定义时在作用域内。变量 moon 是一个局部变量,在声明它的块中的定义点之后的作用域内。因此,在changeScene定义时,moon并不在作用域内。解决这个问题的一种方法是将moon的定义移动到changeScene定义之前的位置:

local moon = display.newImageRect("balloon.png", 112, 112)
moon.x = math.random(40,display.contentWidth - 40)
moon.y = 50
moon.alpha = 0.8

local function changeScene ()
    display.remove(moon)
    composer.removeScene("end")
    composer.gotoScene("start", {effect = "slideUp", time = 500})
end
2020-08-23 19:18:46
用户16797156
用户16797156

使用函数时可以在内部使用已定义的变量,但需要确保:1.它是局部的 2.如果它在外部,就是全局的。

尝试从定义的moon变量中移除局部变量,你可能能够解决它 :D

2021-08-31 14:24:03