侧面滚动条中的可变高度跳跃


10

如果按住跳动键的时间更长,如何让播放器跳得更高?我目前只是在减小重力,只要按住键并且玩家在跳跃,但这看起来很奇怪。


也许只是通过对降低重力的方式进行一些修改,即可获得更好的跳跃动作。
Ali1S232 2011年

@Gajet相当笨拙,似乎是一种奇怪的方式。
共产党鸭子

嗯,您说的是减少重力并不意味着您正在使用物理引擎。是这样吗 您是否正在使用冲动跳跃?
乔纳森·康奈尔

没有物理引擎,而我没有使用脉冲
约翰Stimac

在这种情况下,玩家如何摔倒?您只是根据运动*跳跃*重力矢量来转换他的位置吗?
乔纳森·康奈尔

Answers:


9

首先,您需要确定所需的跳转外观。

在现实生活中,跳跃高度是在您离开地面时决定的。当你已经处于空中时,你不能继续跳得更高。

因此,如果您可以在空中时控制自己的跳跃高度,那么您将获得某种类似于“喷气背包”的效果。

我似乎记得有一款具有两种不同跳跃高度的侧滑车,我认为这是超级马里奥游戏之一。按住跳转按钮时会出现较高的跳跃,然后实际上是一个两部分的跳跃,从最初的常规跳跃开始,然后是第二次冲动,使您更高。

那么,您希望您的跳跃看起来像什么?您想让玩家对跳跃有什么样的控制?

我将从这里开始:

别管重力(即永远不要改变它)。当玩家按下跳转按钮时,只要玩家按下跳转按钮(不超过某个时间限制),就施加跳跃力。然后,当玩家释放跳跃按钮时,他无法再次施加任何跳跃力(即,他不能再次发起跳跃),直到他首先接触地面,然后才重新启用跳跃。


我尝试了一下,然后得到了喷气背包效果。我想知道是否有任何方法可以避免这种情况。
John Stimac

1
也许不是您想起的游戏,但是在《超级马里奥2》中,您在跳跃之前先回避一点来跳高。(这在一定程度上具有直觉意义,因为如果您尝试直接从站立位置跳下并不会跳远。)
Darien

3
Jcubed:尝试将力直接添加到位置,而不是向速度添加力。然后,播放器将线性上升,而不是加速。
Olhovsky 2011年

@Jcubed:在玩类似的游戏时super meat boy,我认为它具有与您想要的跳跃效果相同的效果,好像您只要按住跳跃按钮,就可以向角色施加力,它与重力相反并且比重力小,并且休息就像阿尔霍夫斯基所说的。如果我要实现这样的功能,我将以重力的60%-80%作为跳跃力。
Ali1S232 2011年

1
我一直在这样做,只要保持按下按钮的时间足够短就可以设置向上跳跃的速度,这样就不会出现明显的喷气背包效果-然后就很容易像超级马里奥一样,有一些魔术数字调整。不要减小“力量”,只要将速度重置为最大跳​​跃速度,直到jumpHigherTime到期或玩家释放按钮即可。此外,我感觉超级肉类男孩跳跃的不精确和烦人,就像任何平台跳跃一样那只依靠物理引擎; p
Oskar Duveborn

7

我见过有人这样做:

  1. 创建一个变量(我称之为jumpTime)(数字/双精度/浮点数)。当按下跳转键时,将其设置jumpTime为某个数字(即0.5,这将是按住跳转键将影响的秒数)。

  2. 然后,对于每一个步骤中,设置速度jumpTime乘以某个其他数目,并降低jumpTimedelta(各步骤之间的时间差)。

  3. 重复该操作,直到jumpTime达到零或更低,或者播放器释放跳跃键。在此之后,请使用常规物理方法(施加恒定的负加速度,直到玩家到达地面为止)。

除非您知道如何做,否则您可能需要使用反复试验(或“逻辑猜测”)来为那些“一些数字”找到合适的值。


更新:我发现了使跳跃更加逼真的技巧(因为它原本是缓慢上升但随后迅速下降)。Infinite Mario还使用以下行(JavaScript版本的Character.js的293)... this.Ya *= 0.85;这就像“空气阻力”,并且在空中时限制/降低角色的速度。因此,在每一帧中,将y速度(垂直速度)乘以小于一的数字,以使它在回落时会减慢速度(因此在跳跃过程中向上向下的运动都将是相似且更实际的)。我知道,我不好解释...

当角色使用我上面最初描述的方法进行跳跃时,角色“上升”的速度更快,然后又“回落”。但是,阻力会降低垂直速度。由于我们将垂直速度设置为与jumpTime每一帧成比例,因此此阻力对跳跃的前半部分影响不大。但是,在下半部分(向下倾斜)中,并不是每帧都设置垂直速度,而只是将其与另一个数字相加(在这种情况下,这是重力常数)。因此,阻力在下降时生效,并且由于它降低了速度(在任何方向上),因此减慢了下降速度,使其类似于上半部分。

但是,还有其他方法可以解决此问题,例如在重力下降时减小重力对角色的影响。但是,我们需要找到应减少多少重力的方法。


案例研究:无限马里奥

这是我发现的(来自Markus Persson(Notch)的Mario.java的206行):

    if (keys[KEY_JUMP] || (jumpTime < 0 && !onGround && !sliding))
    {
        if (jumpTime < 0)
        {
            xa = xJumpSpeed;
            ya = -jumpTime * yJumpSpeed;
            jumpTime++;
        }
        else if (onGround && mayJump)
        {
            world.sound.play(Art.samples[Art.SAMPLE_MARIO_JUMP], this, 1, 1, 1);
            xJumpSpeed = 0;
            yJumpSpeed = -1.9f;
            jumpTime = 7;
            ya = jumpTime * yJumpSpeed;
            onGround = false;
            sliding = false;
        }
        else if (sliding && mayJump)
        {
            world.sound.play(Art.samples[Art.SAMPLE_MARIO_JUMP], this, 1, 1, 1);
            xJumpSpeed = -facing * 6.0f;
            yJumpSpeed = -2.0f;
            jumpTime = -6;
            xa = xJumpSpeed;
            ya = -jumpTime * yJumpSpeed;
            onGround = false;
            sliding = false;

            facing = -facing;
        }
        else if (jumpTime > 0)
        {
            xa += xJumpSpeed;
            ya = jumpTime * yJumpSpeed;
            jumpTime--;
        }
    }
    else
    {
        jumpTime = 0;
    }

javascript版本基本上是相同的https://github.com/robertkleffner/mariohtml5/blob/master/code/character.js

这类似于Olhovsky的建议,但是在这种情况下,力将与玩家按下跳转键后经过的时间成正比。

我的JavaScript版本:

    if ( onGround && jump && !jumped ) {
        jumpTime = maxJumpTime;
        onGround = false;
        jumped = true;
        this.vel.y = jumpTime * jumpConstant;
        A = true;
    } else if ( !onGround && jump && jumpTime > 0 && !released ) {
        jumpTime -= evt.delta;
        this.vel.y = jumpTime * jumpConstant;
        B = true;
    } else if ( !onGround && ( !jump || jumpTime <= 0 ) ) {
        this.vel.y -= gravityConstant * evt.delta;
        jumpTime = 0
        released = true;
    } if ( this.pos.y < 0 && !A && !B ) {
        onGround = true;
        released = false;
        this.pos.y = 0;
        this.vel.y = 0;
    }
    if ( !jump && onGround ) jumped = false;

但是,常量的某些值(例如“ gravityConstant”和“ jumpConstant”)会产生不切实际的跳跃。但是有时候游戏不一定要现实!(更新请参见上面的更新部分)

这个问题已经有一年多了,但是我希望这会有所帮助!


2

正如Olhovsky所说,跳跃高度是在您离开地面的那一刻决定的,而不是在那之后。

如果您真的想避免喷气背包效应,我只会看到两种方式:组合键可以跳得更高,或者从根本上改变跳转键的工作方式:

与其让玩家一按键就跳起来,不如将释放延迟到键被释放为止。因此,基本上,按键的持续时间控制着玩家腿部弹簧的弹力大小,然后释放。

当然,这从根本上改变了游戏机制,并且可能令玩家不熟悉。但是这种效果可能会很有趣,可能值得不熟悉。


2
我想我记得曾经和那个机械师一起玩过一些平台游戏-在您“掌握”跳跃之前,不要离开地面。通过一些漂亮的动画(例如角色脚上生长的尘埃云),可以做到直观。
加里·康帕

2

我在David Gouveia对“ 如何使角色跳跃? ” 这一问题的答案中找到了另一种解决方案。

摘要:

他的想法是在玩家按下跳跃按钮时设定速度。在每帧中,它仅计算重力。但是,当播放器释放按钮时,如果速度大于该速度,则会将速度设置为较小的值。速度仅在每帧重力的作用下递减。

我不应该偷他的答案,所以继续阅读他的帖子。他的解决方案在“ 可变高度跳跃 ”部分下。

所以人们真的想出了许多解决这个问题的方法...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.