Flash Actionscript 3.0 Сравнение положения объекта - PullRequest
0 голосов
/ 15 ноября 2011

Как вы, наверное, видели из моих предыдущих постов, я создаю игру с боковой прокруткой во Flash / Actionscript 3.0.

Сейчас я пытаюсь заставить вражеские объекты повернуться лицом к направлению игрока.Вот что я имею в виду (dartD1 является экземпляром объекта вражеского персонажа. Если scaleX равен 1, он направлен вправо; если scaleX равен -1, то он направлен влево):

    if (dartD1.x < player.x) {
        dartD1.scaleX = 1;
    } else if (dartD1.x > player.x) {
        dartD1.scaleX = -1;
    }

Проблема в том, что враги не меняются лицом к игроку во время игры.Их направление устанавливается в зависимости от их положения относительно проигрывателя при запуске программы.

Я знаю, почему возникает эта проблема;У меня есть scrollScreen() функция, которая помещает объект Player в центр экрана.Так как игровой экран 700 * 700, игрок всегда находится на позиции (350, 350) относительно сцены.Вот моя scrollScreen() функция:

        // This function scrolls the MovieClip Containers on the screen
    private function scrollScreen(event:Event):void {

        // Here we offset the elements' 'x' and 'y' coordinates by 
        // the distance between the Player and the centre of the stage
            // Environment Container
            envContainer.x += (stage.stageWidth * 0.5) - player.x;
            // Background Container
                // In all levels but Level 3 (which is in a room, not a landscape) 
                // the background moves more slowly along the 'x' axis to simulate distance
            if (onLevel != 3 && onLevel != 5) {
                bgContainer.x += ((stage.stageWidth * 0.5) - player.x) * 1/20;
            } else if (onLevel == 3) {
                bgContainer.x += ((stage.stageWidth * 0.5) - player.x);
            } else if (onLevel == 5) {
                bgContainer.x += ((stage.stageWidth * 0.5) - player.x);
            }

            //playerDartContainer.x += (stage.stageWidth * 0.5) - player.x;

            // Position the Player at the centre of the game screen ('x' axis)
            player.x = stage.stageWidth * 0.5;

        // Here we offset the elements' 'y' coordinates
            // Environment Container
            envContainer.y += (stage.stageHeight * 0.5) - player.y;
            // Background Container
            bgContainer.y += (stage.stageHeight * 0.5) - player.y;

            //playerDartContainer.y += (stage.stageHeight * 0.5) - player.y;

            // Position the Player at the centre of the game screen ('y' axis)
            player.y = stage.stageHeight * 0.5;
   } // End of 'scrollScreen()' function    

Мой вопрос: как мне заставить сравнение положения работать между dartD1 (врагом) и игроком?Для этого мне, очевидно, нужно получить позицию Игрока относительно dartD1.Я попытался сделать это:

        if (dartD1.x < player.localToGlobal(new Point()).x) {
        dartD1.scaleX = 1;
    } else if (dartD1.x > player.localToGlobal(new Point()).x) {
        dartD1.scaleX = -1;
    }

Это не работает, потому что player.localToGlobal(new Point()).x по-прежнему возвращает 350, как и player.globalToLocal(new Point()).x.

Я искал решения в Интернете, но неполучил что-нибудь полезное.Любая помощь будет оценена!

Спасибо, Кристиан

Ответы [ 2 ]

0 голосов
/ 17 ноября 2011

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

screenX объекта будет его worldX минус scrollX экрана (и то же самое для Y). Таким образом, если камера прокручивается до (50,50), а объект находится в точке (110,120), ее положение на экране будет равно (60,70).

Как только ваша игра делает это, любые сравнения между мировыми позициями должны работать независимо от положения объектов на (или выключенном) экране.

0 голосов
/ 16 ноября 2011

Простите, если я не понимаю, но .... если ваш игрок всегда находится в центре экрана, разве вы не можете просто проверить, что враги по обе стороны от него на сцене?

Таким образом, ваш код ...

if (dartD1.x < player.x) {
    dartD1.scaleX = 1;
} else if (dartD1.x > player.x) {
    dartD1.scaleX = -1;
}

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

Это не самое надежное решение, но оно будет работать.

Редактировать:

Попробуйте это.

var pt:Point = dartD1.localToGlobal(new Point(dartD1.x, dartD1.y));

if (pt.x < player.x) {
    dartD1.scaleX = 1;
} else if (pt.x > player.x) {
    dartD1.scaleX = -1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...