2009-10-13 2 views
2

즉, 간단히 말해서, 제 문제는 이것입니다. 외부 swf에서로드 된 영화 클립 인 변수를 사용하고 있습니다. 같은 코드에 모두 반응하는 영화 클립의 여러 인스턴스를 "생성"하고 싶습니다. 예를 들어 var1.x = 100이라고 말하면 모두 100x입니다. 하지만 내 문제는 addChild (var1)을 여러 번 실행하면 (실제로 addChild (var1)을 반복해서 입력하지 않고 그냥 임의 시간에 추가하도록 설정 한 것입니다.), 새 자식이 이전 버전을 바꿉니다. 여러 동영상 클립을 만드는 대신 내가 var에 VAR1 같은 것을 수행해야 무비 클립 var에 VAR2 : 무비 클립 = 새로운 VAR1을여러 영화 클립을 추가하십시오. 오래된 영화를 바꾸지 마십시오.

아, heres는 코드를 (BTW 나를 위해 일을 나던하는 것은, 나 오류를 준다), 또한, 내가 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

어떤 코드를 게시하여 현재 진행중인 작업을 정확하게 볼 수 있습니까? – Reuben

답변

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 클래스에 대한 연결이 포함됩니다.

1

addChild()는 새 인스턴스를 만들지 않습니다. 이미 생성 된 인스턴스를 표시 목록에 추가하는 데 사용됩니다. 같은 인스턴스에서 addChild()를 여러 번 호출하면 그 자체를 읽는 것입니다.

또한 각 인스턴스는 고유하므로 다른 인스턴스를 변경하여 인스턴스의 x 위치를 전역 적으로 변경할 수 없습니다. Henry가 MovieClip의 새로운 인스턴스를 배열에 추가하고 추가 할 때마다 무언가를 변경할 때마다 배열을 반복하고 각 인스턴스에 변경 내용을 적용 할 수 있습니다.

var1 : 인스턴스가 아닌 클래스이므로 MovieClip = new var1이 될 수 없습니다.

0

동일한 부모에서 012:을 여러 번 호출해도 효과가 없습니다 (다른 자식을 사이에 같은 부모에 추가 한 경우가 아니면 자식 인덱스가 변경되어 var1이 맨 위에 표시됩니다). 다른 부모에서 호출하면 var1의 부모 만 변경되고 복제되지 않습니다. addChild(new MovieClassName()) 번으로 전화를 걸어 새 복사본을 추가하십시오. 나중에 액세스하려면 여기에 제시된대로 배열을 사용하십시오.

0

와우, 덕분에 헨리 덕분에, 배열을 사용하면 정확히 내가 필요한 것을 정확히 할 수 있었고, 작업이 훨씬 쉬워졌습니다.

1

로드 된 무비 클립을받는 방법은 다음과 같습니다. 많은 항목이 필요할 때 사용합니다. 당신이 라이브러리에 링크 이름은,이 예를 들어 내가 "foo는"이 자습서 비록 http://darylteo.com/blog/2007/11/16/abstracting-assets-from-actionscript-in-as30-asset-libraries/

에 따라

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

을 사용하는 무비 클립 대상을 제공로드 된 SWF에서

의견은 그 말을

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

도 작동합니다.

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++; 
    } 

} 

어떤 문제가 발생하면 알려주세요. 도움이 되었기를 바랍니다.

관련 문제