簡體   English   中英

AS3鍵盤控制

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM