Я пытаюсь создать объект AllBalls в своем игровом состоянии, но когда я пытаюсь инициализировать объект, я получаю сообщение об ошибке - PullRequest
0 голосов
/ 08 июля 2020

В моем игровом статусе я создаю экземпляр, если мой объект как таковой

function PlayState:enter(params)
    self.paddle = params.paddle
    self.bricks = params.bricks
    self.health = params.health
    self.score = params.score
    self.highScores = params.highScores
    self.level = params.level

    self.recoverPoints = 5000
    self.extendPoints = 7000

    -- give ball random starting velocity

    self.inPlayBalls= AllBalls(params.ball)
    self.inPlayBalls[1].dx = math.random(-200, 200)
    self.inPlayBalls[1].dy = math.random(-50, -60)
end

класс AllBalls - это простой класс, который действует как таковой

AllBalls = Class{}

function AllBalls:init(p)
    self.ball=p
    self.inPlayBalls={self.ball}
end

function AllBalls:update(dt,target)
    for k, ball in pairs(self.inPlayBalls) do
        ball:update(dt)
        if ball:collides(target) then
            -- raise ball above paddle in case it goes below it, then reverse dy
            ball.y = target.y - 8
            ball.dy = -target.dy
    
            --
            -- tweak angle of bounce based on where it hits the paddle
            --
    
            -- if we hit the paddle on its left side while moving left...
            if ball.x < target.x + (target.width / 2) and target.dx < 0 then
                ball.dx = -50 + -(8 * (target.x + target.width / 2 - ball.x))
            
            -- else if we hit the paddle on its right side while moving right...
            elseif ball.x > target.x + (target.width / 2) and target.dx > 0 then
                ball.dx = 50 + (8 * math.abs(target.x + target.width / 2 - ball.x))
            end
    
            gSounds['paddle-hit']:play()
        end

        if math.abs(ball.dy) < 150 then
            ball.dy = ball.dy * 1.02
        end
        if ball.remove then
            table.remove(self.AllBalls, k)
        end
    end
    
end

function AllBalls:collides(target)
    for k, ball in pairs(self.inPlayBalls) do
        if ball:collides(target) then
            if ball.x + 2 < brick.x and ball.dx > 0 then
                
                -- flip x velocity and reset position outside of brick
                ball.dx = -ball.dx
                ball.x = brick.x - 8
            
            -- right edge; only check if we're moving left, , and offset the check by a couple of pixels
            -- so that flush corner hits register as Y flips, not X flips
            elseif ball.x + 6 > brick.x + brick.width and ball.dx < 0 then
                
                -- flip x velocity and reset position outside of brick
                ball.dx = -ball.dx
                ball.x = brick.x + 32
            
            -- top edge if no X collisions, always check
            elseif ball.y < brick.y then
                
                -- flip y velocity and reset position outside of brick
                ball.dy = -ball.dy
                ball.y = brick.y - 8
            
            -- bottom edge if no X collisions or top collision, last possibility
            else
                
                -- flip y velocity and reset position outside of brick
                ball.dy = -ball.dy
                ball.y = brick.y + 16
            end
        end
    end
end

function AllBalls:add(ball)
    local newBall=Ball(ball.skin)
    newBall.x=ball.x
    newBall.dx=math.random(-200,200)
    newBall.y=ball.y
    newBall.dy=ball.dy

    table.insert(self.inPlayBalls, newBall)
end

function AllBalls:out()
    for k, ball in pairs(self.inPlayBalls) do
        if ball.y >= VIRTUAL_HEIGHT then
            ball.remove=true
        end
    end
end

, когда я вхожу в игровое состояние Я получаю следующую ошибку:

src / states / PlayStatue. lua: 37 попытка проиндексировать нулевое значение

Я новичок в Lua в целом и, вероятно, сделал глупую ошибку что я не мог найти, поэтому будет нужна помощь

1 Ответ

0 голосов
/ 14 июля 2020

Вероятно, проблема связана с этим назначением.

self.inPlayBalls= AllBalls(params.ball)

Если посмотреть на ваш GitHub, inPlayBalls является атрибутом экземпляра AllBalls. Это означает, что вам нужно сначала создать свой экземпляр AllBalls, а затем получить атрибут, чтобы назначить его переменной, например, в следующем примере:

self.allBalls = AllBalls(params.ball)
self.inPlayBalls = self.allBalls.inPlayBalls
...