Пользовательский ActionScript 3 СОБЫТИЕ "Супер" функция не работает - PullRequest
1 голос
/ 12 февраля 2010

Это супер простое событие. Почему это не работает, я схожу с ума.

Это в моем классе AsciiArt:

dispatchEvent(new ArtEvent());

Это запускает этот очень простой класс событий:

package 
{
    import flash.events.*;

    public class ArtEvent extends Event
    {
        public static const DONE_NOW = "done";

        public function ArtEvent()
        {
            super(DONE_NOW);
            trace("constructed");
        }
    }
}

Я знаю, что это срабатывает, потому что в моем .fla, где я создаю экземпляр объекта AsciiArt после завершения он будет отслеживать «построенный» с этим кодом:

var art:AsciiArt = new AsciiArt(bitMapData);
addChild(art)

к которому я, конечно, присоединяю слушателя событий (который, похоже, ничего не делает.

art.addEventListener(ArtEvent.DONE_NOW, function():void{ trace("hi"); });

Итак, в итоге, «построенный» будет отслеживать. Но "привет" не будет.

Есть идеи? Спасибо -J

edit - (перехват правильного типа события и совпадение с числом аргументов)

art.addEventListener(ArtEvent.DONE_NOW, function(event:ArtEvent) {
    trace("hi"); 
});

Также не работает: (

Ответы [ 3 ]

2 голосов
/ 12 февраля 2010

Если класс, размещенный в вашем блоке в коде, является фактическим контекстом, тогда есть 2 проблемы:

  1. вы никогда не отправляете событие, поэтому обработчик никогда не может быть вызван
  2. ActionScript является однопоточным. Если вы делаете большой цикл, то ваша программа просто остановится, пока цикл не будет завершен. если вы хотите, чтобы операция «выполнялась в фоновом режиме», вам нужно разделить ее на порции и распределить выполнение по нескольким кадрам, а затем отправить событие после выполнения последнего порции.

Greetz

back2dos

0 голосов
/ 13 февраля 2010

Основной класс пакет { импорт flash.display.Sprite;

public class Test extends Sprite
{
    public function Test()
    {
        var art:AsciiArt = new AsciiArt();
        art.addEventListener(ArtEvent.DONE_NOW, onArtDone, false, 0, true);
        addChild(art);
    }

    public function onArtDone(event:ArtEvent):void{

        trace(event);
    }
}

}

`

AsciiArt `package { import flash.display.MovieClip; импорт flash.events.Event;

public class AsciiArt extends MovieClip
{
    public function AsciiArt()
    {
        super();
        addEventListener(Event.ADDED_TO_STAGE, createEvent, false, 0, true);
    }

    private function createEvent(event:Event):void{
        dispatchEvent(new ArtEvent(ArtEvent.DONE_NOW))

    }
}

} `

Event `package { импорт flash.events.Event;

public class ArtEvent extends Event
{
    public static const DONE_NOW:String = "done";
    public function ArtEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
    {
        super(type, bubbles, cancelable);
    }

}

}

`

0 голосов
/ 12 февраля 2010

Как указал back2dos (и намекает bhups), Flash является «однопоточным», поэтому для моего ArtEvent не было периода создания экземпляров. Чтобы решить эту проблему (без добавления уродливых кадров в мой скрипт) .. в конце цикла я добавил:

if(yPos<imgData.height){ // if yPos is less than the height of the image, start over again
            xPos = 0;
            yPos +=detail;
            makeArt();
        }else{ 
            addEventListener(Event.ENTER_FRAME, fireEvent);
        }
     }
      public function fireEvent(e:Event):void
      {
         removeEventListener(Event.ENTER_FRAME, fireEvent);
         dispatchEvent(new ArtEvent()); 
      }
...