【问题标题】:how to access dynamic textbox (which is on stage) to external actionscript file (.as)如何将动态文本框(在舞台上)访问到外部动作脚本文件(.as)
【发布时间】:2015-03-19 16:20:29
【问题描述】:

我正在尝试使用 Flash 制作类似于马里奥的游戏。我有一个名为 Enemy.as 的外部文件。在这个文件中,我想获取杀死的敌人数量并将其显示在文本框中(在舞台上)。但我面临 #1009 错误。

这是我的代码:

package
{
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.text.TextField;

    public class Enemy extends MovieClip
    {
    var player:MovieClip;
    public var enemyKilled:int;

    public function Enemy(xLocation:int, yLocation:int)
    {
        // constructor code
        x = xLocation;
        y = yLocation;

        addEventListener(Event.ENTER_FRAME, Enemyloop);
    }

    public function Enemyloop(e:Event):void
    {
        /*//the looping code goes here
        player = MovieClip(root).player;
        if(this.hitTestObject(player))
        {
            this.removeEventListener(Event.ENTER_FRAME,Enemyloop);
            parent.removeChild(this);
        }*/
    }

    public function removeSelf():void
    {
        trace("remove self");
        removeEventListener(Event.ENTER_FRAME, Enemyloop); //stop the loop
        this.parent.removeChild(this); //tell this object's "parent object" to remove this object
        enemyKilled++;
        MovieClip(root).tbxEnemy.text = ("enemyKilled: " + enemyKilled.toString());
    }

}

}

[这是错误信息:

删除自己

TypeError:错误 #1009:无法访问空对象引用的属性或方法。 在敌人/removeSelf() 在 Ass3_fla::MainTimeline/loop() view image

【问题讨论】:

    标签: actionscript-3 flash


    【解决方案1】:

    变量enemiesKilled:uint 应该是静态的。 否则每个Enemy 都在计算一个不同的(他自己的)变量。 如果变量是静态的,则该类将只有一个变量,即从它派生的所有对象。 (更改名称和类型不是必须的,只是我个人会做的)

    你的Enemy 班级做得太多了。 设置一些Textfield.text 属性不应该是您的Enemy 关心的问题。使用您当前的代码,您的 Enemy 类依赖于这个非常指定的 Textfield 存在。如果您更改 Textfield 您的代码会静默中断。 (因为您将 root 转换为动态 MovieClip 类,这会将编译时检查抛出窗口)

    改为使用事件。

    不要在项目的其他地方处理一些Textfield,而是发送一个Event。 这允许您将当 Enemy 死亡时应该发生的功能放置在 Enemy 类之外,这是有道理的,因为 Textfield 甚至不在您的 Enemy 类中。

    dispatchEvent(新事件(Event.CHANGE));

    它允许您在创建敌人的主要时间线上收听此Event

    var enemy:Enemy = new Enemy (); // this only works if you provide default values for your constructor parameters which I highly recommend doing
    enemy.addEventListener(Event.CHANGE, onEnemyDeath, false, 0, true);
    
    function onEnemyDeath (e:Event):void
    {
        tbxEnemy.text = "Number of enemies killed: " + Enemy.enemiesKilled.toString();
    }
    

    你可以在 Enemy 死后做任何事情,而无需再次接触该类,将更多不属于该类的功能塞入其中。

    此外,如果DisplayObject 没有parent,则root 属性为null

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      • 2013-02-15
      • 2011-03-14
      相关资源
      最近更新 更多