Для каждого цикла и обнаружения столкновений в Actionscript 3 - PullRequest
1 голос
/ 12 июня 2011

Я занимаюсь созданием 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-го объекта Tree, который находится в treesArray.Под этим я подразумеваю, что игрок будет остановлен, только если он движется в 1-е дерево, а не в любое другое дерево в массиве.Как мне сделать так, чтобы это работало для всех деревьев?

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

1 Ответ

2 голосов
/ 12 июня 2011

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

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

  1. resetSpeeds ()
  2. player.setRightSpeed ​​(0)
  3. resetSpeeds ()
  4. resetSpeeds ()

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

/** 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): пожалуйста, пинайте его в гайки.Это совершенно нечитабельно.

...