2014-03-05 25 views
0

因此,我正在開發一個需要鍵盤輸入的Flash項目。在舞臺上有一個從上面看到的「車」實例應該是旋轉和驅動旋轉的方向。這是我已經把迄今在AS3:在AS3中獲取鍵盤輸入的問題

//Required stuff 
    import flash.ui.Keyboard; 
    import flash.events.Event; 
    import flash.events.KeyboardEvent; 
    import flash.display.Stage; 
    import flash.display.MovieClip; 

    Car.addEventListener(Event.ENTER_FRAME, this.RunGame); 
    stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); 
    stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); 

//Variables 
    var keys:Array = [] 

var vDrive:Number = 3; //Car's current base speed 
    var vx:Number = 0; //Speed along x axis 
var vy:Number = 0; //Speed along y axis 

var vMax:Number = 30; //Top speed 
var vRot:Number = 3; //Rotation speed 

var vAcc:Number = 1.1; //Factor for acceleration 
var vDeAcc:Number = 0.90; //Factor for de-acceleration 


//Game Loop 
    RunGame(); 

function RunGame():void 
    { 

    // Drive forwards 
     if (keys[Keyboard.UP]) 
      { 
      if (vDrive < vMax) 
      vDrive += vAcc; 
      } 


     // Reverse 
    if (keys[Keyboard.DOWN]) 
     { 
     if (vDrive > vMax) 
      vDrive *= vAcc; 
     } 

    // Turn right 
    if (keys[Keyboard.RIGHT]) 
     { 
     Car.rotation += vRot; 
     } 

    // Turn left venstre 
    if (keys[Keyboard.LEFT]) 
     { 
     Car.rotation -= vRot; 
     } 

    //Movement 
     // Friction 
      vDrive *= vDeAcc; 

     //Calculating movement vector 
      vx = vDrive * Math.cos(toRad(Car.rotation)); 
      vy = vDrive * Math.sin(toRad(Car.rotation)); 

     //Update car position 
      Car.x -= vx ; 
      Car.y -= vy; 
    } 

然而,當我運行程序,箭頭鍵似乎並沒有做任何事情。 我也得到了以下編譯器警告,這兩個「onkeydown事件」和「的onkeyup」:

遷移問題:onKeyDown事件處理函數不是由Flash Player自動在ActionScript 3.0中運行時觸發 。您 必須先註冊此處理使用addEventListener (「的keyDown」,callback_handler)爲該事件

試圖增加它建議只是讓錯誤的說法是沒有定義callback_handler。 我現在陷入困境,試圖弄清楚如何使鍵盤輸入工作。有人知道嗎?

回答

0

您當前正在丟失關鍵聽衆的功能。您已經添加了聽衆這裏的階段:

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

現在你只需要創建功能:

function onKeyDown(e:KeyboardEvent):void { 
    //add our key to the keys array 
    keys[e.keyCode] = e.keyCode; 
} 

function onKeyUp(e:KeyboardEvent):void { 
    //if the key is in the keys array, set the value to null 
    keys[e.keyCode] = null; 
} 

但這裏還有另外一個問題:

Car.addEventListener(Event.ENTER_FRAME, this.RunGame); 

你不需要this.RunGame,只要RunGame會這樣做,但是你應該會得到一個錯誤,這個方法需要一個參數類型爲Event,所以你的RunGame()定義壽LD是這樣的:

function RunGame(e:Event):void 

然後,你不會把RunGame(),它被稱爲每一幀,而綁在事件偵聽器。

編輯:請注意有很多方法來處理關鍵事件,我的答案將與您當前的實施。