[PR]テレビ番組表
今夜の番組チェック




キーボードが押されたか調べたい



サンプルをダウンロード






■ボタンイベントを使用する


ボタンイベントとしてボタンインスタンスに記述する方法です。Flash 6 以降はムービークリップにも記述する事が可能です。アクションスクリプト補助入力機能を使って簡単に書き込む事ができます。タイピング風の受付となります。

"" 部分にアルファベットを指定するとそのキーが押されたときに実行されます。大文字を指定すると、Shiftキーと同時に押されたときに実行されます。


例) キーボードが押されたときに実行する

on( keyPress "a" ){
	trace("A が押された");
}

on( keyPress "A" ){
	trace("shift + A が押された");
}






■キーボード取得用のメソッドを使用する


キーボードが入力されたか調べるには、Key.isDown() メソッドを使用します。


Key.isDown ( キーコード );
第01引数 キーコードを数値で指定
返り値 押されていれば true、 押されていなければ false


引数に、キーコードを指定します。例えば Aキー なら 65 、Bキー なら 66 を指定します。キーコード一覧をこちらでまとめていますので参考にしてください。そのキーが押されていれば true が、押されていなければ false が返ってきます。





ゲームで使うには毎フレーム押されているか押されていないか調べる必要があるので、onClipEvent (enterFrame)onEnterFrame イベント中に呼び出す事になります。


例) A キーが押されたか調べる

onClipEvent (enterFrame) {

	if(Key.isDown( 65 )){
		trace("A キーが押された");
	}else{
		trace("A キーが押されていない");
	}

	if(Key.isDown( Key.SPACE )){
		trace("スペースキーが押された");
	}else{
		trace("スペースキーが押されていない");
	}

}

例) A キーが押されたか調べる (Flash 6 以降)

onEnterFrame = function(){

	if(Key.isDown( 65 )){
		trace("A キーが押された");
	}else{
		trace("A キーが押されていない");
	}

	if(Key.isDown( Key.SPACE )){
		trace("スペースキーが押された");
	}else{
		trace("スペースキーが押されていない");
	}
}





タイピング風に取得したいのであれば、onClipEvent (keyDown)onKeyDown イベント中に呼び出すと良いでしょう。


例) A キーが押されたか調べる

onClipEvent (keyDown) {

	if(Key.isDown( 65 )){
		trace("A キーが押された");
	}

	if(Key.isDown( Key.SPACE )){
		trace("スペースキーが押された");
	}

}

例) A キーが押されたか調べる (Flash 6 以降)

onKeyDown = function(){

	if(Key.isDown( 65 )){
		trace("A キーが押された");
	}

	if(Key.isDown( Key.SPACE )){
		trace("スペースキーが押された");
	}
}





また、最後に押されたキーのキーコードを調べるには、Key.getCode() メソッドを使用します。


例)最後に押されたキーのキーコードを調べる

onClipEvent (keyDown) {

	trace( Key.getCode() );

}

例)最後に押されたキーのキーコードを調べる (Flash 6 以降)

onKeyDown = function(){

	trace( Key.getCode() );

}








■キーイベントリスナーを使って調べる(Flash 6 以降)


キーイベントリスナーを使用すると、キーボードを押したり離したりするタイミングでコールバック関数を呼び出してくれます。キーの入力はタイピング風になります。

他のイベントにも同じような機能があるので わざわざこのイベントリスナーという機能を使う必要性は感じられませんが、気にせず使用方法を見ていくことにしましょう。





1.オブジェクトを作成


ここでは、key_obj という名前を付けます。


オブジェクト作成

var key_obj = new Object ();





2.オブジェクトに関数を登録


オブジェクトにコールバック関数を登録します。以下のプロパティ名に関数の登録が可能です。


プロパティ名 解説
onKeyDown キーが押されたときに呼び出されます
onKeyUp キーが離された時に呼び出されます



オブジェクトに関数を登録

var key_obj = new Object ();

key_obj.onKeyDown = function(){
	trace("キーを押した");
}

