Actionscript 3.0为对象激活EventListener

时间:2011-10-24 21:29:27

标签: flash actionscript-3 class object event-listener

在我的Flash程序中,我试图在对象中运行一个函数。该对象使用一个名为“SkullDemon.as”的类。我试图运行的函数叫做“moveSkullDemon();”此函数在“SkullDemon.as”类中编码。

我的主要文件类是“TME2d_Main.as”。在该文件中,我创建了一个Skull Demon类的实例,如下所示:

        public var skullD1b:SkullDemon;
        skullD1b = new SkullDemon();
        skullD1b.x = 2990.75;
        skullD1b.y = 836.95;
        skullDemonContainer.addChild(skullD1b);

存储SkullDemon实例的'skullDemonContainer'被放入另一个名为'envContainer'的容器中,该容器使用以下代码行添加到屏幕中:

        this.addChild(envContainer);

创建SkullDemon实例并将其加载到屏幕上就好了。当我尝试在SkullDemon类中运行任何函数时会出现问题。

如前所述,我尝试为'skullD1b'实例调用'SkullDemon.moveSkullDemon()'函数。现在,'moveSkullDemon()'函数只是将SkullDemon对象移到左边。

我尝试从SkullDemon的构造函数中调用此函数,但这不起作用。实际上,在创建Skull Demon对象时,不会执行在SkullDemon的构造函数中编写的任何代码。我试图在SkullDemon类中创建一个调用'moveSkullDemon()的EventListener,但是什么也没做。

我尝试了以下方法来运行'moveSkullDemon()'函数:

1:从'TME2d_Main'调用'moveSkullDemon()',如下所示:

skullD1b.moveSkullDemon();

但这会引发错误(#1006),说'moveSkullDemon'不是函数。

2:做与#1相同的事情,除了函数调用中没有括号:

skullD1b.moveSkullDemon;

3:在'TME2d_Main'中为'skullD1b'实例创建一个EventListener,调用其'moveSkullDemon'函数:

skullD1b.addEventListener(Event.ADDED, skullD1b.moveSkullDemon);

这会带来另一个错误:“错误#2007:参数侦听器必须为非null。”它还经常发现“null”引用错误:

    "1009: Cannot access a property or method of a null object reference.
    at classes::TME2d_Main/controlPlayer()"

我不知道为什么这个问题引用'controlPlayer()'方法,因为它根本不涉及Skull Demon实例。 'controlPlayer()'通过EventListener调用,代码在'TME2d_Main'中:

player.addEventListener(Event.ENTER_FRAME, controlPlayer);

4:为调用move函数的'SkullDemonContainer'创建一个EventListener:

skullDemonContainer.addEventListener(Event.ADDED, skullD1b.moveSkullDemon);

这会带来与#3相同的错误。

我几天来一直遇到这个问题而且不知道是什么导致了这个问题。这是'moveSkullDemon()'函数中的代码:

        public function moveSkullDemon() {
        trace("skull demon moving!");

        this.x -= 5;

        // If the Player has not hit the 'floor,' increase his falling 
            //speed
        if (! floor.hitTestPoint(this.x, this.y, true)) {
            this.y += this.sdGravity;
            // The Skull Demon is not on the ground when he's not touching it
            sdOnGround = false;
        }

        // Increase the 'sdYVel' variable so that the Skull Demon will fall 
            // progressively faster down the screen. This code technically
            // runs "all the time" but in reality it only affects the Skull Demon
            // when he's off the ground.
        sdYVel += sdGravity;            

        // Increase the Skull Demon's 'y' coordinate by the 'sdYVel' value
        if (! sdOnGround) {
            this.y += sdYVel;
        }
    }

感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:0)

如果我理解正确,你是试图针对你的显示对象发送一个事件,因此调用一个函数?

当您实例化头骨恶魔对象时,为您想要处理的事件类型添加一个事件侦听器。例如,如果您创建了“DemonEvent”类:

// instantiate and add event listener:
skullD1b = new SkullDemon();
skullD1b.addEventListener(DemonEvent.MOVE, moveDemonHandler);

如果要调用“moveDemonHandler”函数,则会针对该对象调度事件:

// do call this event listener, dispatch an event
// against the object
skullD1b.dispatchEvent(new DemonEvent(DemonEvent.MOVE));

