Требуется gotoAndPlay, но я не знаю имен экземпляров моего объекта из-за метода генерации - PullRequest
0 голосов
/ 01 ноября 2009

Я не могу понять, как называются мои экземпляры объектов из-за того, как я их генерирую и добавляю на сцену ...

var circles:Array = new Array() //Declare array for displaying multiple objects
function spawn(evt:MouseEvent):void { //MouseEvent trigger, working
 for (var i:int = 0; i<5; i++) { //Run five times
  circles[i] = new circle(); //Make a new circle
  stage.addChildAt(circles[i],1); //Layer control, no problem
  circles[i].x = (stageCenterWidth*Math.random()*5)/(Math.random()*10);
  circles[i].y = (stageCenterHeight*Math.random()*5)/(Math.random()*10);
 }
}

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

Я делаю новый круг каждый раз, когда проходит цикл for. Однако после того, как эта функция будет выполнена несколько раз, я вызову другую функцию, целью которой является одновременное воспроизведение кадра 2 кругов.

Вопрос: Как я могу нацелить круги, которые я теперь спамил по всему экрану, чтобы я мог использовать что-то вроде circles.gotoAndPlay(2);?

Ответы [ 4 ]

2 голосов
/ 02 ноября 2009

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

Сделайте DisplayObjectContainer на ваш выбор, будь то MovieClip или Sprite. Лично я бы использовал Sprite для хранения ваших MovieClip с.

Причина, по которой мы перемещаем их в их собственный контейнер, заключается в том, что мы можем перебирать всех дочерних элементов определенного объекта и выполнять действия с каждым дочерним элементом; в вашем случае играйте в кадр 2.

var container:Sprite = new Sprite();

var circles:Array = new Array() //Declare array for displaying multiple objects
function spawn(evt:MouseEvent):void { //MouseEvent trigger, working
    for (var i:int = 0; i<5; i++) { //Run five times
        circles[i] = new circle(); //Make a new circle

        container.addChildAt(circles[i],1); //Layer control, no problem

        circles[i].x = (stageCenterWidth*Math.random()*5)/(Math.random()*10);
        circles[i].y = (stageCenterHeight*Math.random()*5)/(Math.random()*10);
    }
}

теперь, чтобы что-то делать со своими клипами, вы просто ссылаетесь на родительский объект, контейнер;

for (var i:int; i < container.numChildren; i++)
{
    MovieClip(container.getChildAt(i)).gotoAndStop(2); //We cast it to MovieClip to tell it what type of child we are manipulating.
}

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

Из-за мощных и всплывающих списков на экране удобно создавать родительские клипы для размещения общих элементов отображения внутри. Скажем, вы поместили десять предназначенных кнопок навигации в один клип, который называется nav. Вы можете просто прослушать MOUSE_DOWN на nav, а затем в функции обработчика определить, по какому дочернему элементу щелкнули, и принять соответствующие меры. Это потрясающе, так как мы исключили девять других слушателей, которые потенциально никогда бы не были удалены.

Надеюсь, это помогло.

1 голос
/ 05 ноября 2009

Вы используете следующий код:

var circles:Array = new Array() //Declare array for displaying multiple objects
function spawn(evt:MouseEvent):void { //MouseEvent trigger, working
 for (var i:int = 0; i<5; i++) { //Run five times
  circles[i] = new circle(); //Make a new circle
  stage.addChildAt(circles[i],1); //Layer control, no problem
  circles[i].x = (stageCenterWidth*Math.random()*5)/(Math.random()*10);
  circles[i].y = (stageCenterHeight*Math.random()*5)/(Math.random()*10);
 }
}

Но таким образом вы перезаписываете ссылки в массиве кругов каждый раз, когда вызываете функцию spawn. Если вы хотите сохранить ссылки на свой круг, чтобы использовать их позже, вы должны нажать на круг в массиве кругов, например так:

function spawn(evt:MouseEvent):void { //MouseEvent trigger, working
 for (var i:int = 0; i<5; i++) { //Run five times
  var c:circle = new circle(); //Make a new circle
  stage.addChildAt(circle,1); //Layer control, no problem
  c.x = (stageCenterWidth*Math.random()*5)/(Math.random()*10);
  c.y = (stageCenterHeight*Math.random()*5)/(Math.random()*10);
  circles.push(c);
 }
}

А потом вы можете использовать массив кругов так:

function gotoAndStopYourCircles(frameNumber:uint):void {
 for (var c:circle in circles){
  c.gotoAndStop(frameNumber);
 }
}
1 голос
/ 01 ноября 2009

Это будет выглядеть примерно так:

for each(var myCircle:circle in circles) {
    myCircle.gotoAndStop(2);
}

UPDATE: Согласно вашему комментарию, существует много опций (разные массивы и т. Д.), Но, насколько я могу судить из того, что вы сказали, я бы создал новый контейнер для каждой партии кругов ... создайте новый спрайт, добавьте его в сцену и добавьте все круги из этого пакета внутри этого спрайта ... затем вы можете изменить круги по пакету:

var lastSprite:Sprite = getChildAt(numChildren-1); // get the latest sprite added to "this" (I suggest not using stage.addChild)
for(var i:uint = 0; i < lastSprite.numChildren; i++) { //for each child of that sprite
   lastSprite.getChildAt(i).gotoAndStop(2); //goto 2
}
0 голосов
/ 01 ноября 2009

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


function gotoandstopcircles(container:DisplayObjectContainer):void{
  var circ:*;
  for (var i:uint=0; i < container.numChildren; i++){
    circ = container.getChildAt(i);
    if (circ is circle){
      circ.gotoAndStop(2);
    }
    else if(circ is DisplayObjectContainer){
      gotoandstopcircles(circ);
    }
  }
}
Тогда всякий раз, когда вы хотите сделать gotoandstop, просто позвоните:
gotoandstopcircles(root);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...