ОШИБКА: попытка индексировать глобальный квадрат (нулевое значение) - PullRequest
0 голосов
/ 01 июня 2018

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

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)

- Наш игрок еще не совсем двигается.Мы настроили слушателей на перемещение персонажа влево или вправо, но теперь мы фактически должны заставить его двигаться.Мы делаем это с помощью Runtime Event Listener, который перемещает парня вдоль оси x.

- Локальная функция перемещения персонажа movePlayer (событие) player.x = player.x + motionRight;если player.x> display.contentWidth, то player.x = 0 end 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 Ответ

0 голосов
/ 01 июня 2018

Это проблема, связанная с областью действия.В отличие от глобальных переменных, область действия локальных переменных ограничена блоком, в котором они объявлены.Таким образом, ваша переменная square доступна только в этих четырех функциях: bottem, top, left и right.

Простое решение требует использования предварительного объявления:

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

Подробнее:

...