如何在Phaser中启用“就在”玩家接触地面之前跳跃?

Posted

技术标签:

【中文标题】如何在Phaser中启用“就在”玩家接触地面之前跳跃?【英文标题】:How to enable jumping "just before" the player touches the ground in Phaser? 【发布时间】:2014-09-03 07:41:48 【问题描述】:

使用 Phaser(以及遵循教程)提供的 Arcade 物理模块让跳跃变得超级简单。然而,它有一个令我恼火的事实,即由于使用了玩家触地逻辑,玩家只能在他们“在”地面上时才能跳跃。

我使用的代码基于Game Mechanic Explorer, Platformer #4 并遵循;

var canJump = this.player.body.touching.down;

if (canJump && this.upInputIsActive()) 
    this.player.body.velocity.y = this.JUMP_SPEED;

我想让玩家能够在他们真正接近地面但尚未接触时能够跳跃,以便重新跳跃/跳跃- as-landing 更加流畅。因此,观察到限制是由玩家的touching.down 引起的,我的问题是;

    是否可以确定玩家与他们正下方的地面(可以是平台)的距离(“多高”)?那么canJump 只是距离的函数,仅适用于非常小的值。

    可以在玩家周围扩展一个虚拟命中框(它会与玩家一起旅行),这样它自己的touching.down 可以用来检测这种情况吗?这种方法更好吗?玩家精灵本身不应悬浮在地面上或受到其他影响。

这里的目标是让玩家在他们应该能够跳跃之前跳跃 - 所以在短时间内记住向上键,这可能是可行的,是这不是我在这种特殊情况下寻求的解决方案。

【问题讨论】:

您必须创建一个计时器 WantToJump 并将其设置为当用户尝试在空中跳跃时的特定时间或步数,然后在更新期间倒计时。只要 wantToJump 大于 0,玩家应该在检测到触地时立即跳跃。 @LearnCocos2D 如果按住向上按钮,这就是当前的行为(这种方法确实会在很小的误差范围内将其复制为单次按下),但我的目标是实际上允许玩家通过几个像素“欺骗/游戏”系统。在我当前的游戏中,玩家的弹跳速度比链接示例中的稍慢(并且下落速度更慢)。 我不会走那条路,如果你这样做意味着常规跳跃可以达到 100 像素的高度,但如果你进行连续跳跃,第二次跳跃可能会达到 105 像素的高度,可能允许玩家去她不应该去的地方。另外,它可能不会看起来/感觉更好。玩家会期望玩家在接触地面时再次跳跃,而不是略高于地面时。也许您在注册触地和再次跳跃之间有 1 帧延迟,这会在重新跳跃之前导致一小段延迟? @LearnCocos2D 如果玩家可以到达那里,那么他们应该能够到达那里:D 在这一点上,我仍在寻找两个问题的好的解决方案(能够做到这些应该是简单的任务),并不一定要完成一个完美的游戏。我已经设法通过手动移动玩家下方的另一个小精灵并检查与世界对象的重叠来创建一个 hackish #2,但感觉就像一个杂物。感谢您对潜在问题的反馈,我会记住的。 【参考方案1】:

    不是“本机”。没有 CCD 或前瞻,身体只关心它行进的方向。您要实现的目标通常称为使用传感器。 P2 支持传感器,但 Arcade Physics 不支持,因此您必须模拟它 - 通过创建第二个主体(您在第 2 点中提到过)或使用标记。这可能是一个简单的 Point 对象,当它们跳跃时会“掉落”,然后您可以使用该点和身体之间的内置距离检查来满足您的“近乎跳跃”要求。

    可以,但是您的 Sprite 会“漂浮”在空中。所以见第1点:)

【讨论】:

我最终通过创建一个小实体(使用主精灵手动移动,而不是物理移动)并使用重叠测试来“解决”这个任务。

以上是关于如何在Phaser中启用“就在”玩家接触地面之前跳跃?的主要内容,如果未能解决你的问题,请参考以下文章

Sprite Kit 接触检测

Phaser Framework - 检查精灵总旋转

如何在使用 Cordova 的 Phaser 游戏中避免高内存使用?

Phaser - 如何更改组的精灵图像?

unity3d中如何检测车轮是不是接触地面?

[SDOI2011]打地鼠