我在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使用有关,但我找不到该错误的任何特定帮助。
我不可能是唯一遇到这个问题的人。有什么想法吗?
答案 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.keyCode
(KeyboardEvent
是类),而不是keyboardEvent.keyCode
(您的变量)。
这些问题与FlashDevelop无关。