Python 游戏中模拟重力/跳跃-问题

Python 游戏中模拟重力/跳跃-问题,python,python-3.x,game-engine,Python,Python 3.x,Game Engine,我正在使用游戏引擎用python制作自己的3D游戏。我需要模拟跳跃和/或重力,但我遇到了一个问题:要么计算是即时的,我的角色没有移动,比如说,没有动画,瞬间眨眼,要么(例如,如果我的for循环中有一个更大的数字),它需要花费yyy更多的时间,速度非常慢,它滞后,所有的一切,努力计算跳跃。我有两个极端,但都不起作用,所以我想找到一种方法让我跳起来。我所能做的就是: player.y+= #可以是-=、=、+=,等等。 那么,你有什么办法可以做到这一点吗?我不是在问一个具体的问题,我只是想收集一些

我正在使用游戏引擎用python制作自己的3D游戏。我需要模拟跳跃和/或重力,但我遇到了一个问题:要么计算是即时的,我的角色没有移动,比如说,没有动画,瞬间眨眼,要么(例如,如果我的for循环中有一个更大的数字),它需要花费yyy更多的时间,速度非常慢,它滞后,所有的一切,努力计算跳跃。我有两个极端,但都不起作用,所以我想找到一种方法让我跳起来。我所能做的就是:

player.y+=
#可以是-=、=、+=,等等。
那么,你有什么办法可以做到这一点吗?我不是在问一个具体的问题,我只是想收集一些想法!甚至不需要给出predone的例子,只要抛出你的想法,比如:使用这个,尝试这个公式,这个函数,等等

添加一些细节:我已经尝试过的

以下是我尝试过的主要解决方案,非常基本:

velocity=3
def输入(钥匙):
全球速度
如果键==“空格”:
对于范围(7)中的i:
打印(速度)
player.y+=速度
速度-=1
速度=3
这很酷,因为你的身高是3,然后是2,然后是1(能量降低时减速),然后加上-1,-2,-3(重力加速度),然后回到起点。完美的但是,正如上面所说的,我们马上就可以做到。因此,如果我尝试以下方法:

velocity=3
def输入(钥匙):
全球速度
如果键==“空格”:
对于范围(61)内的i:
打印(速度)
player.y+=速度
速度-=0.1
速度=3

再次,立即完成。如果我尝试越来越高的间隔,在某一点上,我只是让它滞后,没有在正确完成的中间,你首先需要知道当前的时间步长是什么,因为如果你的帧与20毫秒之间有2毫秒的间隔,你需要调整你进入球员y位置的每一步的量


那么,在位置之外的某个地方有一个玩家速度变量将是非常棒的。然后,你必须决定一个速度,当跳跃发生时,它会立即增加玩家的速度,并且由于重力的作用,每一步都会增加一点加速度。

稍微偏离主题:你不想命名你的函数
input()
,因为它隐藏了内置的
input()
函数


问题是你改变了速度,然后在一个循环中迭代地减小它!由于python(或大多数编程语言)的工作方式,只有在完成执行
input()
函数后,程序执行才会转到“在屏幕上绘制”步骤。因此,当您按下一个键时,您的程序将执行以下操作:

  • 画一个框架,听按键
  • 按键!调用
    input()
    来处理按键操作(假设
    player.y=0
  • 钥匙是一个空格吗?进入循环
    • velocity=3
      。将播放器向上移动
      3
      。递减速度<代码>播放器.y=3
    • velocity=2
      。将播放器向上移动
      2
      。递减速度<代码>播放器.y=5
    • 。。。依此类推,直到退出循环
    • player.y
      再次为
      0
  • 画另一个框架。玩家和他们在同一个地方,所以看起来什么都没发生
当您将迭代添加到循环中时,这个过程需要更长的时间(因此您会看到延迟),但本质上发生了相同的事情

要解决这个问题,需要在绘制帧的函数中添加重力效果。例如,您可以在按下跳转键时设置一个标志,如果在模拟的每个时间步都调用了函数
step()
,则可以检查是否设置了标志,然后处理这种情况

def user_input(key):
    global jump_velocity, is_player_jumping
    if key == "space":
        is_player_jumping = True
        jump_velocity = 3

def step():
    global jump_velocity, is_player_jumping
    if is_player_jumping:
        player.y += jump_velocity
        jump_velocity -= 0.1

        if player.y == 0: # Player is back on the ground
            is_player_jumping = False 

这样,您只需在绘制下一帧之前稍微更改播放器的位置,就可以实际看到动画。

“我不是在问具体问题”:那么您的问题是。通常,根据模拟的时间步长,通过添加适量的向下速度来模拟重力。你如何做到这一点取决于你使用的引擎——在某些情况下,可能有一个内置的标志让它们自动模拟重力,在某些情况下,你可能需要自己计算并应用重力的效果。如果不知道更多细节,就无法回答你的问题。这就是问题的关键:在我的游戏引擎中,我必须自己计算。然而,我所尝试的并不奏效,所以我在这里收集一些其他方法的想法!然后展示你试过的,也许我们能告诉你出了什么问题。只是编辑好让你可以看到Handy,我得到了这个帧速率!但我已经尝试过这个解决方案,它落在直接计算的事情上…想象一下你的楼层在0层(以后可以替换)。然后按时间步长乘以速度更新y位置。速度也被更新了-g乘以时间步长(例如g=10)。在跳跃的时候,在速度上加一次+30(我在这里放的完全随机数)(y方向)。向y位置添加一个复选框,使其保持在0以上。你可以在没有速度的情况下完成,但是你需要存储跳跃的时间,我想这会非常混乱哦,是的,我明白了!为什么我没早点想到,每次我在y上加上东西后,我都要更新我球员的位置!是的,这很有道理,我很笨(x)非常感谢!对于输入的东西,我不能给它起不同的名字,它来自图书馆,在这一点上没有冲突,但是谢谢你的阻止!