key_obj.onKeyUp = function(){
	trace("キーを離した");
}


どのキーが押されたか調べるにはこの関数の中で、Key.getCode() メソッドを呼び出して取得します。


オブジェクトに関数を登録

var key_obj = new Object ();

key_obj.onKeyDown = function(){
	trace(Key.getCode()  + "キーを押した");
}

key_obj.onKeyUp = function(){
	trace(Key.getCode() + "キーを離した");
}







3.イベントリスナーに登録する


最後に addListener() を使用してリスナーにオブジェクトを登録します。


通知を受け取るオブジェクトを登録

var key_obj = new Object ();
key_obj.onKeyDown = function(){}
key_obj.onKeyUp = function(){}

Key.addListener( key_obj );





4.登録したオブジェクトを解除


止めたいときには、removeListener () を使用してオブジェクトを外します。


通知を受け取るオブジェクトを解除

var key_obj = new Object ();
key_obj.onKeyDown = function(){}
key_obj.onKeyUp = function(){}
Key.addListener( key_obj );

Key.removeListener( key_obj );






キーコードの一覧表



サンプルをダウンロード




■キーコードの一覧表


Key.isDown() メソッドでキーを指定するときに必要なキーコードの一覧です。

SHIFT キーが押されたか調べる

var code = Key.SHIFT;
if(Key.isDown(code)){
	trace(""SHIFT キーが押された");
}





A〜Z、0〜9までのキーコードの一覧表です。


キー keyCode
0 48
1 49
2 50
3 51
4 52
5 53
6 54
7 55
8 56
9 57
A 65
B 66
C 67
D 68
E 69
F 70
G 71
H 72
I 73
J 74
K 75
L 76
M 77
N 78
O 79
P 80
Q 81
R 82
S 83
T 84
U 85
V 86
W 87
X 88
Y 89
Z 90


テンキーのキーコードの一覧表です。


キー keyCode
0 96
1 97
2 98
3 99
4 100
5 101
6 102
7 103
8 104
9 105
* 106
+ 107
Enter 108
- 109
. 110
/ 111


ファンクションキーのキーコードの一覧表です。


キー keyCode
F1 112
F2 113
F3 114
F4 115
F5 116
F6 117
F7 118
F8 119
F9 120
F10 121
F11 122
F12 123
F13 124
F14 125
F15 126


その他のキーコードの一覧表です。


キー keyCode
BackSpace 8
Tab 9
Clear 12
Enter 13
Shift 16
Ctrl 17
Alt 18
CapsLock 20
Esc 27
スペースバー 32
PageUp 33
PageDown 34
End 35
Home 36
← (左矢印) 37
↑ (上矢印) 38
→ (右矢印) 39
↓ (下矢印) 40
Insert 45
Delete 46
Help 47
NumLock 144
: * 186
; + 187
, < 188
- = 189
. > 190
/ ? 191
@ ` 192
[ { 219
\ | 220
] } 221
^ ~ 222


キーコードの定数一覧表です。


キー プロパティ
BackSpace Key.TAB
Enter Key.ENTER
Shift Key.SHIFT
Ctrl Key.CONTROL
CapsLock Key.CAPSLOCK
Esc Key.ESCAPE
スペースバー Key.SPACE
PgUP Key.PGUP
PgDn Key.PGDN
End Key.END
Home Key.HOME
← (左矢印) Key.LEFT
↑ (上矢印) Key.UP
→ (右矢印) Key.RIGHT
↓ (下矢印) Key.DOWN
Insert Key.INSERT
Delete Key.DELETEKEY




Key.isDown()で一応識別できるキーコードの一覧表です。(Win環境で確認)


キー keyCode
マウス左ボタン 1
マウス右ボタン 2
マウス中央ボタン 4








2つのキーが同時に押されたか調べたい



サンプルをダウンロード




■2つのキーが同時に押されたか調べる


2つのキーが同時に押されたか調べるには if 文で2回キーが押されているか調べてどちらも真である事を調べます。 例えば、A キーと B キーが同時に押されているか調べたい場合は以下のようになります。


例) A キー と B キーが同時に押されたか調べる

if(Key.isDown( 65 )){
	if(Key.isDown( 66 )){
		trace(" A キーと B キーが同時に押された");
	}
}




比較演算子を使って AND 条件で調べる事も可能です。


例) A キー と B キーが同時に押されたか調べる

if(Key.isDown( 65 ) && Key.isDown( 66 )){
	trace(" A キーと B キーが同時に押された");
}





■2つのキーのどちらでもいいのでとにかく押されたか調べる


2つのキーのどちらが押されてもよしとする場合は、比較演算子の OR 条件を使います。


例) A キー と B キーどちらかが押された事を調べる

if(Key.isDown( 65 ) || Key.isDown( 66 )){
	trace(" A キーと B キーのどちらかがとにかく押された");
}






キーが押された瞬間を調べたい



サンプルをダウンロード




■キーボードが押された瞬間の判定


キーが押された瞬間とは、1フレーム前で押されていなくて、今回のフレームで押されている状態と考える事ができます。 1フレーム前で押されていて、今回のフレームでも押されている場合は押しっぱなしの状態といえます。


という事で、まず、押したいキーの入力状態を毎フレーム変数に保存しておきます。


例) A キーの入力を変数に格納

onClipEvent (load) {
	key_a = 0;
}

onClipEvent (enterFrame) {
	key_a = Key.isDown( 65 );
}

例) A キーの入力を変数に格納 (Flash 6 以降)

var key_a = 0;

onEnterFrame = function(){
	key_a = Key.isDown( 65 );
}




そして、if 文で 『 前回はキーが押されていない 』 かつ 『 今回は押されている 』 かを調べます。


例) A キーが押された瞬間を調べる

onClipEvent (load) {
	key_a = 0;
}

onClipEvent (enterFrame) {
	if(!key_a && Key.isDown( 65 )){
		trace("A キーが押された");
	}

	key_a = Key.isDown( 65 );
}

例) A キーが押された瞬間を調べる (Flash 6 以降)

var key_a = 0;

onEnterFrame = function(){
	if(!key_a && Key.isDown( 65 )){
		trace("A キーが押された");
	}

	key_a = Key.isDown( 65 );
}


押した瞬間をトリガーと呼んだりします。拳銃の引き金みたいな物ですね。






キーが離された瞬間を調べたい



サンプルをダウンロード




■キーボードが離された瞬間の判定


キーが離された瞬間とは、1フレーム前で押されていて、今回のフレームで押されていない状態と考える事ができます。


という事で、まず、押したいキーの入力状態を毎フレーム変数に保存しておきます。


例) A キーの入力を変数に格納

onClipEvent (load) {
	key_a = 0;
}

onClipEvent (enterFrame) {
	key_a = Key.isDown( 65 );
}

例) A キーの入力を変数に格納 (Flash 6 以降)

var key_a = 0;

onEnterFrame = function(){
	key_a = Key.isDown( 65 );
}




そして、if 文で 『 前回はキーが押されている 』 かつ 『 今回は押されていない 』 かを調べます。


例) A キーが離された瞬間を調べる

onClipEvent (load) {
	key_a = 0;
}

onClipEvent (enterFrame) {
	if(key_a && !Key.isDown( 65 )){
		trace("A キーが離された");
	}

	key_a = Key.isDown( 65 );
}

例) A キーが離された瞬間を調べる (Flash 6 以降)

var key_a = 0;

onEnterFrame = function(){
	if(key_a && !Key.isDown( 65 )){
		trace("A キーが離された");
	}

	key_a = Key.isDown( 65 );
}






キーが押されていない事を調べたい



サンプルをダウンロード




■キーが押されていない事を調べたい


キーコード表で対応しているキーをKey.isDown() メソッドを使って順番に調べていきます。すべての結果が false だったときに押されていない事がわかります。

下の例では、キーボードが押されているかを調べる関数を作ってみました。false が返ってきたときは、どのキーも押されていない事がわかります。


例) 何かキーが押されたか調べる関数

function KeyPushCheck(){
	var i;
	
	for(i=7;i<126;i++){
		if(Key.isDown(i))	return true;
	}

	for(i=143;i<145;i++){
		if(Key.isDown(i))	return true;
	}
	
	for(i=185;i<223;i++){
		if(Key.isDown(i))	return true;
	}

	return false;
}






キーを押してムービークリップを動かしたい



サンプルをダウンロード




■キーを押してムービークリップを動かしたい


実際にキーボードを押してムービークリップを動かしてみましょう。
まずは、単純な所から、

上キーが押されたらムービークリップを上に少し移動
下キーが押されたらムービークリップを下に少し移動
右キーが押されたらムービークリップを右に少し移動
左キーが押されたらムービークリップを左に少し移動

するようにしてみます。


例)キーが押されたらムービークリップ "mc" を少し動かす

if (Key.isDown(Key.UP)) {
	mc._y -= 10;	// 上に移動
}

if (Key.isDown(Key.DOWN)) {
	mc._y += 10;	// 下に移動
}

if (Key.isDown(Key.LEFT)) {
	mc._x -= 10;	// 左に移動
}

if (Key.isDown(Key.RIGHT)) {
	mc._x += 10;	// 右に移動
}





この一連のプログラムを毎フレーム処理すれば、キーボードが押されている間は、ムービークリップも動き続けるので、キーボードを使った移動の表現ができます。

という事で onClipEvent (enterFrame)onEnterFrame の中に処理を記述します。


例)キーが押されている間 ムービークリップを動かす

onClipEvent (enterFrame) {

	if (Key.isDown(Key.UP))	_y -= 10;	// 上に移動
	if (Key.isDown(Key.DOWN))	_y += 10;	// 下に移動
	if (Key.isDown(Key.LEFT))	_x -= 10;	// 左に移動
	if (Key.isDown(Key.RIGHT))	_x += 10;	// 右に移動

}

例)キーが押されている間 ムービークリップ "mc" を動かす (Flash 6 以降)

mc.onEnterFrame = function(){

	if (Key.isDown(Key.UP))	mc._y -= 10;	// 上に移動
	if (Key.isDown(Key.DOWN))	mc._y += 10;	// 下に移動
	if (Key.isDown(Key.LEFT))	mc._x -= 10;	// 左に移動
	if (Key.isDown(Key.RIGHT))	mc._x += 10;	// 右に移動

}





さらに加速や減速を駆使してより滑らかな移動を実現したい人はこちらで解説していますので参考にどうぞ。






キーボードの配置の割り当てをしたい



サンプルをダウンロード




■割り当てを実現するために


ユーザーにキー操作の変更をしてもらえる、キーコンフィグ機能を追加してみたいと思います。 今回は、上で解説した『キーを押してムービークリップを動かしたい』を改造して実現みることにします。





■キーコード指定している部分を変数に置き換える


下のスクリプトは、ムービークリップをキー入力を使って動かしている処理です。このスクリプトでは、Key.isDown()メソッドの引数に直値でキーコードを指定しています。


例)キーが押されたらムービークリップ "mc" を少し動かす

if (Key.isDown(Key.UP)) {
	mc._y -= 10;	// 上に移動
}

if (Key.isDown(Key.DOWN)) {
	mc._y += 10;	// 下に移動
}

if (Key.isDown(Key.LEFT)) {
	mc._x -= 10;	// 左に移動
}

if (Key.isDown(Key.RIGHT)) {
	mc._x += 10;	// 右に移動
}


この引数部分をすべて変数に置き換えてみましょう。ここでは、上、下、左、右と4つのキーを使用しているので、4つの変数を作成します。


キーコード部分を変数に置き換えた例

onClipEvent (load) {
	key_up = Key.UP;
	key_down = Key.DOWN;
	key_left = Key.LEFT;
	key_right = Key.RIGHT;
}

onClipEvent (enterFrame) {

	if (Key.isDown(key_up))	_y -= 10;	// 上に移動
	if (Key.isDown(key_down))	_y += 10;	// 下に移動
	if (Key.isDown(key_left))	_x -= 10;	// 左に移動
	if (Key.isDown(key_right))	_x += 10;	// 右に移動

}

キーコード部分を変数に置き換えた例 (Flash 6 以降)

var key_up = Key.UP;
var key_down = Key.DOWN;
var key_left = Key.LEFT;
var key_right = Key.RIGHT;

mc.onEnterFrame = function(){

	if (Key.isDown(key_up))	_y -= 10;	// 上に移動
	if (Key.isDown(key_down))	_y += 10;	// 下に移動
	if (Key.isDown(key_left))	_x -= 10;	// 左に移動
	if (Key.isDown(key_right))	_x += 10;	// 右に移動

}


後は、キーコードが格納された変数を好きなキーコードに変更するだけで、いつでもキーボード操作を変更する事ができます。例えば W、S、A、D、という操作に変更したい場合は、下のようにすると良いでしょう。


変数に格納されえいるキーコードを変更して操作を変更する

key_up = 87;	// W
key_down = 83;	// S
key_left = 65;	// A
key_right = 68;	// D





■ユーザーにキーを押してもらって変更する


ユーザーに変更したいキーを押して貰いたいときは、Key.getCode() メソッドを使用します。最後に押されたキーのキーコードを取得する事ができます。


例)上のキーコードを変更する

onClipEvent (keyDown) {
	key_up = Key.getCode();
}

例)上のキーコードを変更する (Flash 6 以降)

onKeyDown = function(){
	key_up = Key.getCode();
}









■キーコードがどこのキーを表しているのか文字で取得する


押されたキーがどこのキーなのかを調べたいと思います。

まず、250個くらいの配列を用意して該当する 『 キーコードの番地 』 に 『 キーの意味する文字列のデータ 』 を入れておきます。


例)キーコードの情報が格納された配列

var KeyName = [
	"",
	"Mouse L", 
	"Mouse R", 
	"", 
	"Mouse M", 
	"", 
	"", 
	"", 
	"BackSpace", 
	"Tab",
	"", 
	"", 
	"Clear", 
	"Enter", 
	"", 
	"", 
	"Shift", 
	"Ctrl", 
	"Alt",
	"Pause", 
	"CapsLock",
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"Esc", 
	"", 
	"",
	"", 
	"", 
	"Space", 
	"PageUp", 
	"PageDown", 
	"End", 
	"Home", 
	"Left", 
	"Up", 
	"Right",
	"Down",
	"", 
	"",
	"", 
	"PrtSc", 
	"Insert", 
	"Delete", 
	"Help", 
	"0",
	"1",
	"2",
	"3",
	"4",
	"5",
	"6",
	"7",
	"8",
	"9",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"A",
	"B",
	"C",
	"D",
	"E",
	"F",
	"G",
	"H",
	"I",
	"J",
	"K",
	"L",
	"M",
	"N",
	"O",
	"P",
	"Q",
	"R",
	"S",
	"T",
	"U",
	"V",
	"W",
	"X",
	"Y",
	"Z",
	"",
	"",
	"",
	"",
	"",
	"Ten 0", 
	"Ten 1", 
	"Ten 2",
	"Ten 3", 
	"Ten 4", 
	"Ten 5", 
	"Ten 6", 
	"Ten 7", 
	"Ten 8",
	"Ten 9",
	"*", "+", 
	"Enter", 
	"-", 
	".", 
	"/", 
	"F1",
	"F2", 
	"F3", 
	"F4", 
	"F5", 
	"F6", 
	"F7", 
	"F8", 
	"F9", 
	"F10", 
	"F11", 
	"F12", 
	"F13", 
	"F14", 
	"F15", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"NumLock", 
	"ScrLk", 
	"", 
	"", 
	"", 
	"", 
	"",
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	": *", 
	"; +", 
	", <", 
	"- =", 
	". >", 
	"/ ?", 
	"@ `", 
	"", 
	"", 
	"", 
	"",
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"[ {", 
	"\\|",
	"] }", 
	"^ ~", 
	"",
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	"", 
	""
];


