0
votes

I have been googling the crap out of this error (attempt to index global 'square' (a nil value)), but I can't seem to understand what the problem is... I know it should be fairly easy to fix but I can't figure it out for the life of me. The error is occurring at the very bottom, I marked the problem.

enter code here
local backdrop = display.setDefault("background", 1, 1, 1)

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

_W = display.contentWidth; -- Get the width of the screen
_H = display.contentHeight; -- Get the height of the screen

motionDown = 0;
motionUp = 0;
motionRight = 0;
motionLeft = 0;
motionSquare = 5

speed = 4

local left = display.newRect(0,0,_W/2,_H/1.19)
    left.x = _W/4.5; left.y = _H/2;

local right = display.newRect(0,0,_W/2,_H/1.19)
    right.x = _W/1.25; right.y = _H/2;

local top = display.newRect(0,0,_W,_H/5.5)
    top.x = _W/2; top.y =0;

local bottem = display.newRect(0,0,_W,_H/5.5)
    bottem.x = _W/2; bottem.y =_H;

    player = display.newImage("player.png", display.contentCenterX, display.contentCenterY)
        player.x = math.random(10,_W-10)
        player.y = math.random(10,_H-10)

player:toFront(player)

physics.addBody( player, "static" )


function left:tap()
        motionDown = 0;
        motionUp = 0;
        motionRight = 0;
    motionLeft = -speed;

    local square = display.newRect( 0, 0, 5, 5 )
    square.strokeWidth = 3
    square:setFillColor( 0 )
    square:setStrokeColor( 0, 0, 0 )
    square.x = player.x + 10 ; square.y = player.y;

    local function moveSquare (event)
        square.x = square.x + motionSquare;
        end
        Runtime:addEventListener("enterFrame", moveSquare)



end
    left:addEventListener("tap",left)

function right:tap()
        motionDown = 0;
        motionUp = 0;
        motionLeft = 0;
    motionRight = speed;

        local square = display.newRect( 0, 0, 5, 5 )
        square.strokeWidth = 3
        square:setFillColor( 0 )
        square:setStrokeColor( 0, 0, 0 )
        square.x = player.x - 10 ; square.y = player.y;

        local function moveSquare (event)
            square.x = square.x - motionSquare;
            end
            Runtime:addEventListener("enterFrame", moveSquare)

end
    right:addEventListener("tap",right)

function top:tap()
        motionDown = 0;
        motionRight = 0;
        motionLeft = 0;
        motionUp = -speed;
        local left = display.newRect(0,0,5,5)

        local square = display.newRect( 0, 0, 5, 5 )
        square.strokeWidth = 3
        square:setFillColor( 0 )
        square:setStrokeColor( 0, 0, 0 )
        square.x = player.x ; square.y = player.y + 10;

        local function moveSquare (event)
            square.y = square.y + motionSquare;
            end
            Runtime:addEventListener("enterFrame", moveSquare)

end
    top:addEventListener("tap",top) 

function bottem:tap(event)
        motionRight = 0;
        motionUp = 0;
        motionLeft = 0;
    motionDown = speed;

        local square = display.newRect( 0, 0, 5, 5 )
        square.strokeWidth = 3
        square:setFillColor( 0 )
        square:setStrokeColor( 0, 0, 0 )
        square.x = player.x ; square.y = player.y - 10;

        local function moveSquare (event)
        square.y = square.y - motionSquare;
        end
        Runtime:addEventListener("enterFrame", moveSquare)


end

    bottem:addEventListener("tap",bottem)

--Our player isn’t quite moving yet. We’ve set up the listeners to move the character left or right, but now we actually have to make him move. We do this with a Runtime Event Listener that will move the guy along the x axis.

-- Move character local function movePlayer (event) player.x = player.x + motionRight; if player.x > display.contentWidth then player.x = 0 end end Runtime:addEventListener("enterFrame", movePlayer)

local function movePlayer (event)
    player.x = player.x + motionLeft;
        if player.x < 0 then player.x = display.contentWidth
        end
    end
    Runtime:addEventListener("enterFrame", movePlayer)

local function movePlayer (event)
    player.y = player.y + motionUp;
        if player.y > display.contentHeight then player.y = 0
        end
    end
    Runtime:addEventListener("enterFrame", movePlayer)

local function movePlayer (event)
    player.y = player.y + motionDown;
        if player.y < 0 then player.y = display.contentHeight
        end
    end
    Runtime:addEventListener("enterFrame", movePlayer)
    if square.y > display.contentHeight then square.y = 0 ### This is the 
                                                                error
       end
1

1 Answers

0
votes

This is scope related problem. Unlike global variables, local variables have their scope limited to the block where they are declared. So your square variable is accessible only in those four function: bottem, top, left and right.

Simple solution require use forward declaration:

-- Top of file
local square 
-- Later in the code you use only name of variable without local key word

Read more: