Добавить несколько видеоклипов, не заменяя старые - PullRequest
2 голосов
/ 13 октября 2009

Итак, вкратце, моя проблема заключается в следующем. Я использую переменную, которая является мувиклипом, загруженным из внешнего SWF. Я хочу «породить» несколько экземпляров мувиклипа, которые все реагируют на один и тот же код, поэтому, например, если я скажу var1.x = 100, все они будут в 100x. Но моя проблема в том, что когда я запускаю addChild (var1) несколько раз (на самом деле я не набираю addChild (var1) снова и снова, я просто настраиваю их добавлять в случайное время), новый дочерний элемент просто заменяет старый вместо того, чтобы делать несколько видеоклипов. Должен ли я сделать что-то вроде var var1: MovieClip var var2: MovieClip = new var1? (что, кстати, у меня не работает, дает ошибки)

О, вот код, а также, я довольно плохо знаком с as3 fyi, до сих пор даже не знаю, как работают массивы, что было моей второй догадкой о проблеме.

var zombieExt:MovieClip;
var ldr2:Loader = new Loader();
ldr2.contentLoaderInfo.addEventListener(Event.COMPLETE, swfLoaded2);
ldr2.load(new URLRequest("ZombieSource.swf"));
function swfLoaded2(event:Event):void 
{
 zombieExt = MovieClip(ldr2.contentLoaderInfo.content);


 ldr2.contentLoaderInfo.removeEventListener(Event.COMPLETE, swfLoaded2);
 //zombieExt.addEventListener(Event.ENTER_FRAME, moveZombie)

 zombieExt.addEventListener(Event.ENTER_FRAME,rotate2);
 function rotate2 (event:Event)
 {
  var the2X:int = playerExt.x - zombieExt.x;
  var the2Y:int = (playerExt.y - zombieExt.y) * 1;
  var angle = Math.atan(the2Y/the2X)/(Math.PI/180);
  if (the2X<0) {
   angle += 180;
  }
  if (the2X>=0 && the2Y<0) {
   angle += 360;
  }
  //angletext.text = angle;
  zombieExt.rotation = (angle*1) + 90;
 }

 playerExt.addEventListener(Event.ENTER_FRAME,spawn1);
    function spawn1 (event:Event)
 {
  if(playerExt.y < 417)
  {
   var someNum:Number = Math.round(Math.random()*20);
    if(someNum == 20)
   {


    addChild(zombieExt)


    zombieExt.x = Math.round(Math.random()*100)
    zombieExt.y = Math.round(Math.random()*100)
   }
  }

 }


}  

Ответы [ 6 ]

1 голос
/ 15 октября 2009

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

в SWF-файле, который вы загружаете, дайте целевому мувиклипу имя ссылки в библиотеке, для этого примера я буду использовать "foo"

 private var loadedSwfClass:Class
 private var newZombie:MovieClip;
 private var zombieArray:Array = new Array();

 function swfLoaded2(event:Event):void 
 {
    loadedSwfClass = event.target.applicationDomain.getDefinition("foo");

    for(var n:int = 0; n<100; n++){
       newZombie = new loadedSwfClass()
       zombieArray.push(newZombie);
       addChild(newZombie);
    }
 }

согласно этому уроку http://darylteo.com/blog/2007/11/16/abstracting-assets-from-actionscript-in-as30-asset-libraries/

хотя в комментариях говорится, что

 var dClip:MovieClip = this;
 var new_mc = new dClip.constructor();
 this.addChild(new_mc);

также будет работать.

1 голос
/ 14 октября 2009

addChild () не создает новые экземпляры. Он используется для добавления уже созданного экземпляра в список отображения. Если вы вызываете addChild () несколько раз на одном и том же экземпляре, вы просто читаете себя.

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

Вы также не можете перейти на var2: MovieClip = new var1, так как var1 является экземпляром, а не классом.

0 голосов
/ 21 октября 2009

Когда вы загружаете с использованием загрузчика, вы получаете только 1 экземпляр, однако вы можете сделать несколько забавных размышлений, чтобы определить, к какому типу класса относится данный loader.content, а затем создать их экземпляр, используя это. Например:

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loader_completeHandler);
loader.load(new URLRequest("ZombieSource.swf"));

var classType:Class;

function loader_completeHandler(evt:Event):void
{
    var loadInfo:LoaderInfo = (evt.target as LoaderInfo);
    var loadedInstance:DisplayObject = loadInfo.content;

    // getQualifiedClassName() is a top-level function, like trace()
    var nameStr:String = getQualifiedClassName(loadedInstance);

    if( loadInfo.applicationDomain.hasDefinition(nameStr) )
    {
        classType = loadInfo.applicationDomain.getDefinition(nameStr) as Class;
        init();
    }
    else
    {
        //could not extract the class
    }
}

function init():void
{
    // to make a new instance of the ZombieMovie object, you create it
    // directly from the classType variable

    var i:int = 0;

    while(i < 10)
    {
        var newZombie:DisplayObject = new classType();
        // your code here 
        newZombie.x = stage.stageWidth * Math.random();
        newZombie.x = stage.stageHeight * Math.random();

        i++;
    }

}

Любые проблемы, дайте мне знать, надеюсь, это поможет.

0 голосов
/ 14 октября 2009

Ух, спасибо, Генри, использование массива сделало именно то, что мне нужно, и упростило задачу.

0 голосов
/ 14 октября 2009

Вызов addChild(var1) несколько раз для одного и того же родителя не имеет никакого эффекта (если только вы не добавили другого потомка к тому же родителю между ними, в этом случае он изменит индекс дочернего элемента и выведет var1 наверх). Если вы вызываете его у разных родителей, он просто изменит родителя var1, а не дублирует его. Позвоните addChild(new MovieClassName()) в случайное время, чтобы добавить новые копии. Используйте массив, как предлагается здесь, чтобы получить к ним доступ позже.

0 голосов
/ 13 октября 2009

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

Если бы я хотел загрузить один SWF-файл и добавить мувиклип несколько раз, я бы поместил его в библиотеку этого SWF-файла. Затем создайте его экземпляр и сохраните в пуле объектов, хэше или каком-либо списке.

// after the library were finished loading
var list:Array = [];
for(var i:int=0; i<10; i++) {
   var myCreation:MySpecialThing = new MySpecialThing();
   addChild(myCreation);
   list.push(myCreation);
}

где моя библиотека будет содержать ссылку на класс MySpecialThing.

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