調べたいキーコードがあれば、配列の番地に格納されている文字列を取り出します。


例)上に格納されているキーコードの意味を調べる

trace( KeyName[key_up] );






キー入力を汎用的に使えるようにしたい



サンプルをダウンロード




■キー入力を汎用的に使えるようにしたい


Flash ゲームとしてキーボード入力を使いこなす為に、汎用的に使いまわせる入力システムを作成してみたいと思います。
必要な機能として、以下の3点をサポートする事にします。

1.プレイヤー番号ごとに入力情報を分ける。
2.通常入力、押した瞬間、離した瞬間、キーボード風入力(メニュー)の4種類の入力
3.論理演算で処理


…という事で下のような処理を作ってみました。(エラーが出る場合コメントを削除してください。)


キーコード入力汎用関数

// ------------------------------------------------------
// 設定
// ------------------------------------------------------
var MENU_FIRST_WAIT = 6;	// 押しっぱなしで1回受け付けてから繰り返し入力が始まるまでの待機時間
var MENU_LOOP_WAIT = 2;	// 押しっぱなしで繰り返し入力する時間隔


// ------------------------------------------------------
// キーコード (配列を増減すれはプレイヤー数とキー数を変更可能、キー数と順序は各プレイヤーごとに一致させる、キー数は最大32個まで
// ------------------------------------------------------
var KeyCode = [

	// PLAYER1
	[
		Key.UP,		// 上
		Key.DOWN,		// 下
		Key.LEFT,		// 左
		Key.RIGHT,		// 右
		74,		// A
		75,		// B
		32		// ポーズ
	],

	// PLAYER2
	[
		69,		// 上
		68,		// 下
		83,		// 左
		70,		// 右
		74,		// A
		75,		// B
		32		// ポーズ
	],

	// PLAYER3
	[
		0x31,		// 上
		0x32,		// 下
		0x33,		// 左
		0x34,		// 右
		0x35,		// A
		0x36,		// B
		0x37		// ポーズ
	],

	// PLAYER4
	[
		69,		// 上
		68,		// 下
		83,		// 左
		70,		// 右
		74,		// A
		75,		// B
		32		// ポーズ
	]

];
// 総プレイヤー数
var KEY_PLAYER_NUM = KeyCode.length;



// ------------------------------------------------------
// キーフラグ (上の配列にあるキー数分作成する)
// ------------------------------------------------------
var KEY_UP		= 0x0001;		// 上
var KEY_DOWN	= 0x0002;		// 下
var KEY_LEFT	= 0x0004;		// 左
var KEY_RIGHT	= 0x0008;		// 右
var KEY_A		= 0x0010;		// 攻撃A
var KEY_B		= 0x0020;		// 攻撃B
var KEY_PAUSE	= 0x0040;		// ポーズ


// 処理しやすいようにキーフラグを配列に格納しておく
var KeyBitArray = [
	KEY_UP,
	KEY_DOWN,
	KEY_LEFT,
	KEY_RIGHT,
	KEY_B,
	KEY_A,
	KEY_PAUSE
];
var KEY_CODE_ARRAY_MAX = KeyBitArray.length;


// ------------------------------------------------------
// キーワークを初期化する関数
// ------------------------------------------------------
var KeyWork = new Array();

function KeyWorkInitalize(){
	var i;
	for(i=0;i < KEY_PLAYER_NUM;i++){
		KeyWork[i] = {
			dat:0,	// 通常の入力
			trg:0,	// 押した瞬間の入力
			tog:0,	// 離した瞬間の入力
			menu:0,	// タイピング風入力
			
			// ここから内部で使用
			pre_count:0,
			menu_count:0
		};
	}
}


