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イベントの確認用ページ
キーを押すと"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;
}