ActionScript 3 - стены не сталкиваются должным образом - PullRequest
0 голосов
/ 19 февраля 2011

В течение нескольких недель я пытался сделать свою игру сверху вниз. Некоторое время все шло хорошо, но потом мне захотелось создать карту прокрутки со стенами повсюду. Теперь, чтобы упростить создание карты (и добавить позже), я создал класс под названием «Стена», который я проверю. Это работает, когда она попадает, карта должна перестать прокручиваться Это так хорошо до сих пор.

Теперь, когда игрок отходит от объекта, я хочу, чтобы карта снова могла прокручиваться, это тоже работает, но теперь игрок не может двигаться в ту сторону, откуда пришел игрок. Я знаю, что это потому, что мне нужно определить стороны, куда входит игрок, чтобы сообщить игре, какое движение должно быть установлено на ноль в этой точке.

Вы можете увидеть код здесь:

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:
        }
    }

Могут быть некоторые синтаксические ошибки (так как я удалил некоторый код в этом редакторе). Вы можете увидеть текущую версию здесь .

В этой версии свиток продолжается. Я придумал «исправление» для этого, проверив, находится ли проигрыватель на расстоянии 1 пикселя от мувиклипа, в тесте на попадание (что по какой-то причине работает, что, по-моему, не должно, так как больше не срабатывает) ), а затем установив для левши значение false. Однако это не очень хорошее решение, и если вы продолжите подниматься или опускаться из мувиклипа, вы все равно не сможете двигаться дальше ...

Меня это очень долго сбивало с толку, поэтому я подумал, что пришло время обратиться за помощью. Я не смог найти ничего о том, как управлять движением в нисходящей игре, с картой прокрутки + стена: /

1 Ответ

0 голосов
/ 19 февраля 2011

Самое простое (но не самое дружественное к ресурсам) решение (если у вас в любом случае есть одно хранилище для стен) - это перебирать стены и вместо использования Flash по умолчанию hitTest (мне не нравится, как оно работает, так как ActionScript 2) - просто проверьте координаты и, если вы видите, что на следующем шаге симуляции произойдет столкновение, - обработайте его в соответствии с игровой логикой.

Наиболее полезная оптимизация для этого алгоритма - создание структуры фильтра / данных для получения только стен, которые находятся рядом с игроком и поэтому могут быть затронуты тестом на столкновения.

...