2009-06-06 6 views
2

У меня, похоже, проблемы с клавиатурным событием внутри класса, чтобы работать, у меня есть событие ENTER_FRAME, которое отлично работает, но событие клавиатуры никогда не вызывается. Есть идеи? вот кодСобытия клавиатуры AS3 внутри класса?

package 
{ 
import flash.display.MovieClip; 
import flash.display.Stage; 
import flash.events.*; 
public class mainGame extends MovieClip 
{ 
    var myPlayer:player = new player(); 
    function mainGame():void 
    { 
     trace("arg!"); 
     addChild(myPlayer); 
     addEventListener(KeyboardEvent.KEY_DOWN, keyDown); 
     addEventListener(Event.ENTER_FRAME, update); 
    } 
    function keyDown(evt:KeyboardEvent):void 
     { 
          trace("This never happens"); 
      myPlayer.x++; 
     } 
     function update(evt:Event):void 
     { 
      trace("This happens fine"); 
     } 

} 
} 

благодарит заранее!

ответ

16

В отличие от AS2, в AS3 события клавиатуры не являются глобальными. Они выходят на сцену, и они пузырятся через список отображения, на какой бы экранный объект не фокусировался. В вашем коде ваш слушатель событий добавляется в mainGame, поэтому он будет только загореться, когда на сцене появится mainGame, и пользователь щелкнул (или перетаскивал мышью, я забыл) видеоклип mainGame.

Если вы хотите получить события на клавиатуре во всем мире, как я уже сказал, все они начинаются со сцены до пузыря, поэтому, если вы зарегистрируетесь для событий со сценой, вы получите все события клавиатуры. Так, как kekoav сказал, как сделать это

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown); 

Однако, ваша проблема в том, что stage в этом коде не является глобальной переменной. Это свойство, которое является общим для всех DisplayObjects, но оно равно null, пока объект не будет добавлен в список отображения.

Поэтому, чтобы обойтись без объяснений, приведенный выше код будет работать, если вы его вызываете после того, как mainGame был добавлен на сцену. Если нет простого способа для вас, чтобы сделать это, вы могли бы добавить клавиатуру слушатель внутри другого слушателя, который знает, когда огнь:

function mainGame():void {  
     //... 
     addEventListener(Event.ADDED_TO_STAGE, stageAddHandler); 
     //... 
    } 

    private function stageAddHandler(e:Event):void { 
     stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown); 
     removeEventListener(Event.ADDED_TO_STAGE, stageAddHandler); 
    } 
2

Добавьте слушателей на клавиатуре на сцену, а не в свой класс.

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown); 
+0

, который не работает, он говорит мне, что он не может ссылаться на нулевой объект, когда я это делаю. – Matt

+0

Это потому, что вы не можете ссылаться на сцену, пока не на ней. Fenomas имеет решение этого. –

+0

Да, если ваша сцена еще не построена, вы должны сделать эту дополнительную работу. – Kekoa

2
import flash.events.Event; 
import flash.events.KeyboardEvent; 

разместить событие клавиатуры внутри события enterframe, таким образом, он обновляет каждый раз кадр обновляется.

  function update(evt:Event):void  
      {  
        trace("This happens fine"); 
        function keyDown(evt:KeyboardEvent):void  
        {  
         trace("This never happens");  
         myPlayer.x++;  
        }  
      } 
Смежные вопросы