在 self.dx 的 PONG 和 self.dy 的球 (PONG 5) 上,在 LUA 中保持零值

Keep getting nil value in LUA for PONG on self.dx and self.dy for ball (PONG 5)

我这辈子都弄不明白这里出了什么问题,我一遍又一遍地编写代码,检查了错误、拼写等。也许这是我不明白的地方,或者别的什么我的眼睛正在矫正,但每次我 运行 程序并尝试移动球时,它都会给我所附图像中的错误。

如有任何帮助,我们将不胜感激。谢谢。

Ball = Class{}

function Ball:init(x, y, width, height)
    self.x = x
    self.y = y
    self.width = width
    self.height = height
    self.dx = math.random(2)  == 1 and 100 or -100
    self.dy = math.random(-50,50)
end

function Ball:reset()
     --ball start location--
    self.x = VIRTUAL_WIDTH/2-2.5
    self.y = VIRTUAL_HEIGHT/2-2.5
 
     --random ball movement--
     self.dx = math.random(2)  == 1 and -100 or 100
     self.dy = math.random(-50,50) 
end

function Ball:update(dt)
    self.x = self.x + self.dx * dt
    self.y = self.y + self.dy * dt

end

function Ball:render()
    love.graphics.rectangle('fill', self.x, self.y, 5, 5)
end

主要功能代码:

WINDOW_WIDTH = 1280
WINDOW_HEIGHT = 720

--16:9 resolution--
VIRTUAL_WIDTH = 432
VIRTUAL_HEIGHT = 243

--import push library--
Class = require 'class'
push = require 'push'

require 'Ball'
require 'Paddle'



--runs the game--
function love.load()

    math.randomseed(os.time())

    --sets the filter--
    love.graphics.setDefaultFilter('nearest','nearest')

    --create smaller font--
    smallFont = love.graphics.newFont('font.TTF', 8)

    --create larger font--
    scoreFont = love.graphics.newFont('font.TTF', 32)
   
    --set player scores to 0--
    player1score = 0
    player2score = 0

    gameState = 'start'

    --set starting place of paddles--
    paddle1 = Paddle(5,20, 5, 20)
    paddle2 = Paddle(VIRTUAL_WIDTH-10, VIRTUAL_HEIGHT-30, 5, 20)
    
    --set ball starting place--
    ball = Ball(VIRTUAL_WIDTH/2-2.5, VIRTUAL_HEIGHT/2-2.5, 5, 5)

    --set paddle speed--
    PADDLE_SPEED = 200

    --sets up screen size--
    push:setupScreen(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, WINDOW_WIDTH, WINDOW_HEIGHT,{
        --does not allow fullscreen--
        fullscreen = false,
        --vertical sync--
        vsync = true,
        --does not allow resizing--
        resizable = false,
    })
end
--move paddles--
function love.update(dt)

    paddle1:update(dt)
    paddle2:update(dt)

    if love.keyboard.isDown('w') then
        paddle1.dy = -PADDLE_SPEED
    elseif love.keyboard.isDown('s') then
        paddle1.dy = PADDLE_SPEED
    else
        paddle1.dy = 0
    end  
    
    if love.keyboard.isDown('up') then
        paddle2.dy = -PADDLE_SPEED
    elseif love.keyboard.isDown('down') then
        paddle2.dy = PADDLE_SPEED
    else
        paddle2.dy = 0
    end  
    
    if gameState == 'play' then
        Ball:update(dt)
    end

end


--ends the game if the escape key is pressed--
function love.keypressed(key)
    if key == 'escape' then
        love.event.quit()

    elseif key == 'enter' or key == 'return' then
        if gameState == 'start' then
            gameState = 'play'
        else if gameState == 'play' then
            gameState = 'start'
             Ball:reset(dt)
        

        end
    end
end
end


--prints "Hello Pong!"--
--window height/2 to center from top to bottom, less 6 (half the height of the text)--
--from left to right is 'center' of windown width--
function love.draw()
    push:apply('start') --start drawing using push--

    --changes background--
    --changes ENTIRE SCREEN--
    --done before draw functions--
    love.graphics.clear(40/255, 45/255, 52/255, 255/255)

    --render paddles--
    paddle1:render()
    paddle2:render()

    --render ball--
    ball:render()

    --print Hello Pong--
    love.graphics.setFont(smallFont)
    if gameState == 'start' then
        love.graphics.printf("Hello, Start State!", 0, 20, VIRTUAL_WIDTH, 'center')
    elseif gameState == 'play' then
        love.graphics.printf("Hello, Play State!", 0, 20, VIRTUAL_WIDTH, 'center')
    end
 
    --display scores--
    love.graphics.setFont(scoreFont)
    love.graphics.print(player1score, VIRTUAL_WIDTH/2-50, VIRTUAL_HEIGHT / 3)
    love.graphics.print(player2score, VIRTUAL_WIDTH/2+30, VIRTUAL_HEIGHT / 3)

    push:apply('end') -- stop drawing using push
end

您正在调用 Ball:update(dt),这与您 真正想 调用的 ball:update(dt) 略有不同。看出区别了吗?

在第一个中,您正在编写有效代码,因为 Ball 是您创建的 class 定义。您可以调用 class 定义本身的方法,但前提是它们是 'static' 方法 - 即不触及 class 的任何成员的方法(例如 self.dx).如果他们尝试这样做,它将无法工作,因为这些成员尚未初始化 - 这是一个 class 定义,它不能包含具有值的成员。

另一方面,

ballBall 实例 ,这意味着它具有具有值的成员,并且可以具有非静态调用它的方法(例如 update)。

(此外,您对 Ball:reset 做同样的事情,尽管您在 ball:render 上做对了。)