[英]AS3 Keyboard Control
我有一个as3函数,可使用键盘控制影片剪辑:
包装{
import flash.display.MovieClip;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.events.Event;
public class Main_Character_Two extends MovieClip
{
var vx:int;
var vy:int;
public function Main_Character_Two()
{
init();
}
function init():void
{
//initialize variables
vx = 0;
vy = 0;
//Add event listeners
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
function onKeyDown(event:KeyboardEvent):void
{
if (event.keyCode == Keyboard.LEFT)
{
vx = -5;
}
else if (event.keyCode == Keyboard.RIGHT)
{
vx = 5;
}
else if (event.keyCode == Keyboard.UP)
{
vy = -5;
}
else if (event.keyCode == Keyboard.DOWN)
{
vy = 5;
}
}
function onKeyUp(event:KeyboardEvent):void
{
if (event.keyCode == Keyboard.LEFT || event.keyCode == Keyboard.RIGHT)
{
vx = 0;
}
else if (event.keyCode == Keyboard.DOWN || event.keyCode == Keyboard.UP)
{
vy = 0;
}
}
function onEnterFrame(event:Event):void
{
//Move the player
player.x += vx;
player.y += vy;
}
}
}
可以,但是主要的问题是,当您按向右键(并按住不放)然后按向左键时,字符将向左移动,但是当您释放向左键时(仍然按住向右键)角色就停止了。 我该如何做才能使角色在这种情况下再次开始向右移动(如果在Ive释放左键之后Im仍然按住右键)
谢谢
您可以将“玩家”定位代码放入Event.ENTER_FRAME
循环中,然后使用KeyboardEvent.KEY_DOWN
和KeyboardEvent.KEY_UP
设置布尔值并将玩家放置在循环中,例如:
var leftIsPressed:Boolean = false; var rightIsPressed:Boolean = false; var upIsPressed:Boolean = false; var downIsPressed:Boolean = false; var speed:Number = 5; var vx:Number = 0; var vy:Number = 0; stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler); stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler); function keyDownHandler(e:KeyboardEvent):void { switch(e.keyCode) { case Keyboard.LEFT : leftIsPressed = true; break; case Keyboard.RIGHT : rightIsPressed = true; break; case Keyboard.UP : upIsPressed = true; break; case Keyboard.DOWN : downIsPressed = true; break; } } function keyUpHandler(e:KeyboardEvent):void { switch(e.keyCode) { case Keyboard.LEFT : leftIsPressed = false; break; case Keyboard.RIGHT : rightIsPressed = false; break; case Keyboard.UP : upIsPressed = false; break; case Keyboard.DOWN : downIsPressed = false; break; } } function enterFrameHandler(e:Event):void { vx = -int(leftIsPressed)*speed + int(rightIsPressed)*speed; vy = -int(upIsPressed)*speed + int(downIsPressed)*speed; player.x += vx; player.y += vy; }
[编辑]添加了更详细的示例。
当然,在这种情况下,如果同时按下左右键,则偏移量为0
。
您可以侦听KeyboardEvent.KEY_UP
来确定何时释放键,因此可以跟踪哪些键被保留。
仅当按键从“向上”状态变为“向下”状态时才会触发KeyboardEvent.KEY_DOWN
事件,因此,在您将手指从LEFT键上抬起后,您的角色就会停止,因为没有触发新的KEY_DOWN
事件这会导致角色移动。
您可能可以通过添加KeyboardEvent.KEY_UP
事件来完成操作,该事件检查事件触发时是否查看是否按住了其他箭头键,但是您可能需要将当前代码重构为避免重复自己。
要了解此现象,需要对事件模型有基本的了解,该事件是键盘输入所基于的。 它在AS3中的工作方式与在AS2中不同。
当您按下某个键时,会触发一个事件以调用函数-但在按下该键时只会触发一次 。 事件处理程序不检查键是否被按下。 (尝试在onKeyDown函数中将对象的x / y值加5而不是vx;您会发现角色仅在按下某个键时移动,而不是在按住该键时移动。)
同样,释放键时,会触发一个事件以调用函数-但在主动释放键时,该事件仅触发一次。 当钥匙正坐在那里时,不会触发任何事件。
在此基础上...您能找到当前问题的根源吗?
function onKeyUp(event:KeyboardEvent):void
{
if (event.keyCode == Keyboard.LEFT || event.keyCode == Keyboard.RIGHT)
{
vx = 0;
}
else if (event.keyCode == Keyboard.DOWN || event.keyCode == Keyboard.UP)
{
vy = 0;
}
}
如果找不到,就是这个方块。
if (event.keyCode == Keyboard.LEFT || event.keyCode == Keyboard.RIGHT)
{
vx = 0;
}
该语句告诉您的程序,如果按下向右或向左键,则将速度设置为零。 但是,由于Flash 仅在您首次按下该键时才检查是否有按键 ,因此按住键不会触发onKeyDown函数。 因此,如果同时握住左手和右手,然后放开手,则将速度设置为零。
Corey在这里有一个合理的解决方案,还有其他一些原因,您需要使用切换的布尔值来检查键盘输入(主要原因是您不会得到任何重复延迟)。
我希望这个答案对您有所帮助-一点点知识就能带来美好的事物。 祝好运。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.