Pregunta

Estoy accediendo a UIComponent personalizado a través de un archivo SWC desde Flex 3.Este componente funciona bien en Flash CS3, pero usarlo desde Flex genera un error extraño en draw().

Agregué el componente swc dentro de Sprite (con addchild) y está en la ruta LIB.

Error de tecleado:Error nº 1010:Un término no está definido y no tiene propiedades.

at com.xxxx.highscores::HighScores/draw()

at fl.core::UIComponent/callLaterDispatcher()

Aquí está la función draw() de este componente de interfaz de usuario:

anular la función protegida dibujo (): void {isInitializing = false;

     page.Text.x = width / 2;
     page.Text.y = height / 2;

     drawBackground();

}

¿Fue útil?

Solución

Con solo ese código, debe ser página o página.Texto es nulo.

Siguiendo los nombres, supongo que la página es un objeto de biblioteca Flash que se crea con AS.Si es así, supongo que se activa un error anterior antes de que se cree y el reproductor lo absorba (puede ocurrir si el depurador aún no se ha conectado o si hay problemas con la carga de bibliotecas compartidas).Es común que 'etapa' no se configure para un nuevo objeto de visualización hasta que se agregue a la lista de visualización.

EDITAR:Es un error en el componente: draw() siempre usa el highScoresModuleText propiedad en la página:que sólo se establece cuando la página es una HighScoresTextPage, y ninguna de las otras páginas, por ejemplo: HighScoresTablePage, cual showHighsSores() lo establece en.Esto funciona en Flash presumiblemente porque el objeto está en el escenario, o al menos se crea antes. showHighScores() se llama, entonces draw() se llama primero y, dado que el componente no se invalida, no se llama después.

El método correcto en este caso es tener show*() simplemente establezca algunas propiedades, luego invalidate() tener draw() descúbrelo más tarde, pero una solución rápida es simplemente agregar 'if (page.highScoresModuleText)' alrededor de las líneas ofensivas en draw().Una solución aún más rápida es crear y addChild() el componente temprano (como el inicio) y llame showHighScores() mucho más tarde.

Esto funciona para mí:

package
{
    import flash.display.Sprite;
    import com.novelgames.flashgames.highscores.HighScores;
    import flash.events.MouseEvent;

    public class As3_scratch extends Sprite
    {
        private var highscore : HighScores;

        public function As3_scratch()
        {
            highscore = new HighScores();
            addChild(highscore);
            stage.addEventListener(MouseEvent.CLICK, onClick);
        }

        private function onClick(event : MouseEvent) : void
        {
            highscore.showEnterHighScore(50);
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top