Actionscript 3.0 Активация EventListener для объекта - PullRequest
0 голосов
/ 25 октября 2011

В моей программе 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);

'skullDemonContainer', в котором хранятся экземпляры SkullDemon, помещается в другой контейнер, называемый 'envContainer', который добавляется вэкран с использованием этой строки кода:

        this.addChild(envContainer);

Экземпляр SkullDemon создается и загружается на экран очень хорошо.Проблема возникает, когда я пытаюсь запустить любую функцию в классе SkullDemon.

Как упоминалось ранее, я пытаюсь вызвать функцию SkullDemon.moveSkullDemon () для экземпляра skullD1b.На данный момент функция moveSkullDemon () просто перемещает объект SkullDemon влево.

Я пытался вызвать эту функцию из функции конструктора SkullDemon, но это не работает.Фактически, любой код, написанный в конструкторе SkullDemon, не выполняется при создании объекта Skull Demon.Я пытался создать EventListener в классе SkullDemon, который вызывает «moveSkullDemon ()», но это ничего не делает.

Я пробовал следующие методы, чтобы запустить функцию «moveSkullDemon ()»:

1: Вызов «moveSkullDemon ()» из «TME2d_Main» выглядит следующим образом:

skullD1b.moveSkullDemon();

Но это вызывает ошибку (# 1006), говорящую, что «moveSkullDemon» не является функцией.

2: Делать то же самое, что и # 1, за исключением того, что у меня нет скобок в вызове функции:

skullD1b.moveSkullDemon;

3: Создание EventListener внутри 'TME2d_Main' для экземпляра 'skullD1b', которыйвызывает его функцию 'moveSkullDemon':

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

Это вызывает еще одну ошибку: «Ошибка № 2007: прослушиватель параметра должен быть ненулевым».Он также постоянно находит «нулевую» ошибку ссылки:

    "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: Создание EventListener для 'SkullDemonContainer', который вызывает функцию перемещения:

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 голосов
/ 25 октября 2011

в вашем файле 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.

0 голосов
/ 25 октября 2011

Если я правильно понимаю, вы пытаетесь отправить событие против вашего экранного объекта, поэтому вызываете функцию?

Когда вы создаете экземпляр своего объекта демона черепа, добавьте прослушиватель событий для того типа событий, который вы хотитеобрабатывать.Например, если вы создали класс «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
        //      {
        //      }

    }
}
...