【问题标题】:AS3 landing smoothly under affect of GravityAS3在重力作用下平稳着陆
【发布时间】:2023-03-09 21:13:01
【问题描述】:

我正在尝试制作一款多平台的格斗游戏。我已经成功地制作了游戏的控制、移动、(双)跳跃和重力部分。

问题是,当玩家跳跃时,到达地面后,他们似乎比在平台上应该走的更深一些(他们应该着陆并停留在平台表面)。这在玩家二段跳时更加明显。

我知道为什么会这样;这是因为有时hitTestObject 需要一段时间才能在对象来得太快时做出反应。

所以,我首先想到的就是让玩家的脚y axis等于他落地的平台顶部的y axis

但是,该解决方案导致着陆相当不稳定。

我的问题是:有没有办法让玩家平稳地降落在平台的上表面?

我尝试过的一些事情:

-提高 FPS,它只是产生了相同的效果,但速度更快。

-降低玩家下落的速度,但这会降低游戏的乐趣,所以我把它划掉了。

这是我的相关代码:

stage.addEventListener(Event.ENTER_FRAME, loop);
var jumpConstant:Number = 30;
var gravityConstant:Number = 1.8;
function loop(e:Event):void //happens 
{
    if(player.leg1.foreleg1.foot1.hitTestObject(platforms.ground)||player.leg2.foreleg2.foot2.hitTestObject(platforms.ground)) //if either of the player's legs are colliding with the platform [ps: nested movieclips]
    {
        player.ySpeed = 0; //the player stops going downwards
        player.y = platforms.y; //the player's y becomes the platform's y. don't worry, it puts the player in the right place, just not smoothly.
        if (player.b_up) //if Up control button (W or Up Arrow) is being pressed
        {
            player.ySpeed = -player.jumpConstant; //make the player jump

        }
    else //if the player isn't colliding with the platform
    {
        player.ySpeed += player.gravityConstant; //the player is affected by gravity and is pulled downwards
    }

如果你想试试看生涩效果,请链接到游戏:

http://www.fastswf.com/-64Ux3I

【问题讨论】:

  • hitTestObject 没有根据您的图像速度有任何形式的滞后 - 这完全是您的误解(或错误陈述)。它只是检查两个显示对象是否重叠。
  • 在将 player.y 递增 ySpeed 之前还是之后重置 player.y 的代码?从 swf 看来,脚暂时低于 platform.y,导致它反弹回来。如果实施得当,它永远不会那么低
  • @xxbbcc 显然,我误解了为什么 hitTestObject 这样做。我认为这是hitTestObject 中的一个错误... Aaron 的回答正确解释了为什么hitTestObject 会这样做。显然,玩家只是在一段距离后才与平台发生碰撞;感谢 ySpeed 的增量。嗯,很高兴知道。

标签: actionscript-3 flash animation hittest


【解决方案1】:

问题是您只检查以ySpeed 为增量的冲突。由于 y 速度在跌落期间每步增加 1.8,因此您很快就会看到相距很远的碰撞检查。如果你想要像素精确的碰撞检查,你需要以 1px 的增量检查碰撞。这意味着如果 y 速度为 10,则在一次循环更新期间需要进行 10 次碰撞检查。在循环函数中使用 for 循环来完成此操作。

【讨论】:

  • 非常感谢您的回答,解决了很多问题。但是......没有比 for 循环更好的方法来检查玩家是否与平台发生碰撞吗?我的意思是,检查玩家是否每帧与平台发生 10 次碰撞......这不应该让游戏变慢/不应该对资源不利吗?
  • 在使用命中测试时没有更好的方法。使用几何和数学有更优雅的解决方案(例如,参见 Box2D 和连续碰撞检测),但通常任何准确的解决方案都是昂贵的。每帧 10 次命中测试实际上是一个非常小的成本,您应该只会看到数千个问题。还有许多优化技术……例如,您可以执行非常广泛的碰撞检查,如果广泛发现碰撞,您可以找到精确的碰撞点。当涉及大量对象时,您也可以使用空间分区。
  • 好吧,非常感谢您的所有帮助^-^ 最后一件事,如果不是太多问...您所说的“空间分区”是什么意思?跨度>
  • Spatial partitioning 是一种优化模式,当您有许多可以通过在空间数据结构中组织对象(例如 a gridquad tree)来相互碰撞的对象时。
  • 啊,很有趣也很简单。看起来很酷,但我认为我不会使用太多对象。非常感谢您提供的所有信息:)
【解决方案2】:

为什么不将 hitTestObject 的 y 坐标设置在离地面高一点的位置,这样下沉到地面时实际上会使其接触到地面。

【讨论】:

  • 一开始我也是这么想的,但是实在是太不靠谱了……另外,原来是我误解了hitTestObject为什么会那样做:/
  • 好吧,我很高兴你找到了答案。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-13
  • 2019-01-22
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
相关资源
最近更新 更多