2012-10-05 60 views
0

我試圖讓它檢測到一個密鑰在down狀態和up狀態之間切換。我需要它顯示在恢復到UP狀態之前,密鑰被釋放一幀。檢測一個密鑰發佈的幀

如果需要,我可以添加更多信息或代碼。先謝謝你。

package engine 
{ 
import flash.display.Stage; 
import flash.events.KeyboardEvent; 


/** 
* Input Manager 
*/ 
public class Input 
{ 
    static private const UP   : uint = 0; 
    static private const PRESS  : uint = 1; 
    static private const HELD  : uint = 2; 
    static private const END_PRESS : uint = 3; 

    static private const START_PRESS:uint = 9999; 


    static private var keys  : Vector.<uint>; 
    static private var active : Vector.<KeyState>; 



    static public function init(stage:Stage):void 
    { 
     stage.removeEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); 
     stage.removeEventListener(KeyboardEvent.KEY_UP, onKeyUp); 

     keys = new Vector.<uint>(255); // state of all keys 
     active = new Vector.<KeyState>();  // only keys in a state other than up 
     //time = new Vector.<Time>(); 

     stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); 
     stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); 
    } 


    /// Flash Event: A key was just pressed 
    static public function onKeyDown(e:KeyboardEvent):void 
    { 
     // If the system is sending another key down event, but the key is marked 
     // as being in some other state than down; ignore it. 
     if (keys[ e.keyCode ] != UP) 
      return; 

     keys[ e.keyCode ] = START_PRESS; 

     var keyState:KeyState = new KeyState(e.keyCode, Time.frameCount); 
     active.push(keyState); 
    } 

    /// Flash Event: A key was raised 
    static public function onKeyUp(e:KeyboardEvent):void 
    { 

     keys[ e.keyCode ] = UP 

     // Loop through all active keys; there is a slight chance that 
     // more than one entry for a key being "down" snuck in due to 
     // how Flash/OS handles input. 
     var keyState:KeyState; 
     for (var i:int = active.length - 1; i > -1; i--) 
     { 

      keyState = active[i];    // get next keystate in active list 
      if (keyState.code == e.keyCode) // if the code matches 
       active.splice(i, 1);   // remove 
     } 
    } 

    /// Call this once per frame 
    static public function update():void 
    { 
     var code :uint; 
     var keyState:KeyState; 

     // Go through all the inputs currently mark as being active... 
     for (var i:int = active.length - 1; i > -1; i--) 
     { 
      keyState = active[i]; 
      code = keyState.code; 

      // If a key is pressed and it's the frame after it was pressed, 
      // change the state. 
      if (keys[code] == PRESS && keyState.frame < Time.frameCount) 
      { 
       keys[code] = HELD; 
       continue; 
      } 

      // If a press is just starting, mark it as started and update 
      // the frame for the press to be this frame. 
      if (keys[code] == START_PRESS) 
      { 
       keys[code] = PRESS; 
       keyState.frame = Time.frameCount; 
      } 

     } 

    } 

    /// Has a key just been pressed in this frame? 
    static public function getKeyDown(code:uint):Boolean 
    { 
     return keys[ code ] == PRESS; 
    } 

    /// Is a key in state other than being "up"? 
    static public function getKey(code:uint):Boolean 
    { 
     return keys[ code ] == HELD; 
    } 

    static public function getKeyRelease(code:uint):Boolean 
    { 
     return keys[ code ] == END_PRESS; 
    } 
} 
} 


internal class KeyState 
{ 
public var code :uint; 
public var frame:uint; 

/// CTOR 
function KeyState(code:uint, frame:uint) :void 
{ 
    this.code = code; 
    this.frame = frame; 
} 
} 
+1

我不太確定你的問題是什麼,我明白你想要完成什麼,但是你沒有真正說出你的錯誤,你是否在調試你是否有任何斷點,你有錯誤嗎?不知道從哪裏開始只是一點點的代碼。 – shaunhusain

+0

如果你想知道當前幀的數量,只需添加一個'private var current_frame:int = 0;'和enterFrame listener:'current_frame ++;' –

回答

0

因爲您希望在框架內完成某些操作,您必須使用Event.ENTER_FRAME監聽器。通過這種方式,您可以將「剛剛釋放」的按鍵重置爲「正常」狀態。在這種情況下,你做的:

static public function onKeyUp(e:KeyboardEvent):void 
{ 
    keys[ e.keyCode ] = END_PRESS; 
    // I'm not sure why you need other checks in here, add them if you like 
} 

static public function onEnterFrame(e:Event):void 
{ 
    for (var i:int=keys.length-1; i>=0;i--) if (keys[i]==END_PRESS) { 
     keys[i]=UP; 
     // do whatever you need with i'th key, as this will be the "just released" key. 
    } 
} 

更新:你已經有了一個基本的輸入幀的過程,並且你已經有了一些關於新聞的機制,並舉行狀態,這樣你就可以清楚地加入這個循環到該過程。