ActionScript 3 - 墙壁不会正常碰撞

时间:2011-02-19 09:39:31

标签: actionscript-3 collision-detection

几个星期以来,我一直在努力打造自上而下的比赛。它已经进行了一段时间,但在某些时候我想创建一个到处都有墙的滚动地图。现在,为了便于创建地图(并在以后添加更多内容),我创建了一个名为“Wall”的类,我将对其进行测试。这有效,当它击中时,地图必须停止滚动。它到目前为止确实很好。

现在,当玩家离开物体时,我希望地图能够再次滚动,这也有效,但现在玩家无法移动到玩家来自的一侧。我知道这是因为我需要定义玩家进入的边,以便告诉游戏当时必须将哪个动作设置为零。

您可以在此处查看代码:

public function AddWalls(player:MovieClip)
{
    WallObjects = new Array();

    for (var i:int = 0; i < this.numChildren; i++)
    {
        var mc = this.getChildAt(i);

        if (mc is Wall)
        {
            var wallobj:Object = new Object();
            wallobj.mc = mc;

            wallobj.leftside = mc.x;
            wallobj.rightside = mc.x + mc.width;

            wallobj.topside = mc.y;
            wallobj.bottomside = mc.y + mc.height;

            wallobj.width = mc.width;
            wallobj.height = mc.height;

            WallObjects.push(wallobj);
        }
    }
}

public function EnableCollisionWithWalls():void
{
    for (var k:int = 0; k < WallObjects.length; k++)
    {
        //if (player.y > WallObjects[k].topside && player.y < WallObjects[k].bottomside && player.x > WallObjects[k].leftside && player.x < WallObjects[k].rightside)
        if (player.hitTestObject(WallObjects[k].mc))
        {
            if (player.x > WallObjects[k].leftside && player.x < WallObjects[k].leftside+15)
            {
                Lefthit = true;
                trace(DebugVar);
                DebugVar++;
                player.x = WallObjects[k].leftside;
                Scroll_x = 0;
            }
            else
                if ( player.x < WallObjects[k].leftside -1 || (player.y > WallObjects[k].leftside ))
                {
                    Lefthit = false;

                }

            if (player.hitTestObject(derp))
            {
                Lefthit = false;
            }
        }
    }
}

public function EnableMovement():void
{
    map.x += Scroll_x;
    map.y += Scroll_y;

    for (var i:int = 0; i < this.numChildren; i++)
    {
        var mc = this.getChildAt(i);
        if (mc is Wall)
        {
            mc.x += Scroll_x;
            mc.y += Scroll_y;
        }
    }
}

public function MovementKeysDown(move:KeyboardEvent):void
{
    var Speed:int = -5;

    switch (move.keyCode)
    {
        case 37: // venstre knap
            Scroll_x = -Speed;
            break;

        case 38: // op
            Scroll_y = -Speed;
            break;

        case 39: // højre knap
            Scroll_x = Speed;
            if (Lefthit)
            {
                Scroll_x = 0;
            }
            break;

        case 40: // ned
            Scroll_y = Speed;
            break;

        default:
    }
}

public function MovementKeysUp(move:KeyboardEvent):void
{
    switch (move.keyCode)
    {
        case 37:
            Scroll_x = 0;
            break;
        case 38:
            Scroll_y = 0;
            break;
        case 39:
            Scroll_x = 0;
            break;
        case 40:
            Scroll_y = 0;
            break;
        default:
        }
    }

可能会出现一些语法错误(因为我在此编辑器中删除了一些代码)。 您可以看到current version here

在这个版本中,滚动继续。我确实为它做了一个“修复”,通过检查玩家是否距离动画片段1个像素,在命中测试中(由于某种原因可以工作,我想它不应该因为它不再命中了)然后将Lefthit设置为false。然而,这不是一个好的解决方案,如果你继续向上或向下离开动画片段,你仍然无法再向右走......

很长一段时间以来,我一直对此感到困惑,所以我认为这是我寻求帮助的时候了。我无法找到关于如何在自上而下的游戏中控制运动的任何内容,使用滚动地图+墙:/

1 个答案:

答案 0 :(得分:0)

最简单(但不是最资源友好)的解决方案(如果你总是有一个墙壁存储)是在墙上迭代而不是使用Flash默认hitTest(我不喜欢它的方式自ActionScript 2开始工作 - 只需检查坐标,如果您发现下一个模拟步骤会发生碰撞 - 根据游戏逻辑处理它。

此算法最有用的优化是创建一个过滤器/数据结构,仅用于获取靠近播放器的墙壁,因此可能会受到碰撞测试的影响。