2009-06-18 21 views
2

N.B.キーコードと文字コードの違いに注意してください。たとえば、数字1(1)と文字! (bang)の両方とも同じキーコードですが、異なる文字コードです。同様に、数字の行からの数字7と数値パッドからの数字7は異なるキーコードを持ちますが、同じ文字コードと異なります。ブラウザ用Adobe Flash/Flexのキーボードコードマッピング

私はAdobe Flexで音楽リズムゲームをプログラミングしており、キーボードのキーをバインドしたいと考えています。これは問題ではありませんが、A、S、D、Fにデフォルトのキーを設定し、ユーザーにこのことを伝えるなどの問題があります。

flash.ui.Keyboardのドキュメントを見ると、キーボードキーとキーコードの定数があることがわかります。ただし、これらはAdobe AIRでのみ使用でき、ブラウザでは使用できません。すべてのオペレーティングシステムとキーボードが似ているわけではないため、キーコードが異なる可能性があるので、これは理にかなっています。

キーコードを選択して祈る代わりに、意味を持つデフォルトのキーをどのように割り当てることができますか?

私の唯一のまともな考えはキーバインディングのための文字コードを格納し、私が何をマスコミにユーザーに伝えることができるように文字列のマッピングに文字コードを提供することです。 しかし、私の腸は、これは微妙な、またはあまりにも微妙な方法で壊れることを私に伝えます。 CAPSLOCKと似ています。

ありがとうございました。

更新:私は現在radekg's答えを使用していますが、これはまだ簡単に壊れると思います。私はこれが正しいことを説得してより快適に感じるでしょう。

答えて

2

Radekgがほとんど正しいです。

Flashには、LEFT、RIGHT、NUM_PAD、STANDARDの4つの静的プロパティを持つflash.ui.KeyLocationが組み込まれています。これは、キーボードが再マッピングされていても、どのキーが押されているかを明確に知ることができることを意味します。これをStringと組み合わせるとfromCharCode、この問題をむしろうまく解決できるはずです。

あなたの最終的なコードは次のようになります。私は認める

import flash.ui.KeyLocation; 
import flash.events.KeyboardEvent; 

function handleKeyboardEvent(event:KeyboardEvent) 
{ 
    // This will work for a majority of the keys. 
    var key:String = String.fromCharCode(event.charCode).toLowerCase(); 

    // Use strict comparison 
    if(event.keyLocation !== KeyLocation.STANDARD) 
    { 
     // The key is a number, then it needs to be re-identified. 
     if(event.keyLocation == KeyLocation.RIGHT ) key = "r" + key; 
     if(event.keyLocation == KeyLocation.LEFT )  key = "l" + key; 
     if(event.keyLocation == KeyLocation.NUM_PAD) key = "n" + key; 
    } 

    switch(key) 
    { 
     case "r1": 
      // Do something with the one which is not on the keypad. 
      break; 
     case "n.": 
      // Do something with the number pad's period. 
      break; 
     case "n": 
      // Do something with the letter N. 
      break; 
    } 
} 

、私はに、String.fromCharCodeとコントロールキー(ETC F1、Altキー、Ctrlキー、)で何が起こるか確かではないけど、KeyboardEventのはありませんサポートevent.shiftKey、event.ctrlKey、event.altKey

+0

KeyLocationで非常に創造的な答え!私はちょうどこれを行うための "かなり"方法がないことを受け入れなければならないと思う。 私はブラウザをターゲットにしているので、Flashはファンクションキーのフォーカスを取得しません(これは残念ですが、それを持っていると良いでしょう)。 –

+0

ExternalEvironment.call( "setFocus(" + Application.application.id + ");")を試しましたか? (私の構文がちょっとおかしいと私に許してください)。これは完璧とはかけ離れていますが、ブラウザにswf、つまり子コンポーネントのフォーカスを設定させることができます。 – cwallenpoole

4

Flash 8のドキュメントによれば、ASCIIコードを使用するだけで済みます。 Flash 8のドキュメントの以下のトピックを見てみましょう:

私の知る限り、すべての近代的なオペレーティング・システムの使用を意識していて標準ASCII。これらのコードは、Flash 5時代から変更されていません。 ASCIIコードに頼りたくない場合は、文字を比較する:

private function compareChar(code:Number):void { 
    if ("a" == String.fromCharCode(code).toLowerCase()) { 
     trace("A pressed"); 
    } else { 
     trace("You pressed " + String.fromCharCode(code)); 
    } 
} 
... 
compareChar(65); // 65 is A 
compareChar(96); // 96 is numpad 0 

しかし、私はASCIIコードに頼ることができると思います。 これが役立つことを願っています。

+0

私はあなたのevent.keyCodeの代わりにコードだと思う。私は誤ってStringクラスのドキュメントの代わりにStringグローバル関数ドキュメントを見つけたので、fromCharCodeが見つかりませんでした。また、私はLowCase()を使うとは思わなかったので、ありがとう。 –

+1

また、キーコードと文字コードの編集についても参照してください。 –

+0

これらの間違いを指摘していただきありがとうございます。 fromCharCodeについて - 誰でもすぐに確認したい場合は、docsへのURLです:http://livedocs.adobe.com/flex/3/langref/String.html#fromCharCode()。 String.fromCharCode(65)が "a"ではなく "A"を返すため、toLowerCase()が必要です。もちろん、条件を次のように変更することができます: if( "A" == String.fromCharCode(code))... – radekg

関連する問題