// ------------------------------------------------------
// キーワークを毎フレーム処理する関数
// ------------------------------------------------------
function KeyWorkExecute(){
	var i,j;
	// プレイヤー人数分繰り返す
	for(j=0;j < KEY_PLAYER_NUM;j++){
		
		var work = KeyWork[j];
		var code = KeyCode[j];
		
		for(i=0;i < KEY_CODE_ARRAY_MAX;i++){
		
			work.trg &= ~KeyBitArray[i];
			work.tog &= ~KeyBitArray[i];
			work.menu &= ~KeyBitArray[i];
		
			// キーが押された
			if(Key.isDown(code[i])){

				// 前回押されてなければトリガー
				if(!(work.dat & KeyBitArray[i])){
					work.trg |= KeyBitArray[i];

					// 押しっぱなし開始
					work.pre_count = MENU_FIRST_WAIT;
					work.menu_count = MENU_LOOP_WAIT;
					work.menu |= KeyBitArray[i];

				}
				
				// 押しっぱなし繰り返し入力
				if(--work.pre_count < 0){
					work.pre_count = 0;
					if(--work.menu_count < 0){
						work.menu |= KeyBitArray[i];
						work.menu_count = MENU_LOOP_WAIT;
					}
				}

				work.dat |= KeyBitArray[i];
			}else{
				
				// 前回押されていればトグル
				if(work.dat & KeyBitArray[i]){
					work.tog |= KeyBitArray[i];
				}
	
				work.dat &= ~KeyBitArray[i];
			}
		}
	}
}





