2016-09-17 40 views
1

我在没有出现在舞台上的外部类“Level”中创建的“DiamondEnemy”对象出现问题。我试图每隔一段时间从“EnemyNotReleasedArray”中检索一个随机敌人,并通过“enemyOnScreen”精灵将它们添加到屏幕上。Addchild - 从外部类没有出现在舞台上的对象

请注意我还没有100%完成所有的功能;所以它可能看起来有点奇怪。直到我能够真正实现它的工作,我才不想走得更远。

更新:我从一个名为“main”的单独文档类创建一个新的“level”对象。

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

我有一个单独的文档类叫做“main”,我创建了一个“Level”对象。在哪里创建关卡对象?例如时间表或文档类? – niroice

+0

感谢您的更新,但是您能否在文档类中显示处理“Level”对象的确切和完整的代码?请[编辑]你的问题,并包括代码。如果您的文档类不是太长,请随意发布整个代码,以避免丢失可能导致不良行为的重要部分。 – null

回答

2

显示列表是一个层次图,通常被称为树。

显示直接或间接连接到根节点的所有内容。根节点是Stage对象。虽然可能,但您自己的代码实际上不应该为此对象提供addChild()。 (由于本答案范围之外的原因)

Stage的唯一孩子是您的.swf文件执行时创建的文档类的实例。这个实例也会自动添加到Stage对象中,这就是为什么您永远不必将文档类添加到任何东西,但仍然可见的原因。

Main类的构造函数如下:

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

问题是,当你成功创建Level对象,这是从来没有加入到上述层次结构,通常列被称为“显示列表” 。 level未连接到根节点,这就是为什么它不显示。您仍然可以将子女添加到level,但出于同样的原因它们将不可见,即level不可见。顺便说一句

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

为了解决这个问题,添加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,因为他们中的任何一个都没有时间限制。除非您实际处理影片剪辑,否则请使用extends Sprite

+0

omg非常感谢,你已经度过了我的一天!经过几个小时的挫折! :) – niroice

相关问题