如何在 Love2D 中改变每一帧的速度?
How to change the velocity in each frame in Love2D?
我正在尝试使用具有一些额外功能的 Love2D 框架在 Lua 上编写 Pong 游戏。其中,我希望出现曲线。为此,我正在尝试实现水平发射射弹的轨迹。我有一个球 table,其位置属性为 x (ball.x),另一个球为 y (ball.y)。我也有一个 x 速度属性 (ball.dx) 和一个 y 速度属性 (ball.dy)。最后,我有一个加速度变量(重力)
在我的游戏中,如果球拍移动并击中球,球应该跟随水平曲线。为了创建我的曲线,我想更改每一帧的 y 轴速度,以使我的球在屏幕上呈弧形移动。我遇到的主要问题是我不知道如何在每一帧中更改此速度以创建预期的弧线。我最近的尝试是创建一个类似于以下代码的 while 循环。但是,它会创建一个无限循环。有没有人可以赐教一下?
澄清:
-Player.x和player.y是玩家坐标
-Player2.x和Player2.y是对方坐标
-这段代码在另一个检测冲突的 if 语句中。它在 love.update(dt) 函数内。
非常感谢!
if love.keyboard.isDown("up") and distanceBetween(ball.x,ball.y,player.x,player.y)>30 then
ball.dy=0
while CollisionDetector(ball.x,player2.x,ball.y,player2.y, player2.width,player2.height,ball.size)==false or ball.x>0 or ball.y-20>0 or ball.y+20<love.graphics.getHeight() do
ball.dy=ball.dy+gravity*dt
ball.y=ball.y+ball.dy
end
end
我相信您提供的代码段是 love.update
函数的一部分。 (至少应该如此。)该函数应该一次执行游戏的一个步骤并且 return。它不应该在一次调用中处理整个航班。
在您的特定情况下,while
loop 期望球移动,但这在循环和包含函数结束之前不会发生。
一般来说,要模拟正在进行的流程,您必须存储有关此类流程的信息。例如,如果您希望重力依赖于桨的运动方向,那么您必须修改相应的变量并将其存储在调用之间。
在您的代码中,还有多个其他设计缺陷导致它无法按照您的预期进行。部分功能和代码部分自己实现,代码大纲如下:
function collides(ball,player)
return (ball.x,player.x,ball.y,player.y, player.width,player.height,ball.size)
end
function love.update(dt)
handle_paddle_movements()
--handle the ball-paddle interaction
if collides(ball,player1) or collides(ball,player2) then
ball.dx=-ball.dx
if love.keyboard.isDown("up") then
--store the info you need to know about the interaction
ball.d2y = -gravity
else if love.keyboard.isDown("down")
ball.d2y = gravity
else
ball.d2y = 0
end
end
handle_the_wall_collision()
--ball movement code should be separate from collision handling
--concrete equations can be whatever you want
ball.x = ball.x+ball.dx*dt
ball.dy = ball.dy + ball.d2y * dt
ball.y = ball.y + ball.dy * dt
end
我正在尝试使用具有一些额外功能的 Love2D 框架在 Lua 上编写 Pong 游戏。其中,我希望出现曲线。为此,我正在尝试实现水平发射射弹的轨迹。我有一个球 table,其位置属性为 x (ball.x),另一个球为 y (ball.y)。我也有一个 x 速度属性 (ball.dx) 和一个 y 速度属性 (ball.dy)。最后,我有一个加速度变量(重力)
在我的游戏中,如果球拍移动并击中球,球应该跟随水平曲线。为了创建我的曲线,我想更改每一帧的 y 轴速度,以使我的球在屏幕上呈弧形移动。我遇到的主要问题是我不知道如何在每一帧中更改此速度以创建预期的弧线。我最近的尝试是创建一个类似于以下代码的 while 循环。但是,它会创建一个无限循环。有没有人可以赐教一下?
澄清:
-Player.x和player.y是玩家坐标
-Player2.x和Player2.y是对方坐标
-这段代码在另一个检测冲突的 if 语句中。它在 love.update(dt) 函数内。
非常感谢!
if love.keyboard.isDown("up") and distanceBetween(ball.x,ball.y,player.x,player.y)>30 then
ball.dy=0
while CollisionDetector(ball.x,player2.x,ball.y,player2.y, player2.width,player2.height,ball.size)==false or ball.x>0 or ball.y-20>0 or ball.y+20<love.graphics.getHeight() do
ball.dy=ball.dy+gravity*dt
ball.y=ball.y+ball.dy
end
end
我相信您提供的代码段是 love.update
函数的一部分。 (至少应该如此。)该函数应该一次执行游戏的一个步骤并且 return。它不应该在一次调用中处理整个航班。
在您的特定情况下,while
loop 期望球移动,但这在循环和包含函数结束之前不会发生。
一般来说,要模拟正在进行的流程,您必须存储有关此类流程的信息。例如,如果您希望重力依赖于桨的运动方向,那么您必须修改相应的变量并将其存储在调用之间。
在您的代码中,还有多个其他设计缺陷导致它无法按照您的预期进行。部分功能和代码部分自己实现,代码大纲如下:
function collides(ball,player)
return (ball.x,player.x,ball.y,player.y, player.width,player.height,ball.size)
end
function love.update(dt)
handle_paddle_movements()
--handle the ball-paddle interaction
if collides(ball,player1) or collides(ball,player2) then
ball.dx=-ball.dx
if love.keyboard.isDown("up") then
--store the info you need to know about the interaction
ball.d2y = -gravity
else if love.keyboard.isDown("down")
ball.d2y = gravity
else
ball.d2y = 0
end
end
handle_the_wall_collision()
--ball movement code should be separate from collision handling
--concrete equations can be whatever you want
ball.x = ball.x+ball.dx*dt
ball.dy = ball.dy + ball.d2y * dt
ball.y = ball.y + ball.dy * dt
end