2013-05-08 3 views
0

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

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); 

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

У меня есть функция таймера, которая говорит врагу двигаться каждые 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"); 

        } 
      } 

enemyMover - переменная, которую я сделал равной элементам плитки.

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

      } 

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

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

ответ

1

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

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

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

+0

Спасибо за ваш ответ. Имеет смысл заменить вражеский массив массивом, так как он больше 1 плитки. Что касается переменной массива psuedo tileset, я бы получил ее равной массиву переменных floor1? – Bindlestick

+0

'floor1' - это всего лишь набор индексов, в то время как вам нужен соответствующий объект' Tile' для ссылки. Но, используя 'floor1' вместе с набором тайлов, вы сможете отфильтровать невостребованные плитки. – Vesper

+0

Как бы у меня был плиточный набор, равный объекту Tile? Я попытался назначить это раньше, и он говорит, что массивы не могут равняться MovieClips – Bindlestick