我是Flash Actionscript 3.0编程的初学者。我正在尝试为游戏中的玩家移动创建流畅的键盘控制。
我正在使用addEventListener(KeyboardEvent.KEY_DOWN)监听键盘按键,然后在处理函数内通过向其.x或.y属性添加数字来移动图形。
这会在开始时产生缓慢,缓慢的混蛋。我知道这样做更顺畅,响应更快,但不知道从哪里开始。任何帮助将不胜感激!
答案 0 :(得分:2)
对于平滑键,我建议使用Timer或onEnterFrame来经常轮询键以获得平滑控件。它将完成工作,但需要付出一定的代价。如果你已经完成其余的逻辑,那么这应该适合ok:
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, 乔治
答案 1 :(得分:0)
你在哪里放置听众?它是在应用程序中,还是在应该移动的精灵中?当您按下该键时,精灵是否具有焦点?
另外,在添加事件监听器时,您使用的是捕获吗?也就是说,您是否将第3个参数设置为true,如
addEventListener(KeyboardEvent.KEY_DOWN, yourHandler, true)
如果您使用捕获,如果应用程序本身正在侦听事件,则必须执行此操作,然后您将获得一定的延迟,并且接口越复杂,此延迟将越大。如果这些事件必须在一个巨大的层次结构中发挥作用,这可能是显而易见的。如果有很多精灵,这可能会加剧这个问题。
你可以做的是让焦点调度的sprite成为控制器类为每个sprite监听的自定义事件。控制器类将有一个移动event.currentTarget的处理程序,但是您计划完成它。
另请阅读有关自定义事件以及如何使用SystemManager动态添加和删除侦听器:http://livedocs.adobe.com/flex/3/langref/index.html。
答案 2 :(得分:0)
最简单的例子就是这个。
在这里你有一个可控的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;
}
}