首页 > 解决方案 > 如何改变 Love2D 中每一帧的速度?

问题描述

我正在尝试使用带有一些额外功能的框架 Love2D 在 Lua 上编写 Pong 游戏。其中,我希望出现曲线。为了做到这一点,我正在尝试实现水平发射的弹丸的轨迹。我有一个带有 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

标签: lualove2d

解决方案


我相信您提供的代码段是love.update功能的一部分。(至少应该如此。)该函数应该一次执行游戏的一个步骤并返回。它不应该在一个呼叫中处理整个航班。

在您的特定情况下,while循环期望球移动,但这在循环和包含函数结束之前不会发生。

通常,要模拟正在进行的流程,您必须存储有关此类流程的信息。例如,如果您希望重力取决于桨的移动方向,那么您必须修改相应的变量并将其存储在调用之间。

在您的代码中,还有多个其他设计缺陷使其不符合您的想法。剩下一些功能和代码部分由自己实现,代码大纲如下所示:

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

推荐阅读