■使い方


2つの関数 KeyWorkInitalize() と KeyWorkExecute() というのがあります。 KeyWorkInitalize() 関数は、使用開始時に一度だけ呼び出して初期化します。KeyWorkExecute() 関数は、毎フレーム呼び出します。


キーコード入力汎用関数を使ってみる

onClipEvent (load) {
	_root.KeyWorkInitalize();
}
onClipEvent (enterFrame) {
	_root.KeyWorkExecute();
}

キーコード入力汎用関数を使ってみる(Flash 6 以降)

KeyWorkInitalize();

onEnterFrame = function(){
	KeyWorkExecute();
}


さらに KeyWork という_root に定義された配列があります。この番地ごとに各プレイヤー番号のキーデータが格納されたオブジェクトが入っています。


キーデータが格納されているワーク

// プレイヤー1
KeyWork[0].dat;
KeyWork[0].trg;
KeyWork[0].tog;
KeyWork[0].menu;

// プレイヤー2
KeyWork[1].dat;
KeyWork[1].trg;
KeyWork[1].tog;
KeyWork[1].menu;

// プレイヤー3
KeyWork[2].dat;
KeyWork[2].trg;
KeyWork[2].tog;
KeyWork[2].menu;

// プレイヤー4
KeyWork[3].dat;
KeyWork[3].trg;
KeyWork[3].tog;
KeyWork[3].menu;


