[英]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.