2013-08-10 3 views
1

Я просто пытаюсь добавить eventListener к объекту, который должен исчезнуть, когда я коснусь его. Но я получаю ошибку, упомянутую в названии. Вот весь мой код в данный момент:Corona SDK (LUA) - попытка вызвать upvalue 'spawnEnemy' (значение nil)

-- 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)

ответ

3

Измените local function spawnEnemy() на function spawnEnemy(), поскольку эта переменная уже была объявлена ​​ранее. Да, это типичная ловушка Лоа для начинающих.

+0

Спасибо, это помогло мне. Попытайтесь запомнить это. –

1

Вы указали spawnEnemy как локальную переменную дважды. Это разрешено (второй скрывает первое место, где когда-либо было второе), но это не то, что вы хотели.

Вы правильно объявили локальную переменную и зафиксировали ее в showTitle. Чтобы установить эту же самую переменную позже, используйте оператор присваивания без префикса с local. Вы можете присвоить ему определение функции, используя «анонимный» синтаксис функции:

spawnEnemy = function() 
    ... 
end 

На самом деле, в Lua, all functions are anonymous, так как они являются только значения. Но для отладки полезно иметь имя, связанное с функцией. В трассировке стека, где это возможно, используется имя переменной, используемой для вызова функции.

Смежные вопросы