2011-08-30 63 views
0

我在动作脚本3中制作的游戏中存在一些问题。我使用FlashDevelop读过的每个教程中的知识来制作它。我在这段代码中遇到了一些错误,但是,这阻止了我编译。这里是仅有的两个AS文件,它迄今:FlashDevelop中的奇怪问题

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。在搜索互联网之后,我唯一的结论是它与Flash SDK使用的Flex SDK有关,但我无法找到关于该上下文中的错误的任何具体帮助。

我不能是唯一有这个问题的人。有任何想法吗?

回答

1

在此行中在构造函数你犯了一个常见的ActionScript初学者的错误:

addEventListener(Event.ADDED_TO_STAGE, OnAddToStage()); 

你传递结果OnAddToStage功能的addEventListener的,在这种情况下是void,所以你没有传递任何东西。你想要做的是通过这样的实际功能:

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

记在你的keyhandler你正在做一个类似的错误,KeyboardEvent是类,keyboardEvent(以小写k)是实际事件实例,所以换掉这些:

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

键常量是类的静态属性,所以他们应该保持他们的方式。

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

1

错误消息是相当具有描述性的。

第一个是抱怨这一行:

addEventListener(Event.ADDED_TO_STAGE, OnAddToStage()); 

您所呼叫的OnAddToStage方法时真的要引用,就像这样:

addEventListener(Event.ADDED_TO_STAGE, OnAddToStage); 

addEventListener期待的方法,所以除非OnAddToStage返回一个方法(它不在这种情况下),当您调用它而不是将它传入时会出现错误。

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

这些问题与FlashDevelop无关。

+0

哦,男人......回头看,这很明显。我想我倾向于过度考虑事情...找不到其他任何帮助我得出结论的地方,非常感谢,你们两个! – Puzzlem00n

+0

我真的应该道歉,在我面前时,我一直在寻找一个更大的问题。 – Puzzlem00n

+0

@user:不用担心。下次你会更仔细地阅读编译错误;-) – Cameron