Для каждого цикла и обнаружения коллизий в Actionscript 3

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

Вот мой код, который я использую для обнаружения столкновений:

Функция createLevel

   private function createLevel():void
    {
        for (var i:int; i < numChildren; i++)
        {
            if (getChildAt(i) is Trees)
            {
                var j = getChildAt(i);
                treesArray.push(j);
                trace(treesArray.length);
            }
        }
    }

И функция обнаружения столкновений.

    private function checkCollisions():void
    {
        for each (var trees:Trees in treesArray)
        {
            if (player.hitTestObject(trees))
            {
                switch (true)
                {
                    case (player.x <= trees.x) :
                        player.setRightSpeed(0);
                        break;
                    case (player.x >= trees.x) :
                        player.setLeftSpeed(0);
                        break;
                }

                switch (true)
                {
                    case (player.y <= trees.y) :
                        player.setDownSpeed(0);
                        break;
                    case (player.y >= trees.y) :
                        player.setUpSpeed(0);
                        break;
                }
            }
            else
            {
                player.resetSpeeds();
            }
        }

Я помещаю все объекты Trees, которые я перетащил на сцену Flash, в массив. Затем в игровом цикле у меня так, чтобы он проверял коллизии с помощью функции checkCollision().

У меня это так, что если игрок вообще ударит какое-либо дерево, то он увидит, с какой стороны он ударил его, и не даст игроку двигаться в этом направлении. А если игрок ни во что не врезается, то сбросьте скорость до нормальной, чтобы он мог двигаться в любом направлении.

Но код работает только для первого объекта дерева, который находится в массиве деревьев. Под этим я подразумеваю, что игрок будет остановлен только в том случае, если он движется в 1-е дерево, а не в любое другое дерево в массиве. Как мне сделать так, чтобы он работал для всех деревьев?

Также я думаю, что это может быть связано с тем, где находится моя функция player.resetSpeeds(), но я не совсем уверен.


person gordsmash    schedule 11.06.2011    source источник


Ответы (1)


Немного неясно, что именно делает resetSpeeds(), но я могу сказать из предоставленного вами кода, что он будет выполняться всегда, если только игрок не ударит по всем деревьям в игре одновременно.

Предположим, что в игре есть 4 дерева, и игрок попадает во второе с левой стороны, тогда для объекта игрока будет выполнено следующее в указанном порядке:

  1. сброс скорости ()
  2. player.setRightSpeed(0)
  3. сброс скорости ()
  4. сброс скорости ()

Вам нужно будет сначала найти дерево, в которое попали, и только затем изменить скорость игрока один раз (а не столько раз, сколько деревьев в игре).

/** Find the first Trees that was hit by the player.
  * Note that the loop will quit early once a collision is found. */
private function getHitTrees():Trees {
    for each (var trees:Trees in treesArray) {
        if (player.hitTestObject(trees)) {
            return trees;
        }
    }
    return null;
}

private function checkCollisions():void {
    var hitTrees:Trees = getHitTrees();

    if (hitTrees) { stopThePlayer(hitTrees); }
    else { letThePlayerMoveOn(); }
}

Это также сделает ваш код более читаемым, разбив его на более мелкие фрагменты с именами функций, которые точно сообщают вам, что там происходит; в отличие от одной большой функции с большим количеством вложений.

Кстати: кто бы ни научил тебя этому трюку с switch(true): пожалуйста, пни его по яйцам. Это совершенно нечитаемо.

person RIAstar    schedule 11.06.2011