您可以将代码放在事件处理程序中,或者从事件处理程序代码中调用您的函数:

    protected function moveDemonHandler(event:DemonEvent):void
    {
        moveSkullDemon();
    }

    protected function moveSkullDemon():void
    {
        // ... your code here.
    }

示例“DemonEvent”如果您需要:

package
{
    import flash.events.Event;

    public class DemonEvent extends Event
    {

        public static const MOVE:String = "MOVE";

        public function DemonEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
        {
            super(type, bubbles, cancelable);
        }

    }
}

<强>更新

根据您的评论,听起来您正在确定放置代码以移动对象的最佳位置。你的头骨恶魔可以移动自己,或者因为你的TME2d_Main类添加了头骨恶魔,最初定位它,并且因为你需要在地板上进行测试,所以将这个逻辑放在TME2d_Main类中会更有意义。

此示例不使用事件;但是,希望能帮助您入门。如果你想要一个使用事件的例子,请告诉我。

这里有两个类作为示例实现:

TME2d_Main.as

package
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class TME2d_Main extends Sprite
    {
        /** skull demon instance */
        public var skullD1b:SkullDemon;

        /** floor */
        public var floor:Sprite;

        /** constructor */
        public function TME2d_Main()
        {
            super();

            // best if implemented on addedToStage
            skullD1b = new SkullDemon();
            skullD1b.x = stage.stageWidth * 0.5;
            skullD1b.y = 1;
            addChild(skullD1b);

            // listen for enter frame
            addEventListener(Event.ENTER_FRAME, enterFrameHandler);
        }

        /** every frame, move skull demon */
        protected function enterFrameHandler(event:Event):void
        {
            // call local function of this class
            moveSkullDemon();
        }

        protected function moveSkullDemon():void
        {
            // since this TME2d_Main class defined and positioned
            // skullD1b, it probably makes sense for this class
            // to continue positioning it, especially if you need to
            // hit test again a floor, which is probably also defined
            // in this class?
            if (skullD1b.hitTestObject(floor))
            {
                // skull is on floor 
                skullD1b.sdOnGround = true;

                // end animation
                removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
            }
            else
            {
                // otherwise, skull is in air and falling
                skullD1b.y *= skullD1b.sdYVel;
            }
        }

        // if you wanted to have skull demon
        // move itself, you would call:
        //
        //     skullD1b.moveSkullDemon()
        //
        // ...but make sure that function exists
        // in SkullDemon class.

    }
}

SkullDemon.as

package
{
    import flash.display.Sprite;

    public class SkullDemon extends Sprite
    {

        /** acceleration factor */
        public var sdYVel:Number = 1.05;

        /** whether skull demon is on ground */
        public var sdOnGround:Boolean = false;

        /** constructor */
        public function SkullDemon()
        {
            super();
        }

        // if you want SkullDemon to move itself,
        // make sure you define a moveSkullDemon function:
        //
        //      public function moveSkullDemon():void
        //      {
        //      }

    }
}

答案 1 :(得分:0)

在您的TME2d_Main.as文件中,您声明您的代码是这样的。

    public var skullD1b:SkullDemon;
    skullD1b = new SkullDemon();
    skullD1b.x = 2990.75;
    skullD1b.y = 836.95;
    skullDemonContainer.addChild(skullD1b);

最后4行需要放在一个函数中。您无法在函数外部的类中实例化或赋值。
那么你可以像这样实例化,但所有其他代码都需要功能化(甚至是一个单词)。

public var skullD1b:SkullDemon = new SkullDemon();

// TME2d_Main is the constructor and should be called automatically
public function TME2d_Main( ):void{
    skullD1b.x = 2990.75;
    skullD1b.y = 836.95;
    skullDemonContainer.addChild(skullD1b);
}

你最好的办法就是这样做。

public var skullD1b:SkullDemon;

// TME2d_Main is the constructor and should be called automatically
public function TME2d_Main( ):void{
    skullD1b = new SkullDemon();
    skullD1b.x = 2990.75;
    skullD1b.y = 836.95;
    skullDemonContainer.addChild(skullD1b);
}

如果这不能解决问题,请发布完整的TME2d_Main.as文件。