キーデータは論理演算を使用してアクセスします。論理演算についてはこちらを参考にどうぞ。例えば、通常の入力データは以下のようにして調べる事ができます。


通常入力で各キーが押されているか調べる

// プレイヤー1の通常入力
var dat = KeyWork[0].dat;

if(dat & KEY_UP)	trace("上が押された");
if(dat & KEY_DOWN)	trace("下が押された");
if(dat & KEY_LEFT)	trace("左が押された");
if(dat & KEY_RIGHT)	trace("右が押された");
if(dat & KEY_A)	trace("Aが押された");
if(dat & KEY_B)	trace("Bが押された");
if(dat & KEY_PAUSE)	trace("PAUSEが押された");

if(!dat)		trace("何も押されていない");


トリガー入力は以下のようにして調べる事ができます。


通常入力で各キーが押されているか調べる

// プレイヤー1の通常入力
var trg = KeyWork[0].trg;

if(trg & KEY_UP)	trace("上が押された");
if(trg & KEY_DOWN)	trace("下が押された");
if(trg & KEY_LEFT)	trace("左が押された");
if(trg & KEY_RIGHT)	trace("右が押された");
if(trg & KEY_A)	trace("Aが押された");
if(trg & KEY_B)	trace("Bが押された");
if(trg & KEY_PAUSE)	trace("PAUSEが押された");


