2016-09-17 9 views
1

外部クラス "レベル"で作成された "DiamondEnemy"オブジェクトに問題があります。ステージに表示されません。私は間隔で "EnemyNotReleasedArray"からランダムな敵を取得し、 "enemyOnScreen"スプライトを通してそれらを画面に追加しようとしています。Addchild - 外部クラスのステージにオブジェクトが表示されない

すべての機能が100%完了していないことに注意してください。それは少し変わったように見えるかもしれません。私は実際にそれを働かせるまで、さらに進んでいきたいと思います。

update:私は別のドキュメントクラス "main"から新しい "レベル"オブジェクトを作成します。

package { 

    import DiamondEnemy; 
    import flash.utils.Timer; 
    import flash.events.TimerEvent; 
    import flash.display.Sprite; 
    import flash.display.MovieClip; 

    public class Level extends MovieClip { 

     private const START_DELAY_SECONDS:uint = 1000; 
     private var EnemyNotReleasedArray:Array = new Array(); 
     private var startDelay:Timer; 
     private var enemyOnScreen: Sprite; 

     public function Level(NumberDiamonds:uint) 
     { 
      // load the required enemies into the array 
      loadEnemyArray(NumberDiamonds); 

      //setup up sprite, for enemies that will appear on the screen 
      enemyOnScreen = new Sprite(); 
      addChildAt(enemyOnScreen, numChildren); 

      // create delay timer before enemies can start appearing on screen 
      startDelay = new Timer(START_DELAY_SECONDS,1); 

      // set eventlistener that once delay finishes 
      startDelay.addEventListener(TimerEvent.TIMER_COMPLETE, releaseRandomEnemy); 
      startDelay.start(); 

      //setup up sprite, for enemies that will appear on the screen 
      enemyOnScreen = new Sprite(); 
      addChild(enemyOnScreen); 

     } 

     // creates the requested number of enemies type into EnemyNotReleasedArray so they can be released later 
     private function loadEnemyArray(numDiamonds:uint) 
     { 
      // use requested number diamonds enemies - to create diamond enemy objects 
      for (var i:uint = 0; i < numDiamonds; i++) 
      { 
       var diamond:DiamondEnemy = new DiamondEnemy(); 
       EnemyNotReleasedArray.push(diamond); 
      } 
     } 

     // selects a random enemy from EnemyNotReleasedArray and resizes the array so enemy is no longer in it 
     private function releaseRandomEnemy(evt:TimerEvent) 
     { 
      var arrayLength:uint = EnemyNotReleasedArray.length; 

      // check make sure array is not empty, if empy level is over 
      if (arrayLength > 0) 
      { 
       var randomArrayIndex = Math.ceil(Math.random() * arrayLength) -1; 

       /// adding random enemy to sprite object 
       enemyOnScreen.addChild(EnemyNotReleasedArray[randomArrayIndex]); 
       trace(EnemyNotReleasedArray[randomArrayIndex]); 

       //remove the enemy from array and make element null 
       EnemyNotReleasedArray.removeAt(randomArrayIndex) 

       //tempory array to store non-null values 
       var tempArray:Array = new Array(); 

       // cycle through EnemyNotReleasedArray and store all values that are not null into temp array 
       for each(var enemy in EnemyNotReleasedArray) 
       { 
        if (enemy != null) 
        { 
         tempArray.push(enemy) 
        } 
       } 

       // save temp array value into EnemyNotReleasedArray 
       EnemyNotReleasedArray = tempArray; 
      } 
      else 
      { 
       trace("no more enemies left in array"); 
      } 
     } 
    } 

} 

ドキュメントクラス "メイン":

package { 
    import Level; 
    import DiamondEnemy; 
    import flash.display.MovieClip; 

    public class Main extends MovieClip 
    { 

     public function Main() 
     { 
      var level:Level = new Level(1); 
     } 

    } 

} 
+0

このクラスをどのように使用しますか?これはあなたのドキュメントクラスですか?または、ドキュメントクラスがそのクラスをインスタンス化しますか? – null

+0

私は "レベル"オブジェクトを作成する "メイン"と呼ばれる別のドキュメントクラスを持っています。レベルオブジェクトをどこから作成するかは重要ですか?たとえば、タイムラインまたはドキュメントクラスのいずれか? – niroice

+0

更新していただきありがとうございますが、 'Level'オブジェクトを扱うドキュメントクラスに完全なコードを表示できますか?あなたの質問を編集し、コードを記入してください。ドキュメントクラスがあまりにも長すぎない場合は、コード全体を単に投稿して、望ましくない動作の原因となる重要な部分がないようにしてください。 – null

答えて

2

表示リストは、多くの場合、ツリーと呼ばれ、階層的なグラフです。

ルートノードに直接的または間接的に接続されているものがすべて表示されます。ルートノードはStageオブジェクトです。可能であれば、実際には自分のコードのどれもこのオブジェクトに対してaddChild()でなければなりません。

Stageの唯一の子は、.swfファイルの実行時に作成されるドキュメントクラスのインスタンスです。このインスタンスはStageオブジェクトにも自動的に追加されます。そのため、ドキュメントクラスを何かに追加する必要はありませんが、まだ表示されています。

あなたMainクラスのコンストラクタは次のようになります。

public function Main() 
    { 
     var level:Level = new Level(1); 
    } 

問題は、あなたが成功しLevelオブジェクトを作成しながら、それは通常、「表示リスト」と呼ばれています上記の階層に追加されることはありませんということです。 levelがルートノードに接続されていないため、表示されません。子供はlevelに追加できますが、同じ理由で表示されません。つまり、levelは表示されません。この問題を解決するには

、そのようなあなたのドキュメントクラスにlevelを追加します。ところで

public function Main() 
    { 
     var level:Level = new Level(1); 
     addChild(level); 
    } 

。あなたは二回、このコードを持っている:

 //setup up sprite, for enemies that will appear on the screen 
     enemyOnScreen = new Sprite(); 
     addChildAt(enemyOnScreen, numChildren); 

 //setup up sprite, for enemies that will appear on the screen 
     enemyOnScreen = new Sprite(); 
     addChild(enemyOnScreen); 

をしかし、あなたは一度だけ、それを必要としています。もう一つはあなたが必要なものです。

extends MovieClipにはタイムラインがありません。 MovieClipsを実際に扱っている場合を除き、extends Spriteを使用してください。

+0

omgありがとう、あなたは私の一日を作った!欲求不満の数時間後に! :) – niroice

関連する問題