在 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 定义,它不能包含具有值的成员。
另一方面,ball
是 Ball
的 实例 ,这意味着它具有具有值的成员,并且可以具有非静态调用它的方法(例如 update
)。
(此外,您对 Ball:reset
做同样的事情,尽管您在 ball:render
上做对了。)
我这辈子都弄不明白这里出了什么问题,我一遍又一遍地编写代码,检查了错误、拼写等。也许这是我不明白的地方,或者别的什么我的眼睛正在矫正,但每次我 运行 程序并尝试移动球时,它都会给我所附图像中的错误。
如有任何帮助,我们将不胜感激。谢谢。
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 定义,它不能包含具有值的成员。
ball
是 Ball
的 实例 ,这意味着它具有具有值的成员,并且可以具有非静态调用它的方法(例如 update
)。
(此外,您对 Ball:reset
做同样的事情,尽管您在 ball:render
上做对了。)