【问题标题】:ActionScript 3 - Walls don't collide properlyActionScript 3 - 墙壁没有正确碰撞
【发布时间】:2011-02-19 09:39:30
【问题描述】:

几个星期以来,我一直在尝试制作我的自上而下的游戏。有一段时间进展顺利,但后来我想创建一个到处都是墙壁的滚动地图。现在,为了方便创建地图(稍后添加更多),我创建了一个名为“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。但是,这不是一个好的解决方案,如果您继续向上或向下远离电影剪辑,您仍然无法再正确...

我为此困惑了很长时间,所以我认为是时候寻求帮助了。我找不到任何关于如何在自上而下的游戏中使用滚动地图+墙来控制移动的信息:/

【问题讨论】:

    标签: actionscript-3 collision-detection


    【解决方案1】:

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

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

    【讨论】:

    • 我的第一个方法其实不是hitTest,而是坐标。但是有一个问题,我不能让玩家在没有任何一个的情况下撞墙;导致游戏不断将当前命中变为假,所以墙仍然移动,或者,你现在去的方向你将无法再次去:/
    猜你喜欢
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多