Problemas extraños en FlashDevelop

Tengo algunos problemas en un juego que estoy creando en Action Script 3. Lo hago con el conocimiento de todos los tutoriales que he leído usando FlashDevelop. Sin embargo, me he encontrado con varios errores en este código que me impiden compilar. Estos son los únicos dos archivos AS que tiene hasta ahora:

Main.as

package 
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.TimerEvent;
    import flash.utils.Timer;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;

    public class Main extends Sprite 
    {
        public var gameTimer:Timer

        public var LeftisPressed:Boolean;
        public var RightisPressed:Boolean;

        public var jumper = new Jumper;

        public function Main()
        {
            gameTimer = new Timer( 40 )
            gameTimer.addEventListener(TimerEvent.TIMER, onTick);

            RightisPressed = false;
            LeftisPressed = false;

            addEventListener( Event.ADDED_TO_STAGE, OnAddToStage() );

            jumper = new Jumper();
            addChild( jumper );
        }
        public function OnAddtoStage() :void
        {
            stage.addEventListener( KeyboardEvent.KEY_DOWN, onKeyPress );
            stage.addEventListener( KeyboardEvent.KEY_UP, onKeyRelease );
        }
        public function onTick (timerEvent: TimerEvent) :void
        {
            if (LeftisPressed)
            {
                jumper.Left();
            }

            if (RightisPressed)
            {
                jumper.Right();
            }
        }
        public function onKeyPress (keyboardEvent: KeyboardEvent) :void
        {
            if (KeyboardEvent.keyCode == Keyboard.LEFT )
            {
                LeftisPressed = true;
            }
            if (KeyboardEvent.keyCode == Keyboard.RIGHT )
            {
                RightisPressed = true;
            }
        }
        public function onKeyRelease(keyboardEvent: KeyboardEvent) :void
        {
            if (KeyboardEvent.keyCode == Keyboard.LEFT )
            {
                LeftisPressed = false;
            }
            if (KeyboardEvent.keyCode == Keyboard.RIGHT )
            {
                LeftisPressed = false;
            }
        }

    }
}

Jumper.as

package 
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.TimerEvent;
    import flash.utils.Timer;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;
    /**
     * ...
     * @author Timothy Bumpus
     */
    public class Jumper extends Sprite 
    {
        public function Jumper()
        {
            var square:Sprite = new Sprite();
            addChild(square);
            square.graphics.lineStyle(3,0x00ff00);
            square.graphics.beginFill(0x0000FF);
            square.graphics.drawRect(0,0,100,100);
            square.graphics.endFill();
            square.x = 250
            square.y = 350
        }
        public function Left()
        {
            x = x - 3
        }
        public function Right()
        {
            x = x + 3
        }
    }

}

(En caso de que te importe, se llama saltador porque eventualmente lo haré saltar).

La idea es hacer que un sprite se mueva hacia la izquierda y hacia la derecha hasta las teclas correspondientes. Pero cuando trato de depurarlo, me da 5 errores, "col: 44 Error: Llamada a un método posiblemente indefinido OnAddToStage". y "col: 22 Error: Acceso de propiedad keyCode posiblemente indefinida a través de una referencia con tipo estático Class". por cada vez que menciono keyCode. Después de buscar en Internet, mi única conclusión es que tiene algo que ver con los usos de Flex SDK FlashDevelop, pero no puedo encontrar ninguna ayuda específica para el error en ese contexto.

No puedo ser la única persona que ha tenido este problema. ¿Algunas ideas?

preguntado el 30 de agosto de 11 a las 22:08

2 Respuestas

En esta línea de su constructor, está cometiendo un error común para principiantes de actionscript:

addEventListener( Event.ADDED_TO_STAGE, OnAddToStage() );

Estas pasando el resultado de la función OnAddToStage para addEventListener, en este caso es void, por lo que no estás pasando nada. Lo que quieres hacer es pasar la función real de esta manera:

// note the missing paranthesis
addEventListener( Event.ADDED_TO_STAGE, OnAddToStage );

En su manipulador de llaves, está cometiendo un error similar, KeyboardEvent es la clase, keyboardEvent (con una k minúscula) es la instancia del evento real, así que cámbielos de esta manera:

if (keyboardEvent.keyCode == Keyboard.LEFT )
{
    LeftisPressed = true;
}

Las constantes clave son propiedades estáticas de la clase, por lo que deben permanecer como están.

También notará que la convención de actionscript es usar lowerCamelCase para funciones y variables y guardar UpperCamelCase para clases. Esto no es necesario, pero como las clases y funciones también son objetos, puede resultar muy confuso si no se tiene cuidado.

Respondido 31 ago 11, 03:08

Los mensajes de error son bastante descriptivos.

El primero se queja de esta línea:

 addEventListener( Event.ADDED_TO_STAGE, OnAddToStage() );

Estas llamando al OnAddToStage método cuando realmente quieras hacer referencia a él, así:

 addEventListener( Event.ADDED_TO_STAGE, OnAddToStage );

addEventListener está esperando un método, así que a menos que OnAddToStage devoluciones un método (que no es así en este caso), se produce un error cuando lo llama en lugar de pasarlo.

El segundo error se debe a que está utilizando KeyboardEvent.keyCode (KeyboardEvent es la clase) en lugar de keyboardEvent.keyCode (tu variable).

Estos problemas no tienen nada que ver con FlashDevelop.

Respondido 31 ago 11, 03:08

Oh, hombre ... mirando hacia atrás, esto era bastante obvio. Supongo que tiendo a pensar demasiado en las cosas ... No pude encontrar ningún otro lugar que me ayudara a llegar a una conclusión, ¡así que muchas gracias a los dos! - Puzzlem00n

Realmente debería disculparme, seguí buscando un problema mucho mayor cuando estaba realmente frente a mí. - Puzzlem00n

@usuario: No se preocupe. La próxima vez leerá los errores de compilación con más atención ;-) - Cameron

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.