2010-04-26 2 views
0

Actionscript3을 처음 사용하기 때문에 오류가 계속 발생하는 이유를 알아야합니다. Parameter child must be non-null 그리고 제 코드는 무대 위에 5 개의 enemyBlock 개체를 표시하지 않고 단지 하나만 표시합니다. 도움말 및 도움을 주시면 감사하겠습니다. 미리 감사드립니다.Array의 movieClip이 null을 표시하며 stage.addChild (Array [i])에 표시되지 않습니다.

결과 :

TypeError: Error #2007: Parameter child must be non-null. 
    at flash.display::DisplayObjectContainer/addChild() 
    at flash.display::Stage/addChild() 
    at BlockDrop_fla::MainTimeline/EnemyBlockPos() 
    at BlockDrop_fla::MainTimeline/frame2() 


// declare varibles 
var isEnemyMoving:Boolean = false; 
var enemyArray:Array; 
var enemyBlock:MovieClip = new EnemyBlock(); // assign EnemyBlock class to enemyBlock 
var enemyBlockMC:MovieClip; 

var count:int = 5; 

var mapWidth:Number = 800; 
var mapHeight:Number = 600; 

function EnemyBlockPos() :void { 

    // assign new MovieClip not null 
    enemyBlockMC = new MovieClip; 
    enemyArray = new Array(); 

     for(var i=1; i<= count; i++){ 
      // add class to MC 
      enemyBlockMC.addChild(enemyBlock); 
      // randomize position 
      enemyBlock.x = Math.round(Math.random()*mapWidth); 
      enemyBlock.y = Math.round(Math.random()*mapHeight); 
      // set motion 
      enemyBlock.movement = 5; 

      // add MC to array 
      enemyArray.push(enemyBlockMC); 
     } 


     for (var w = 1; w <= enemyArray.length; w++) { 
       addChild(enemyArray[w]); 
      } 

} // endOf EnemyBlockPos 

답변

0

우 임마 내가 그것을 가지고 생각합니다.

당신의 접근 방식은 좋지만 오류가 발생한 곳을 알 것 같습니다. 내가 볼 수있는 한, 적군에게 루프 할 때마다 적 블록을 추가합니다 .BlockMC - 그런 다음 적군 BlockMC를 어레이에 5 번 추가합니다.

따라서 enemyArray의 enemyBlockMC에 5 개의 동일한 추천 정보가 표시됩니다. - 두 번째 for 루프에서 각 반복마다 적 BlockMC를 갖게됩니다.

당신이 이런 식으로 뭔가 할 필요가 무대에 5 가지 enemyBlock 년대를 의도하는 경우 :

for(var i:int =0; i<= count - 1; i++){ 
      // add class to MC 
/* 
Move this line of code into the for loop, creating a new version every time. 
*/ 
enemyBlockMC = new MovieClip; 
/* 
Also move this into your loop, ensuring you make a new EnemyBlock() every time 
*/ 
var enemyBlock:MovieClip = new EnemyBlock(); // assign EnemyBlock class to enemyBlock 
enemyBlockMC.addChild(enemyBlock); 
// randomize position 
enemyBlock.x = Math.round(Math.random()*mapWidth); 
enemyBlock.y = Math.round(Math.random()*mapHeight); 
// set motion 
enemyBlock.movement = 5; 

// add MC to array 
enemyArray.push(enemyBlockMC); 
} 

그런 식으로, 당신은 당신의 enemyArray에 enemyBlockMC를 밀어 때마다, enemyBlock의 새 버전이 내부 포장입니다 영화 클립.

이렇게 말하면 n 개의 enemyBlock이 모두 새 버전입니다. 따라서 두 번째 for 루프에서 addChild(enemyArray[w]);을 실행하면 매번 새로운 버전이 생성됩니다.

본질적 (명확히) enemyArray[0]

enemyArray[2]이 말이 희망 완전히 다른 목적으로한다. - 내가 다시 설명 할 필요가 있다면, 물어봐.

그게 너의 의도 였니? 코드 서식에 대해 죄송합니다. o_O

+0

예 무대의 모든 것이 이제 작동합니다. xD 감사합니다. 너를 더 upvote 수 있길 바래! – dinogy

+0

경외감이 없습니다. 내가 도울 수있어서 기쁩니다. – Glycerine

0

나는 당신의 배열을 통지 코드를 테스트하지 않고, 당신은 하나에서 시작 - 액션 스크립트 배열의 결과로, 0에서 index'd하는 모습이되기 위해서는

for(var i:int = 0; i<= count - 1; i++){ 
     // add class to MC 
... 

for (var w:int = 0; w <= enemyArray.length -1; w++) { 
... 

또한 (단지 성실하기) :

대신

enemyArray = new Array(); 

의 6,

enemyArray = [] 

는 당신에게 더 나은 메모리 관리 오버 헤드를 제공합니다. 배열이 수정에게 그것을 계산하는 경우

는 참조 -

+0

예, 매개 변수 오류가 발생하지 않습니다. 그러나 나는 무대에서 내 배열을 보여주는 데 어려움을 겪고있다. 내 접근 방식이 잘못 됐어? 일단 배열에 무비 클립을 배치해야합니다. 나는 그들을 한 번에 하나씩 나타나게 할 수 없다. – dinogy

관련 문제