2017-01-25 8 views
-1

私はこの回答はlooking forであり、運がなかった。 One place I lookedは実際には非常に落胆した答えがありました。「マウスやキーボードのイベントを強制することはできません。マウスやキーボードから来なければなりません。as3特定のキーボードイベントを発送するには

Huh?

私は 'brute force'を試してこの解決策を思いついた。多分私はそれを間違って、または愚かにするつもりです。そこには良い方法がありますか?

私は、クラスを開始し、同じアクションを開始するスプライトをステージに配置したいというキーボードイベントがありました。スプライトをクリックするとキーボードイベント(エスケープキー)が起動します。イベントリスナー関数で

、私はイベントに電子自体traced

private function keys(e:KeyboardEvent):void { 
     trace("EscapeKey: ",e); 
     if (e.keyCode == 27) { 
     ...  
     } 
    } 

を出力は、私はその後、マウスクリックリスナーが値を使用して新しいKeyboardEventのを作成し、派遣していた

EscapeKey: [KeyboardEvent type="keyDown" bubbles=true cancelable=false eventPhase=2 charCode=27 keyCode=27 keyLocation=0 ctrlKey=false altKey=false shiftKey=false]  

ました私は上記のトレースから得た:

private function pauseClick(e:MouseEvent):void { 
     var a:KeyboardEvent = new KeyboardEvent("keyDown", true, false, 27, 27, 0, false, false, false); 
     stage.dispatchEvent(a); 
    } 

Presto!
この投稿は、これらのタイプのマウス/キーボードイベントの冗長性を探している他の人にとって便利な機能です。

EDIT ---コメントに要求された完全なクラス例:

package{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.MouseEvent; 
    import flash.events.KeyboardEvent; 

    public class KeyboardMouse extends Sprite { 
     private var pauseInfo:PauseInfo; 

     private var escapeKey:EscapeKey; 

     public function KeyboardMouse() { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 
     } 

     private function init(e:Event = null):void { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 

      stage.addEventListener(KeyboardEvent.KEY_DOWN, keys); 

      escapeKey = new EscapeKey(); 
      stage.addChild(escapeKey); 

      pauseInfo = new PauseInfo(); 
      pauseInfo.x = stage.stageWidth; 
      pauseInfo.y = stage.stageHeight; 
      pauseInfo.addEventListener(MouseEvent.CLICK,pauseClick); 
      addChild(pauseInfo); 
     } 

     private function keys(e:KeyboardEvent):void { 
      trace("KeyboardEvent ",e); 
      if (e.keyCode == 27) { // esc key 
       if (stage.contains(escapeKey)){ 
        trace("remove escape"); 
        escapeKey.visible = false; 
       } 
       else { 
        trace("show escape"); 
        escapeKey.visible = true; 
       } 
      } 
     } 

     private function pauseClick(e:MouseEvent):void { 
     // The trace in 'keys' gives this: 
     //[KeyboardEvent type="keyDown" bubbles=true cancelable=false eventPhase=2 charCode=27 keyCode=27 keyLocation=0 ctrlKey=false altKey=false shiftKey=false]  

      var a:KeyboardEvent = new KeyboardEvent("keyDown", true, false, 27, 27, 0, false, false, false); 
      stage.dispatchEvent(a); 
     } 
    } 
} 
+0

非常に興味深い、やや理解しにくい。この「冗長性」を示す短くてシンプルだが完全なプログラムを見せてもらえますか? – Craig

+0

興味深い!私はいつも 'pause()'のような共通の関数を使いました。そして、複数のイベントリスナーがその関数を呼び出すようにします。それはあなたのボートを浮かべるものは何でも私には簡単です。 –

+0

@Craigプレイヤーが一時停止ボタンをクリックしたときにゲームを一時停止させたいときや、マウスがウィンドウから外れるときや、プレイヤーがPキーを押したときにも、ゲームを一時停止させたいと思うと思います。これには3つの異なるイベントリスナーが必要です。したがってOPは彼の重要な報道機関が働いており、同じイベントを別のイベントリスナーから呼び出す方法を考え出しています。私は、すべてのイベントリスナーに同じ関数pause()を呼び出させるほうがずっと簡単だと思います。 –

答えて

0

+1彼のコメントのために@Neal Davisに大きな小道具!引数で両方のイベントのためにリスナーを持つ

彼が示唆するように

pauseInfo.addEventListener(MouseEvent.CLICK,keys); 
    stage.addEventListener(KeyboardEvent.KEY_DOWN, keys); 

    private function keys(e:Event):void { 
     trace("EscapeKey: ",e); 
     if (e.keyCode == 27) { 
     ...  
     } 
    } 

両方のリスナーがまだなければなりません:(E:イベント)同じ結果を達成するためのクリーナー、あまり複雑な方法ですしかし、ある時点で削除されていますが、もちろん、1つのリスナー関数だけが両方を処理しています。

0

さてさて、今、私はこれを取得。私はそれが目的ではない。また、コード内の迷惑なエラーもあると思います。

まず、1つのタイプのイベント(MouseEventなど)を別のもの(KeyboardEvent)として「キャスト」できることがわかりました。しかし、各イベントタイプ(ある時点ではメモリ管理目的で削除する必要がある)と新しく送出されたイベントに対して登録されたリスナー関数があるので、コードを厳密に最小化するわけではありません。正確には、このトリックの価値は何ですか? 1つのリスナー関数を複数のイベントタイプに登録するだけではどうですか?その関数内で使用すると、イベントの種類を区別し、このような行を持つ例えば、適宜なものを行うことができます。

 if(e.type == 'keyDown' || e.type == 'click') 

第二:あなたが言う:(stage.contains(escapeKey))場合、その後、あなたがしようescapeKeyの 'visible'プロパティをそれに依存するようにします。しかし、をescapeKey.visible = falseにすることで、ステージにまだescapeKeyが含まれているという事実は変わりません。したがって、 'else'条件が存在しないため、escapeKeyは再び表示されません。私の代わりに「escapeKey.visible = falseを」とし、「真escapeKey.visible =」を設定するのでは「にaddChild(escapeKey)」あなたは「のremoveChild(escapeKey)を」言いたいことを信じて、その後。それから、あなたは私があなたが望んでいると思っていることはほとんどありません。

+0

「可視性」は、エスケープが押されたときのものの(悪い)例でした。私はちょうど "..."や "//ここで何か"と書いたことがあります。 私がこの解決策を思いついたのは、キープレスをシミュレートする方法が見つからなかったからです。 MouseEventはe:MouseEventの引数で処理し、KeyboardEventはe:KeyboardEventで処理する必要があるという印象を受けました。 e:Eventを使って両方のイベントを処理することは、私の実際の質問に対する答えです。「良い方法はありますか?」 – Chowzen

関連する問題