【问题标题】:A player-falling system (basically gravity)玩家坠落系统(基本上是重力)
【发布时间】:2011-05-24 13:58:25
【问题描述】:

我正在制作一款类似于 Doodle Jump 的游戏,让您的玩家尽可能高。现在,我让我的播放器工作并移动。但是,问题是,我没有重力,或者任何能让玩家再次跌倒在地上的东西。你们有做这件事的想法吗?我试着让玩家得到一个恒定的力,一直被推下去,但是,它并不平滑,而且它不像真正的下降。我可以帮忙制作这个玩家掉落系统吗?

编辑:

    GRAVITY = 10;
    TERMINAL_VELOCITY = 300;
    vertical_speed = 0;

    public void fall(){ 
    this.vertical_speed = this.vertical_speed + GRAVITY;
    if(this.vertical_speed > TERMINAL_VELOCITY){
        this.vertical_speed = TERMINAL_VELOCITY;
    }
    this.y = this.y - this.vertical_speed;
}

我做了这个,没用,把我的播放器射到空中。

【问题讨论】:

  • 有一个恒定的acceleration,我们正在加速。这不是一个恒定的速度。这就是为什么你的坠落看起来不对。
  • “没用,把我的播放器射到空中。”考虑到你有速度错误的迹象。也许你应该减去 GRAVITY 而不是加?

标签: java gravity


【解决方案1】:

在现实世界中,随着时间的推移,重力会以恒定的速度增加下落速度(每秒 9.8 米每秒)。您可以通过给玩家一个垂直速度(当他们跳跃或从平台上掉下来时)来模拟这一点,然后每次在主游戏循环中从该值中减去一个常数,以便他们随着时间的推移而加速。您需要对此(终端速度)设置最大限制,否则当它们坠落很远时,它们可能会很快达到可笑的速度。伪代码看起来像这样:

const GRAVITY = 10;
const TERMINAL_VELOCITY = 300;

object Player 
{
    int vertical_speed = 0;
    int vertical_position;  

    function fall ()
    {
        this.vertical_speed = this.vertical_speed + GRAVITY;
        if (this.vertical_speed > TERMINAL_VELOCITY)
        {
            this.vertical_speed = TERMINAL_VELOCITY;
        }
        this.vertical_position = this.vertical_position - this.vertical_speed;
    }
}

编辑每秒 9.8 米每秒是正确的!请不要对其进行编辑! 加速度以速度随时间的变化来衡量,以米/秒/秒表示。每秒 9.8 米意味着 1 秒后静止的物体将加速到足以以 9.8 m/s 的速度行进。 2 秒后,它将达到 19.6 m/s 的速度。 3 秒后,它将达到 29.4 m/s 的速度,以此类推。

老实说,我什至不相信我必须解释这一点。

【讨论】:

  • 对,我用 Java 编写了你的​​伪代码,我把它编辑到了 OP 中,现在,我把它放在我的 update() 方法中,它会更新每一帧。现在发生的情况是,当我启动它时,它会突然向上射击,而不是回来。你能看出我做错了什么吗? this.y 是播放器的 y 位置。
  • @Stan。你需要加而不是减。向下是 y 轴上的正方向。即 this.y = this.y + this.vertical_speed;
  • 您是否假设 this 每秒调用一次并且垂直速度以 m/s 为单位,否则您不能仅将重力添加到垂直速度以获得新速度
  • 如果加速度太快,那么您可以 a) 使用较小的重力常数和/或 b) 每次通过循环时不要重新计算下落速度。如果你在每三次迭代中执行一次,那么加速度将减少三倍。如果角色是向上而不是向下下降,则添加速度而不是减去速度。
  • 我不会以这种方式使用终端速度。我会想到一个空气阻力(一些想象的空气),它与平方的平方(即coeffitient * speed ^2)成正比,然后从重力加速度中减去它。这样,随着速度的增加,加速度减小到零点,即物体已达到最终速度。可以预先计算阻力系数以获得任意终端速度。它可能看起来更真实。
【解决方案2】:

你知道重力的公式吗?

velocity = acceleration * time

acceleration是重力加速度。

time 是经过的时间量。

还有,

distance = 1/2 * acceleration * time**2

【讨论】:

  • 我明白了,但是,我不知道如何实际实现这一点,您是否建议制作一个在您以 0 速度时启动的计时器,或者其他什么?
【解决方案3】:

在任何给定时间计算具有重力的实体的高度的公式如下:

       g * t ^ 2
s(t) = --------- + v * t + h
           2    

其中s 是时间函数(timeheight),g 是重力因子(9.8 米),v 是原始向上速度,h 是原始高度。

【讨论】:

    【解决方案4】:

    你需要让人在跌倒时加速,而不是让一个恒定的力作用在人身上。

    他们应该以0 的速度开始下落。然后,你应该在它们下落时增加力量。

    为此,您需要随着时间的推移更新它们的速度:

    类似这样的:

    if (stillFalling) {
        velocity = velocity + (gravity_constant) * time_interval;
    } else {
        velocity = 0;
    }
    

    您将需要不断更新速度。

    【讨论】:

      【解决方案5】:

      您可以在that website 上找到解释和演示。我也建议你阅读一本关于物理学的书,或者至少阅读一些关于重力的 wiki 文章。

      【讨论】:

        【解决方案6】:

        根据我的经验,做这样的事情。

        public void run() {
            if(velY+g>TerminalVel) {
                velY=TerminalVel;
            } else {
                velY+=g; 
            }
            y+=velY;
        }
        

        run() 方法应该在循环中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-23
          • 1970-01-01
          相关资源
          最近更新 更多