2016-06-02 17 views
1

ich versuche herauszufinden, Zustand und für "Verknüpfung" zum Beenden von Standalone-App von Flash. Ich möchte 2 Tasten drücken und Kombination dieser beiden Tasten "C + M" sollte meine App beenden. Heres mein Code, aber es funktioniert immer noch nicht. Ich habe versucht, sicherzustellen, dass die App mir erlaubt, mehrere Tasten gleichzeitig zu drücken, und danach habe ich die Funktion zum Beenden erstellt. Alle Antworten sind großartig.EventListener für Tastenkombinationen in AS3?

var keyPressedC:Boolean; 
 
var keyPressedM:Boolean;  
 

 
addEventListener(KeyboardEvent.KEY_DOWN, check_key_down,false,0,true); 
 
addEventListener(KeyboardEvent.KEY_UP, check_key_up,false,0,true); 
 
addEventListener(Event.ENTER_FRAME, check_keys,false,0,true); 
 

 
function check_keys(event:Event):void 
 
{ 
 
    if(keyPressedC) 
 
     trace("pushed C") 
 
    if(keyPressedM) 
 
     trace("pushed M") 
 
} 
 

 
function check_key_down(event:KeyboardEvent):void 
 
{ 
 
    if(event.keyCode == 67) 
 
     keyPressedC = true; 
 
    if(event.keyCode == 77) 
 
     keyPressedM = true; 
 
    } 
 

 
function check_key_up(event:KeyboardEvent):void 
 
{ 
 
    if(event.keyCode == 67) 
 
     keyPressedC = false; 
 
    if(event.keyCode == 77) 
 
     keyPressedM = false; 
 
} 
 
    
 
import flash.system.fscommand; 
 

 
stage.addEventListener(KeyboardEvent.KEY_DOWN, enterKeyHandlercm); 
 
function enterKeyHandlercm(event:KeyboardEvent):void 
 
{ 
 
\t if (event.keyCode == Keyboard.C && event.keyCode == Keyboard.M) 
 
\t { 
 
\t \t fscommand("quit"); 
 
\t } 
 
}

Herausgegeben, immer noch nicht funktioniert:

var keyPressedC:Boolean; 
 
var keyPressedM:Boolean;  
 

 
addEventListener(KeyboardEvent.KEY_DOWN, check_key_down,false,0,true); 
 
addEventListener(KeyboardEvent.KEY_UP, check_key_up,false,0,true); 
 
addEventListener(Event.ENTER_FRAME, check_keys,false,0,true); 
 

 
function check_keys(event:Event):void 
 
{ 
 
    if(keyPressedC) 
 
     trace("pushed C") 
 
    if(keyPressedM) 
 
     trace("pushed M") 
 
} 
 

 
function check_key_down(event:KeyboardEvent):void 
 
{ 
 
    if(event.keyCode == 67) 
 
     keyPressedC = true; 
 
    if(event.keyCode == 77) 
 
     keyPressedM = true; 
 
    } 
 

 
function check_key_up(event:KeyboardEvent):void 
 
{ 
 
    if(event.keyCode == 67) 
 
     keyPressedC = false; 
 
    if(event.keyCode == 77) 
 
     keyPressedM = false; 
 
} 
 
    
 
import flash.system.fscommand; 
 

 
stage.addEventListener(KeyboardEvent.KEY_DOWN, enterKeyHandlercm); 
 
function enterKeyHandlercm(event:KeyboardEvent):void 
 
{ 
 
\t if (keyPressedM == true && keyPressedC == true) 
 
\t { 
 
\t \t fscommand("quit"); 
 
\t } 
 
}

+0

Was funktioniert nicht? Erhalten Sie einen Fehler? –

+0

Keine Fehler, aber erstens, ich bekomme keine Trace-Ausgaben "Pushed C" oder "M" und zweitens, Kombination von C + M nicht die App zu beenden. – TomT

Antwort

1

In Ihrem enterKeyHandlercm Block, Ihre Logik der keyPressed Auswertungs-Wert sein sollte, nicht der keyCode Wert .

function enterKeyHandlercm(event:KeyboardEvent):void 
{ 
    if (keyPressedM == true && keyPressedC == true) 
    { 
     fscommand("quit"); 
    } 
} 

Mit diesem Code wird eine andere MC für jede Ihre Taste 5 Möglichkeiten hinzugefügt (c up, C unten, m up, m nach unten, c + m nach unten).

package { 
    import flash.display.*; 
    import flash.events.*; 
    import flash.system.fscommand; 
    import flash.system.System; //add this if you try System.exit(0); 

    public class FlashTest extends MovieClip 
    { 

     public function FlashTest() 
     { 
      var keyPressedC:Boolean; 
      var keyPressedM:Boolean;  

      // need to add eventListener to stage 
      // default values work fine. 
      stage.addEventListener(KeyboardEvent.KEY_DOWN, check_key_down); 
      stage.addEventListener(KeyboardEvent.KEY_UP, check_key_up); 
      stage.addEventListener(Event.ENTER_FRAME, check_keys); 

      function check_key_down(event:KeyboardEvent):void 
      { 
       if(event.keyCode == 67) 
       { 
        keyPressedC = true; 
        newBall(-100); 
       } 
       if(event.keyCode == 77) 
       { 
        keyPressedM = true; 
        newBall(); 
       } 
      } 

      function check_key_up(event:KeyboardEvent):void 
      { 
       if(event.keyCode == 67) 
       { 
        keyPressedC = false; 
        newBall(-50); 
       } 
       if(event.keyCode == 77) 
       { 
        keyPressedM = false; 
        newBall(50); 
       } 
      } 

      function enterKeyHandlercm(event:KeyboardEvent):void 
      { 
       if (keyPressedM == true && keyPressedC == true) 
       { 
        newBall(100); 
        fscommand("quit"); 
        // or try System.exit(0); 
       } 
       } 


       function newBall(x:Number=0):void 
       { 
         var ball:Sprite = new Sprite(); 
         ball.graphics.lineStyle(); 
         ball.graphics.beginFill(0x000000); 
         ball.graphics.drawCircle(0,0,20); 
         ball.graphics.endFill(); 
         addChild(ball); 
         ball.x = stage.stageWidth/2+x; 
         ball.y = stage.stageHeight/2; 
       }  
      } 
     } 
    } 

Bitte verzeihen Sie meine Ausführlichkeit, aber auf diese Weise verpassen wir nichts. Der Grund, warum ich den Ball-Konstruktor hinzugefügt habe, war, dass ich nur meinen Laptop bei mir habe, also musste ich eine Online-IDE verwenden und ich weiß nicht, wie man ein Ausgabefenster findet oder einen Debugger ausführt und keine Systembefehle benötigt. Aber was ich mit der Ballmethode bestätigen kann ist, dass wenn "c" und "m" zusammen gedrückt werden, ein einzigartiger MC instanziiert wird. Das bedeutet, dass unser Code jetzt ein eindeutiges Ereignis registriert, wenn beide Tasten gleichzeitig gedrückt werden.

+1

Dies sollte Ihr Problem lösen, aber um weiter zu erläutern, warum es nicht funktioniert, hat 'event.KeyCode' nur einen Wert, also wird es niemals ** sowohl ** Keyboard.M' als auch' Keyboard.C' gleich sein. " – BadFeelingAboutThis

+0

Die geschweiften Klammern sind nicht erforderlich für einzelne Anweisung 'if's – BadFeelingAboutThis

+0

@BadFeelingAboutThis Dank. Bearbeitete meine Antwort zurück zum Original. Ich muss anfangen, das zu implementieren, damit ich wie ein Chef programmieren kann! –