我正在制作一个简单的游戏,我希望能够在类构造函数中添加键盘事件lisnter。但是我遇到了麻烦。我不知道你必须通过列出的显示对象属性阶段传递舞台吗?无论如何,我得到的错误无法识别我的事件监听器键盘事件。
最佳路易斯
package louiseguchi.game
{
import flash.display.Stage;
import flash.events.Event;
import flash.display.Sprite;
import flash.ui.Keyboard
import flash.events.KeyboardEvent
{
public function keyBoardVelocity extends EventDispatcher ()
{
// constructor code
stage.addEventListener(KeyboardEvent.KEY_UP, keyPressUp);
}
private static function keyPressUp(Event:KeyboardEvent):void{
trace("ok")
}
}
}
答案 0 :(得分:2)
您可以创建一个具有公共静态属性的类,您可以为其分配舞台引用,从而使整个应用程序可以访问舞台,如下所示:
package
{
import flash.display.Sprite;
import flash.events.Event;
public class Main extends Sprite
{
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}// end function
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
GlobalVars.stage = stage;
var keyboardVelocity:KeyboardVelocity = new KeyboardVelocity();
}// end function
}// end class
}// end package
import flash.display.Stage;
internal class GlobalVars
{
public static var stage:Stage;
}// end class
import flash.events.EventDispatcher;
import flash.events.KeyboardEvent;
internal class KeyboardVelocity extends EventDispatcher
{
public function KeyboardVelocity()
{
var stage:Stage = GlobalVars.stage;
stage.addEventListener(KeyboardEvent.KEY_DOWN, onStageKeyDown);
}// end function
private function onStageKeyDown(e:KeyboardEvent):void
{
trace("key down");
}// end function
}// end class
注意:我使用了内部类,因此您只需将代码复制并粘贴到文档类中并运行它即可。理想情况下,您可以将类分隔为自己的文件。
就我个人而言,我不喜欢在全球范围内使用对象,因为它会带来潜在的安全风险,在我看来这是不好的做法。您应该考虑简单地将舞台的引用解析为KeyboardVelocity
类,如下所示:
package
{
import flash.display.Sprite;
import flash.events.Event;
public class Main extends Sprite
{
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
var keyboardVelocity:KeyboardVelocity = new KeyboardVelocity(stage);
}// end function
}// end class
}// end package
import flash.display.Stage;
import flash.events.EventDispatcher;
import flash.events.KeyboardEvent;
internal class KeyboardVelocity extends EventDispatcher
{
public function KeyboardVelocity(stage:Stage)
{
stage.addEventListener(KeyboardEvent.KEY_DOWN, onStageKeyDown);
}// end function
private function onStageKeyDown(e:KeyboardEvent):void
{
trace("key down");
}// end function
}// end class
答案 1 :(得分:1)
这里有一些问题。首先,你的班级是畸形的。看我的评论。
package louiseguchi.game
{
import Main; //doc class
import flash.display.Stage;
import flash.events.Event;
import flash.display.Sprite;
import flash.events.EventDispatcher;
import flash.ui.Keyboard
import flash.events.KeyboardEvent
//only classes may be extended
public class KeyBoardVelocity extends EventDispatcher
{
//here is your constructor
public function KeyBoardVelocity()
{
super()
init()
}
private function init():void
{
addEventHandlers();
}
private function addEventHandlers()
{
//static access of main stage
Main.stage.addEventListener(KeyboardEvent.KEY_UP, keyPressUp);
}
// instance function
private function keyPressUp(Event:KeyboardEvent):void{
trace("ok")
}
}
}
请注意,我在构造函数和侦听器之间添加了几个步骤。如果你愿意,可以这样做,但我通常很少在构造函数中。
其次,您需要在显示列表中有一些对象来访问该阶段,并且通常通过Main文档类访问它。在这里,我只有一个在文档类中引用的静态get函数:
package com.b99.testBed //alter as needed
{
import com.b99.testBed.keypress.KeyBoardVelocity;
import flash.display.Sprite;
import flash.display.Stage;
/**
* ...
* @author bosworth99
*/
public class Main extends Sprite
{
private static var _stage:Stage;
public function Main()
{
super();
init();
}
private function init():void
{
_stage = this.stage;
var _candidate:KeyBoardVelocity = new KeyBoardVelocity();
}
public static function get stage():Stage { return _stage; }
}
}
您可以通过多种方式访问舞台,这是我通常喜欢的方式。
希望有所帮助。