添加多个动画片段,而不是替换旧的动画片段

时间:2009-10-13 17:16:49

标签: actionscript-3

所以,简而言之,我的问题是这个。我正在使用一个变量,它是从外部swf加载的movieclip。我想“生成”动画片段的多个实例,这些实例都对相同的代码作出反应,所以例如,如果我说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 个答案:

答案 0 :(得分:1)

addChild()不会创建新实例。它用于将已创建的实例添加到显示列表中。如果你在同一个实例上多次调用addChild(),那么你只是在读取它自己。

此外,每个实例都是唯一的,您无法通过更改实例中的另一个实例来全局更改实例的x位置。你会做的是亨利建议并将每个新的MovieClip实例添加到一个数组中,然后每当你改变一些东西时,你可以循环遍历数组并将更改应用于每个实例。

你不能去var2:MovieClip = new var1因为var1是一个实例而不是一个类。

答案 1 :(得分:1)

这是接收加载的MovieClip的另一种方法,当我需要许多项目副本时,我会使用它。

在你正在加载的swf中,给目标movieclip一个库中的链接名称,对于这个例子,我将使用“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);

也可以。

答案 2 :(得分:0)

听起来您可能会在代码中访问同一个实例。看到你的代码来解决这个问题会很有帮助。

如果我想加载一个swf文件并多次添加MovieClip,我会将它放在该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类的链接。

答案 3 :(得分:0)

在同一个父级上多次调用addChild(var1)没有任何效果(除非您在中间添加了另一个子节点到同一个父节点,在这种情况下,它将更改子索引并将var1置于顶部)。如果你在不同的父母上调用它,它只会更改var1的父级,不会重复。随机调用addChild(new MovieClassName())而不是添加新副本。使用此处建议的数组稍后访问它们。

答案 4 :(得分:0)

哇,谢谢亨利,只是使用一个阵列完全符合我的需要,并使事情变得更简单。

答案 5 :(得分:0)

当您使用加载器加载时,您只获得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++;
    }

}

任何问题都让我知道,希望这会有所帮助。