【问题标题】:Character falling through Floor on Platform AS3角色从 AS3 平台的地板上掉下来
【发布时间】:2018-08-19 23:37:58
【问题描述】:

嘿,大家好久没解决这个问题了我使用 Flash Animate 和 Flash Develop 作为我的 IDE。

我将我的角色player 和平台platforms 动态地添加到舞台上。一切似乎工作正常,除了当我继续跳跃时,角色一次从地板上掉下几个像素,当我再次跳跃时,它会自行纠正,但只是一遍又一遍地重复这种情况。更多信息 角色是静止的,平台正在向他移动。玩家所要做的就是点击跳跃。

这是我添加到舞台的重力和其他对象的变量:

//Movie clips
    private var player:mcPlayer;
    private var platforms:mcPlatforms;

    //Jumping Variables
    private var nGravity:Number = -1.8;// Gravity
    private var nJumpPow:Number = 0; //Y velocity

    //Booleans
    private var bJumping:Boolean = false;
    //Arrays
    private var aPlatformArray:Array;





//Add Character
        player = new mcPlayer();
        player.x = (stage.stageWidth / 2) - 80;
        player.y = (stage.stageHeight / 2) + 78;
        addChild(player);

private function addPlatForms():void
    {
        //Add Obstacle Platforms
        platforms = new mcPlatforms();
        platforms.x = (stage.stageWidth / 2) - 80;
        platforms.y = (stage.stageHeight / 2) + 165;
        addChild(platforms);
        aPlatformArray.push(platforms);
        trace(aPlatformArray.length + " NPLATFORMS");
    }

这是我的跳转处理程序,它们在我的 ENTER FRAME 侦听器中:

private function jumpHandler():void 
    {
        //When User taps screen player jumps
        if (bJumping)  //Jump Up
        {
            player.y += nJumpPow;
            nJumpPow -= nGravity;
        }

    }

最后是我如何处理碰撞:

private function playerPlatformHandler():void 
    {
        for (var i:int = 0; i < aPlatformArray.length; i++)
        {
            var currentPlatform:mcPlatforms = aPlatformArray[i];


            //If user is not touching platform have character fall down
            if (!currentPlatform.hitTestPoint(player.x, player.y, true) && !bJumping)
            {
                trace("PLAYER NOT TOUCHING PLATFORM");
                nJumpPow = -15;
                player.y -= nJumpPow;
                nJumpPow -= nGravity;
            }


// Have character stand on top of platform when lands
            if (currentPlatform.hitTestPoint(player.x, player.y, true) && bJumping)
            {
                bJumping = false; //Jumping is false
            } 


        }

        trace("JUMPPOWER " + nJumpPow);
        trace("GRAVITY " + nGravity);
    }

所以当我跟踪变量时,我看到nJumpPow 每次跳转都会增加和减少,我认为这可能是罪魁祸首,但尝试使用 if 语句来解决这个问题并将其值设置回 0 什么也没做人物的脚仍然从平台上掉下来。

请提供有关如何解决此问题的任何帮助或建议,我们将不胜感激!先感谢您。

【问题讨论】:

  • 当玩家落地时,你必须检查玩家是否在地板以下,当它太低时将它向上移动一点。由于它现在每帧移动 15 个像素,因此它可能会移动 15 个像素太低。此外,现在你的重力没有影响,因为你在移动玩家之前总是将nJumpPow 重置为 -15。理想情况下,您会为平台游戏使用不同类型的碰撞检测,请查看谷歌的一些教程。

标签: android actionscript-3 flash


【解决方案1】:

我有一些提示给你。我希望其中之一可以解决您的主要问题。

1- 当您确定播放器没有击中任何地板时,您必须摔倒。但是在您的代码中,我可以看到您正在控制所有楼层,并且当您发现玩家没有击中任何楼层时,您正在更改玩家 y。 在很多情况下,玩家可以站在地板上,但还有很多地板玩家无法触及。

你必须像下面这样更正你的函数:

 private function playerPlatformHandler():void 
{
    var isPlayerOnAFloor:Boolean = false ;
    for (var i:int = 0; i < aPlatformArray.length; i++)
    {
        var currentPlatform:mcPlatforms = aPlatformArray[i];

        // Have character stand on top of platform when lands
        if (currentPlatform.hitTestPoint(player.x, player.y, true) && bJumping)
        {
            isPlayerOnAFloor = true ;
        } 
    }

    if(!isPlayerOnAFloor)
    {
        //Fall him down now!
    }
}

2- 为了获得更好的性能,Allays 将标志变量带到了 if(flag & 计算) 条件位置的复杂计算的左侧。如果标志为假,代码将不会继续计算。 hitTest 不是一个简单的计算,特别是当你有大地板时!

如果您的问题已通过第一种解决方案解决,请告诉我。

【讨论】:

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