所以,简而言之,我的问题是这个。我正在使用一个变量,它是从外部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)
}
}
}
}
答案 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++;
}
}
任何问题都让我知道,希望这会有所帮助。