【问题标题】:Addchild - object not appearing on stage from external classAddchild - 对象没有出现在外部类的舞台上
【发布时间】:2017-01-25 14:10:40
【问题描述】:

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

请注意,我还没有 100% 完成所有功能;所以看起来有点奇怪。在我真正让它工作之前,我不想走得更远。

更新:我从一个名为“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);
        }

    }

}

【问题讨论】:

  • 你如何使用这个类?这是您的文档类吗?还是您的文档类实例化了该类?
  • 我有一个名为“main”的单独文档类,我从中创建了一个“Level”对象。我从哪里创建关卡对象有关系吗?例如时间线或文档类?
  • 感谢您的更新,但您能否在您的文档类中显示处理Level 对象的确切和完整代码?请edit您的问题并附上代码。如果您的文档类还不太长,请随意简单地发布整个代码,以免丢失可能导致不良行为的重要部分。
  • 感谢您的帮助。 iv 添加了文档类代码,目前还不算多。

标签: actionscript-3


【解决方案1】:

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

显示直接或间接连接到根节点的所有内容。根节点是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,因为他们都没有时间线。使用 extends Sprite 除非您实际处理的是 MovieClip。

【讨论】:

  • omg 非常感谢,你让我过得愉快!经过数小时的沮丧! :)
猜你喜欢
  • 1970-01-01
  • 2014-06-23
  • 2014-05-12
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
相关资源
最近更新 更多