lua - 如何改变 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
解决方案
我相信您提供的代码段是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
推荐阅读
- javascript - 如何使脚本在 HTML 中多次运行
- parse-platform - 如何在 Android SDK - Parse Server 中更新 ParseSession?
- javascript - VanillaTilt.js 和 querySelectorAll 销毁 div 中的倾斜
- shell - 提取日志文件的信息部分并插入Oracle
- go - 如何使用 go 1.13 安装从 golang 中删除的静态内容
- python - os.system 在执行 pygame 代码时打开新窗口
- python - 在字典和列表上运行循环以检查字典值是否在列表值范围内
- .net - 使用 Superpower 解析列表列表
- corda - 在令牌选择模块中找不到方法
- python - 更新 git repo 所需的最少网络流量是多少?