Враг двигается случайно

Чтобы ускорить процесс, у меня есть расположение плиток, на которых находятся игрок и враг.

public static var floor1:Array = new Array(7);
        floor1[0] = [0,1,1,1,1,1,0];
        floor1[1] = [1,1,1,1,1,1,1];
        floor1[2] = [1,1,1,0,1,1,1];
        floor1[3] = [1,1,0,0,0,1,1];
        floor1[4] = [1,1,1,0,1,1,1];
        floor1[5] = [1,1,1,1,1,1,1];
        floor1[6] = [0,1,1,1,1,1,0];
        public function Main()
        {

            var tilew:int = 60;
            var tileh:int = 60;

            for (var i:int=0; i<floor1.length; i++)
            {
                for (var u:int=0; u<floor1[i].length; u++)
                {
                    var cell:MovieClip = new Tile();
                    cell.gotoAndStop(floor1[i][u]);
                    cell.x = ((u-i)*tileh);
                    cell.y = ((u+i)*tilew/2);
                    addChild(cell);


                    cell.addEventListener(MouseEvent.ROLL_OVER, mouseover);
                    cell.addEventListener(MouseEvent.ROLL_OUT, mouseout);
                    cell.addEventListener(MouseEvent.CLICK, mouseclick);
                    cell.addEventListener(Event.ENTER_FRAME, beginfloor1);


                }
            }

            var player:Player = new Player();
        addChild(player);
        player.mouseEnabled = false;
        player.x = 5 * (tileh);
        player.y = 5 * (tilew/2);


        var enemy:Enemy = new Enemy();

        addChild(enemy);
        enemy.mouseEnabled = false;
        enemy.x = 9 * (tileh);
        enemy.y = 9 * (tileh/2);

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

У меня есть функция таймера, которая говорит противнику двигаться каждые 5 секунд, если игрок не находится рядом с ним и если он рядом с доступным тайл.

function timerenemy (event:TimerEvent){
                if (enemy.enemyVisionArea.hitTestObject(enemyMover) && !player.visionPoint.hitTestObject(enemyMover.tileMiddle))
                    {
                        enemy.x = (enemyMover.x)+55;
                        enemy.y = (enemyMover.y)+20;
                        trace("moved");

                    }
            }

врагаМовер - переменная, которую я сделал равной объектам плитки.

function beginfloor1(event:Event)
            {
                enemyMover = event.currentTarget as Tile;

            }

Он просто остается там, где он есть. Я просто хочу, чтобы противник двигался сам по себе на любой плитке, на которую попала его вражеская область, тестирование ближайшей плитки. Функция beginfloor1, похоже, не работает. Есть ли способ, которым я могу объявить врага Mover = event.currentTarget как Tile и сделать так, чтобы враг переместился на случайный тайл, который поражает его врага VisionArea?

Если это сбивает с толку, я могу опубликовать полный код.

1 ответ

Решение

Вы назначаете 49 прослушивателей enterframe, которые вызываются последовательно, и они ВСЕ меняют одну переменную на ячейку, к которой они присоединены. Конечно, последний тайл - это то, что всегда назначается.

Я ожидаю, что вы хотите, чтобы враг проверил, есть ли плитка, на которую он может перейти. По сути, вы проверяете одну плитку, которая enemyMover - Как вы определяете, что это за плитка? Вы должны проверить все доступные фишки вокруг врага, составить их список и выбрать из этого списка одну, а не текущую фишку, а затем переместить туда противника.

Итак, во-первых, вам нужен полный набор плиток для адресации откуда-то. Лучший способ будет объявить общеклассный var tileset:Array и заполните его, где вы делаете новые плитки. Брось Event.ENTER_FRAME Слушателя из кода нет, так как он бесполезен. Тогда в вашем timerevent это для врага вы проверяете все tileset если они находятся в зоне видимости вашего врага (вы используете hitTestObjectЯ бы использовал чистое расстояние по сетке или по координатам - это намного быстрее), если это так, вы добавляете их в массив TEMPORARY, который вы создаете в этой функции. Конечно, если ваш враг находится в обработанной в данный момент ячейке, вы игнорируете это - вы должны двигать врага, а не заставлять его стоять на месте. Затем выберите (каким-то образом это зависит от вас), в какую клетку должен двигаться ваш враг, и выполните ход. Да, если вы хотите, чтобы ваш враг двигался случайным образом, выберите ячейку случайным образом по ее индексу через Math.floor(Math.random()*selectedcells.length),

Другие вопросы по тегам