FlashDevelop中的奇怪问题

时间:2011-08-30 22:54:15

标签: actionscript-3

我在Action Script 3中制作的游戏中存在一些问题。我使用FlashDevelop从我读过的每个教程中获取知识。但是,我在这段代码中遇到了一些错误,导致我无法编译。以下是目前为止唯一的两个AS文件:

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
        }
    }

}

(如果它对你很重要,它叫做跳线,因为我最终会让它跳起来。)

这个想法是让一个精灵向左和向右移动到相应的键。但是当我尝试调试它时,它给了我5个错误,“col:44错误:调用可能未定义的方法OnAddToStage。”和“col:22错误:通过具有静态类型Class的引用访问可能未定义的属性keyCode。”每次我提到keyCode。在搜索互联网之后,我唯一的结论是它与Flex SDK FlashDevelop使用有关,但我找不到该错误的任何特定帮助。

我不可能是唯一遇到这个问题的人。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

在构造函数的这一行中,你正在制作一个常见的动作脚本初学者错误:

addEventListener( Event.ADDED_TO_STAGE, OnAddToStage() );

您将OnAddToStage函数的结果传递给addEventListener,在这种情况下为void,因此您不会传递任何内容。你想要做的是传递这样的实际功能:

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

在你的密钥处理程序中你正在犯一个类似的错误,KeyboardEvent是类,keyboardEvent(小写的k)是实际的事件实例,所以将它们交换出来:

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

关键常量是类的静态属性,所以它们应该保持原样。

您还会注意到actionscript约定是对函数和变量使用lowerCamelCase,并为类保存UpperCamelCase。这不是必需的,但是由于类和函数也是对象,如果你不小心,它会变得非常混乱。

答案 1 :(得分:1)

错误消息非常具有描述性。

第一个抱怨这条线:

 addEventListener( Event.ADDED_TO_STAGE, OnAddToStage() );

当您真正要引用它时,您正在调用OnAddToStage方法,如下所示:

 addEventListener( Event.ADDED_TO_STAGE, OnAddToStage );

addEventListener期待一种方法,所以除非OnAddToStage 返回一个方法(在这种情况下它不会),否则当你调用它而不是传递它。

第二个错误是因为您使用的是KeyboardEvent.keyCodeKeyboardEvent是类),而不是keyboardEvent.keyCode(您的变量)。

这些问题与FlashDevelop无关。