我是 Flash Actionscript 3.0 编程的初学者。我正在尝试为游戏中的玩家移动创建流畅的键盘控制。
我目前正在使用 addEventListener(KeyboardEvent.KEY_DOWN) 监听键盘按键,然后在处理程序函数中通过将数字添加到其 .x 或 .y 属性来移动图形。
这在开始时会产生缓慢,迟缓的混蛋。我知道有一种更流畅、更灵敏的方式来做到这一点,但不知道从哪里开始。任何帮助,将不胜感激!
我是 Flash Actionscript 3.0 编程的初学者。我正在尝试为游戏中的玩家移动创建流畅的键盘控制。
我目前正在使用 addEventListener(KeyboardEvent.KEY_DOWN) 监听键盘按键,然后在处理程序函数中通过将数字添加到其 .x 或 .y 属性来移动图形。
这在开始时会产生缓慢,迟缓的混蛋。我知道有一种更流畅、更灵敏的方式来做到这一点,但不知道从哪里开始。任何帮助,将不胜感激!
对于平滑键,我建议使用 Timer 或 onEnterFrame 经常轮询键以获得平滑控制。它会完成工作,但要付出一定的代价。如果您的其余逻辑都很好,那么这应该可以:
var key:int = NaN;
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyPress,false,0,true);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyRelease,false,0,true);
this.addEventListener(Event.ENTER_FRAME,update,false,0,true);
function onKeyPress(event:KeyboardEvent):void {
key = event.keyCode;
event.stopPropagation();
}
function onKeyRelease(event:KeyboardEvent):void {
key = NaN;
event.stopPropagation();
}
function update(event:Event):void{
if(key) trace(key);
}
我通过阻止它的传播来确保事件不会冒泡,并且它设置在应该是最顶层的舞台上,事件明智。此外,我只使用键,否则我在 enterFrame 处理程序中忽略它。
HTH,乔治
你把听众放在哪里?它是在应用程序中,还是在应该移动的精灵中?按键时精灵是否有焦点?
另外,在添加事件侦听器时,您是否使用捕获?也就是说,您是否将第三个参数设置为 true,如
addEventListener(KeyboardEvent.KEY_DOWN, yourHandler, true)
如果您使用捕获,如果应用程序本身正在侦听事件,您必须这样做,那么您将获得一定的延迟,并且接口越复杂,这种延迟会越大。如果这些事件必须在一个巨大的层次结构中上升,这可能会很明显。如果有很多精灵,这可能会加剧问题。
您可以做的是让具有焦点的精灵分派一个自定义事件,控制器类为每个精灵侦听该事件。控制器类将有一个处理程序来移动 event.currentTarget 但是您计划完成它。
另请阅读有关自定义事件以及如何使用 SystemManager 动态添加和删除侦听器的信息:http: //livedocs.adobe.com/flex/3/langref/index.html。
最简单的例子就是这个。
在这里,您有一个可控的 Ship 类(Ship.as)。
import flash.display.MovieClip;
import flash.events.KeyboardEvent;
import flash.events.Event;
public class Ship extends MovieClip {
private var speedX;
private var speedY;
public function Ship() {
//constructor
stage.addEventListener(KeyboardEvent.KEY_DOWN ,keyDown);
stage.addEventListener(KeyboardEvent.KEY_UP ,keyUp);
stage.addEventListener(Event.ENTER_FRAME, update);
}
public function keyDown(e:KeyboardEvent) {
if(e.keyCode == 37) {
speedX = -5;
}
if(e.keyCode == 38) {
speedY = -5;
}
if(e.keyCode == 39) {
speedX = 5;
}
if(e.keyCode == 40) {
speedY = 5;
}
}
public function keyUp(e:KeyboardEvent) {
if(e.keyCode == 37 || e.keyCode == 39) {
speedX = 0;
}
if(e.keyCode == 38 || e.keyCode == 40) {
speedY = 0;
}
}
public function update(e:Event) {
x += speedX;
y += speedY;
}
}