tipos son necesidades migrantes migracion los las interna externa emigracion cuales consecuencias causas actionscript-3 flash event-handling compiler-warnings

actionscript 3 - son - "Advertencia: 1090: problema de migración" a pesar de registrar explícitamente controladores de eventos



tipos de emigracion (1)

Esto se debe a que el controlador se registró con una instancia diferente y no con la instancia del motor del juego ( this ). Recuerde que los controladores de eventos en AS2 se registraron simplemente al especificarlos como propiedades en las instancias que deberían manejar los eventos respectivos y se dispararán automáticamente cuando sea necesario. La advertencia está allí para informar al desarrollador que no se activa automáticamente en AS3.

Así que el compilador se muestra cauteloso, supone que estoy intentando registrar un manejador de clics con la instancia del motor del juego (aunque ya lo he registrado en el escenario) y me advierte al respecto.

Hay varias maneras de hacer que la advertencia desaparezca:

  1. Simplemente cambie el nombre del controlador onMouseDown . La convención "on" es un remanente de AS2 y el compilador solo emite advertencias para los manejadores siguiendo esta convención de nomenclatura; si se siente cómodo conformándose con una convención diferente, esta es la solución recomendada. La convención utilizada en Adobe es "-Handler" (fuentes 1 2 3 ), por lo que onMouseDown convierte en mouseDownHandler :

    private function init(e:Event):void { removeEventListener(Event.ADDED_TO_STAGE, init); // ... stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); // ... } private function mouseDownHandler(e:MouseEvent):void { if (_isEnginePlaying) { _player.attack(); } }

  2. Si this puede escuchar el evento, registre el evento con this en this lugar:

    private function init(e:Event):void { removeEventListener(Event.ADDED_TO_STAGE, init); // ... addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); // ... }

    Si la intención era que this escuchara el evento, entonces registrar el controlador con una instancia diferente era inapropiado.

  3. Si necesita registrar el controlador con una instancia diferente, pero está seguro de que la definición está donde debería estar, tendrá que cambiar el nombre del controlador. Si por algún motivo cambiar la convención de nomenclatura en todos sus controladores de eventos no es una opción, lo mínimo que debe hacer es ponerle un prefijo al nombre con el que lo está registrando, por lo que está claro que este controlador no está destinado a ser registrado con this , pero con una instancia diferente:

    private function stage_onMouseDown(e:MouseEvent):void { if (_isEnginePlaying) { _player.attack(); } }

  4. Si insiste en mantener las cosas como están, puede suprimir la advertencia por completo , pero obviamente esto no es algo que deba hacer a menos que tenga una muy buena razón para hacerlo.

Tengo una clase de motor de juegos que hereda de MovieClip y maneja eventos MouseDown en un método de instancia privada. En aras de la simplicidad, onMouseDown controlador de eventos en onMouseDown . Se parece a esto:

private function onMouseDown(e:MouseEvent):void { if (_isEnginePlaying) { _player.attack(); } }

Lo registro en el método init la clase de motor (en sí mismo un manejador addToge) que se ve así:

private function init(e:Event):void { removeEventListener(Event.ADDED_TO_STAGE, init); // ... stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); // ... }

Esto compila y funciona correctamente, pero el compilador advierte:

Advertencia: 1090: Problema de migración: Flash Player no activa automáticamente el controlador de eventos onMouseDown en tiempo de ejecución en ActionScript 3.0. Primero debe registrar este controlador para el evento usando addEventListener (''mouseDown'', callback_handler).

Pero, como se muestra, addEventListener() el controlador usando addEventListener() . ¿Por qué el compilador todavía emite esta advertencia y qué puedo hacer para que la advertencia desaparezca?