トグル入力は以下のようにして調べる事ができます。


通常入力で各キーが押されているか調べる

// プレイヤー1の通常入力
var tog = KeyWork[0].tog;

if(tog & KEY_UP)	trace("上が押された");
if(tog & KEY_DOWN)	trace("下が押された");
if(tog & KEY_LEFT)	trace("左が押された");
if(tog & KEY_RIGHT)	trace("右が押された");
if(tog & KEY_A)	trace("Aが押された");
if(tog & KEY_B)	trace("Bが押された");
if(tog & KEY_PAUSE)	trace("PAUSEが押された");


メニュー風入力は以下のようにして調べる事ができます。


通常入力で各キーが押されているか調べる

// プレイヤー1の通常入力
var menu = KeyWork[0].menu;

if(menu & KEY_UP)	trace("上が押された");
if(menu & KEY_DOWN)	trace("下が押された");
if(menu & KEY_LEFT)	trace("左が押された");
if(menu & KEY_RIGHT)	trace("右が押された");
if(menu & KEY_A)	trace("Aが押された");
if(menu & KEY_B)	trace("Bが押された");
if(menu & KEY_PAUSE)	trace("PAUSEが押された");





同時押しの判定には、あらかじめマスク用のビットを作っておくとよいでしょう。


AとBが同時に押されているか調べる

var KEY_RESET = KEY_A | KEY_B | KEY_PAUSE;	// リセット用キー(A+B+PAUSE)

// プレイヤー1の通常入力
var dat = KeyWork[0].dat;

if((dat & KEY_RESET) == KEY_RESET){
	trace("A+B+PAUSEが同時に押された");
}
if(dat & KEY_RESET){
	trace("A+B+PAUSEのどれかが押された");
}





また、キーが格納された変数にマスクをかける事で、操作不能にしたりなんかも簡単に出来ます。上下左右のビットを入れ換えて混乱状態を表現するのもいいですね。


方向キーを操作不能にする

var KEY_DIR = KEY_UP | KEY_DOWN | KEY_LEFT | KEY_RIGHT;	// 方向用キー(上+下+左+右)

// プレイヤー1の通常入力
var dat = KeyWork[0].dat;

dat &= ~KEY_DIR;	// 方向のビット部分をクリア

if(dat & KEY_UP)	trace("上が押された");
if(dat & KEY_DOWN)	trace("下が押された");
if(dat & KEY_LEFT)	trace("左が押された");
if(dat & KEY_RIGHT)	trace("右が押された");
if(dat & KEY_A)	trace("Aが押された");
if(dat & KEY_B)	trace("Bが押された");
if(dat & KEY_PAUSE)	trace("PAUSEが押された");


上下左右キーを入れ換える

var KEY_DIR = KEY_UP | KEY_DOWN | KEY_LEFT | KEY_RIGHT;	// 方向用キー(上+下+左+右)

// プレイヤー1の通常入力
var dat = KeyWork[0].dat;
var tmp = 0;

// 上下左右を入れ換える
if(dat & KEY_UP)	tmp |= KEY_DOWN;
if(dat & KEY_DOWN)	tmp |= KEY_UP;
if(dat & KEY_LEFT)	tmp |= KEY_RIGHT;
if(dat & KEY_RIGHT)	tmp |= KEY_LEFT;

// 方向部分のビットをクリアしてから入れ換えたキー情報で置き換える
dat = (dat & ~KEY_DIR) | tmp;	

if(dat & KEY_UP)	trace("上が押された");
if(dat & KEY_DOWN)	trace("下が押された");
if(dat & KEY_LEFT)	trace("左が押された");
if(dat & KEY_RIGHT)	trace("右が押された");
if(dat & KEY_A)	trace("Aが押された");
if(dat & KEY_B)	trace("Bが押された");
if(dat & KEY_PAUSE)	trace("PAUSEが押された");