Corona SDK(LUA) - 尝试调用upvalue'spawnEnemy'(零值)

时间:2013-08-10 18:13:34

标签: lua corona

我只是尝试将eventListener添加到一个对象,当我点击它时它会消失。但我在标题中提到了错误。这是我的整个代码:

-- housekeeping stuff

display.setStatusBar(display.HiddenStatusBar)

local centerX = display.contentCenterX
local centerY = display.contentCenterY

-- set up forward references

local spawnEnemy

-- preload audio

-- create play screens

local function createPlayScreen()

    local bg = display.newImage("background.png")
    bg.y = 130
    bg.x = 100
    bg.alpha = 0

    local planet = display.newImage("planet.png")
    planet.x = centerX
    planet.y = display.contentHeight +60
    planet.alpha = 0

    transition.to( bg,  { time = 2000, alpha = 1,  y = centerY, x = centerX } )

    local function showTitle()
        local gametitle = display.newImage("gametitle.png")
        gametitle.alpha = 0
        gametitle:scale (4, 4)
        transition.to( gametitle, { time = 500, alpha = 1, xScale = 1, yScale = 1 })
        spawnEnemy()
    end 
    transition.to( planet,  { time = 2000, alpha = 1,  y = centerY, onComplete = showTitle } )
end

-- game functions

local function shipSmash(event)

    local obj = event.target
    display.remove( obj )

end

local function spawnEnemy()

    local enemy = display.newImage("beetleship.png")
    enemy.x = math.random(20, display.contentWidth - 20)
    enemy.y = math.random(20, display.contentHeight - 20)
    enemy:addEventListener ( "tap", shipSmash )

end


local function startGame()

end


local function planetDamage()

end


local function hitPlanet(obj)

end




createPlayScreen()
startGame()

以下是错误窗口的样子:

enter image description here

我是这个领域的新手(LUA编程),对于可能是愚蠢的语法错误或其他什么感到抱歉,但我看到的是在我编写这行代码后出现此错误:enemy:addEventListener ( "tap", shipSmash )

2 个答案:

答案 0 :(得分:3)

local function spawnEnemy()更改为function spawnEnemy(),因为此变量已在前面声明过。是的,这是初学者的典型Lua陷阱。

答案 1 :(得分:1)

您已将spawnEnemy声明为局部变量两次。这是允许的(第二个隐藏第一个,其中第二个在范围内),但这不是你想要的。

您已正确声明了一个局部变量并在showTitle中捕获了该变量。要在以后设置同一个变量,请使用赋值语句,而不要在其前面添加local。您可以使用“匿名”函数语法为其分配函数定义:

spawnEnemy = function() 
   ...
end 

实际上,在Lua,all functions are anonymous,因为它们只是价值观。但是,对于调试,使用与函数关联的名称会很有帮助。在堆栈跟踪中,尽可能使用用于调用该函数的变量的名称。