Key.onKeyUpイベントが受取れない[Flash 8] [Edit]

Flash Player 8でパブリッシュしたSWFにおいて、確認された問題です。Key.onKeyUpイベントを受取れないことがあります。

問題は、複数のキーを同時におした場合です。たとえば、[a]と[b]のふたつのキーで、つぎの操作を行ってみます。

■テストパターン1
[1] [a]キーを押します。
[2] [a]キーは押したまま,続けて[b]キーを押します。
[3] 両方のキーを押した状態から、[b]キーを放します。
[4] 残った[a]キーを放します。

このとき、[4]の[a]キーのKey.onKeyUpイベントが発生しません。つぎに、もうひとつのパターンです。

■テストパターン2
[1] [a]キーを押します。
[2] [a]キーは押したまま,続けて[b]キーを押します。
[3] 両方のキーを押した状態から、[a]キーを放します。
[4] 残った[b]キーを放します。

このとき、[3]の[a]キーのKey.onKeyUpイベントが発生しません。つまり、複数のキーを押した状態にしてしまうと、Key.onKeyDownイベントはそれぞれ発生させることができても、Key.onKeyUpイベントは最後に押したキーしか呼出せないようです。

Flash Player 7でパブリッシュすれば、Key.onKeyUpイベントは正しく呼出されます。テスト用のSWFとそのサンプルスクリプトは、つぎのとおりです。

テストページには、Flash Player 8とFlash Player 7でそれぞれパブリッシュした同じファイルのSWFが埋込まれています。どちらかをマウスでクリックして、フォーカスを移してからお試しください。

図001■Keyイベントの確認用ページ
FN051013-001.gif

キーを押すと"down: キー番号"、放すと"up: キー番号"という文字が、TextAreaに表示されます。Flash Player 8書出しのSWFで試すと、Flash Player 7書出しのSWFでは表示されるイベントのテキストが表れません(図001)。

// Flash Player 7書出しの正しい表示
// テストパターン1
down: 65
down: 66
up: 66
up: 65 ←Flash Player 8書出しでは表示されない
// テストパターン2
down: 65
down: 66
up: 65 ←Flash Player 8書出しでは表示されない
up: 66

スクリプト001■テスト用
// タイムライン: _root
// 第1フレームアクション
var my_ta:mx.controls.TextArea;
var oKeyListener:Object = new Object();
Key.addListener(oKeyListener);
oKeyListener.onKeyDown = function() {
  var nKey:Number = Key.getCode();
  if (!this.xIsLastPressed(nKey)) {
    xSetText("down", nKey);
    this.nPrevKey = nKey;
  }
};
oKeyListener.onKeyUp = function() {
  var nKey:Number = Key.getCode();
  xSetText("up", nKey);
  if (this.xIsLastPressed(nKey)) {
    delete this.nPrevKey;
  }
};
oKeyListener.xIsLastPressed = function(nKey:Number):Boolean {
  return (nKey == this.nPrevKey);
};
function xSetText(event_str:String, nKey:Number):Void {
  my_ta.text += event_str+": "+nKey.toString()+newline;
}

その他の記事