简体   繁体   中英

Attempt to index global 'front' (a nil value)

I'm coding in Lua with Corona SDK and I get this error "Attempt to index global 'front' (a nil value)" in Line 75

I'm doing this in game.lua, redirected from main.lua (this part works ok) .... Link is to pastebin, because stackoverflow messes the code!

--requires
local storyboard = require "storyboard"
local scene = storyboard.newScene()

local physics = require "physics"
physics.start()


function scene:createScene(event)
    local screenGroup = self.view

    local bkg = display.newImage("bkg.png")

    local back = display.newImage("back.png")
    back.y=450
    back.speed = 1
    back:setReferencePoint(display.BottomLeftReferencePoint)

    local back1 = display.newImage("back.png")
    back1.y=450
    back1.x=2400
    back1.speed = 1
    back1:setReferencePoint(display.BottomLeftReferencePoint)

    local front = display.newImage("front1.png")
    front.y=470
    front.speed = 4
    front:setReferencePoint(display.BottomLeftReferencePoint)

    local front1 = display.newImage("front1.png")
    front1.y=470
    front1.x=2400
    front1.speed = 4
    front1:setReferencePoint(display.BottomLeftReferencePoint)

    local bird = display.newImage("bird.png")
    bird.y = 285; bird.x= 200
    physics.addBody(bird, "dynamic", 
                    {density=0.1, bounce=0.1, friction=0.2, radius=10})
end

function scrollHill(self,event)
    if self.x < -1800 then
        self.x = 1400 - self.speed * 2
    else
        self.x = self.x - self.speed
    end
end

function activateBird(self,event)
    self:applyForce(0, -1.5, self.x, self.y)
end

function touchScreen(event)
   print("touch_ok")
   if event.phase =="began" then
    bird.enterFrame = activateBird
    Runtime:addEventListener("enterFrame", bird)
   end

    if event.phase =="ended" then
    Runtime:removeEventListener("enterFrame", bird)
   end
end


function scene:enterScene(event)
    Runtime:addEventListener("touch", touchScreen)

    front.enterFrame = scrollHill
    Runtime:addEventListener("enterFrame", front)

    front1.enterFrame = scrollHill
    Runtime:addEventListener("enterFrame", front1)

    back.enterFrame = scrollHill
    Runtime:addEventListener("enterFrame", back)

    back1.enterFrame = scrollHill
    Runtime:addEventListener("enterFrame", back1)
end

function scene:exitScene(event)
end

function scene:destroyScene(event)
end

scene:addEventListener("createScene", scene)
scene:addEventListener("enterScene", scene)
scene:addEventListener("exitScene", scene)
scene:addEventListener("destroyScene", scene)

return scene

Most probably this is because the variable failed to initialize.

local front = display.newImage("front1.png")

Make sure the image file is located in the same directory as game.lua , and the file name is spelled correctly.

You need to add forward declarations at the module's scope for your variables in createScene() so they are available to enterScene() . Also, be sure to remove all your even listeners when you destroyScene.

Ex:

-- Use a forward declaration here so `front` 
-- is in the module's scope
local front

function scene:createScene(event)
    -- ...
    -- Don't use `local` here because `front` was defined
    -- above.
    front = display.newImage("front1.png")
    front.y=470
    front.speed = 4
    front:setReferencePoint(display.BottomLeftReferencePoint)
    -- ...
end

function scene:enterScene(event)
    -- ...
    -- Since `front` is in the parent's scope, 
    -- we can access it here
    Runtime:addEventListener("enterFrame", front)
    -- ...
end

function scene:destroyScene(event)
    -- Be sure to remove your listeners here
    Runtime:removeEventListener("enterFrame", front)
end

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM