キーボード操作について
| ・ | キーが押されたか調べたい |
| ・ | キーコードの一覧表 |
| ・ | 2つのキーが同時に押されたか調べたい |
| ・ | キーが押された瞬間を調べたい |
| ・ | キーが離された瞬間を調べたい |
| ・ | キーが押されていないかを調べたい |
| ・ | キーを押してムービークリップを動かしたい |
| ・ | キーの配置の割り当てをしたい |
| ・ | キー入力を汎用的に使えるようにしたい |
キーボードが押されたか調べたい
サンプルをダウンロード
■ボタンイベントを使用する
on ハンドラの keyPress イベントを使用するとキーボードの入力を検出する事ができます。
タイピング風の受付となります。
ボタンイベントとしてボタンインスタンスに記述する事ができます。
Flash 6 以降であればムービークリップにも記述する事ができます。
"" の部分にアルファベットを指定するとそのキーが押されたときに実行されます。大文字を指定すると、Shiftキーと同時に押されたときに実行されます。
例) キーボードが押されたときに実行する
on( keyPress "a" ){
trace("A が押された");
}
on( keyPress "A" ){
trace("shift + A が押された");
}
■キーボード取得用のメソッドを使用する
キーボードが入力されたか調べるには、Key.isDown() メソッドを使用します。
引数に、キーコードを指定します。
例えば、 A キーが押されたか調べたいなら 65 を指定します。B キー が押されたか調べたいなら 66 を指定します。
指定したキーが押されていれば true が返ります。
Key.isDown ( キーコード );
| 第01引数 | キーコードを数値で指定 |
| 戻り値 | 押されていれば true、 押されていなければ false |
■キーボードの入力状態を常に監視する
ゲームでキーボードを使用する場合は、毎フレームごとにキーが押されているか押されていないかを調べる必要があります。
「onClipEvent ハンドラの enterFrame イベント」や「MovieClip クラスの onEnterFrame イベントハンドラ」中で、Key.isDown() メソッドを呼び出す事になります。
例) 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 イベント」や「MovieClip クラスの onKeyDown イベントハンドラ」中で、Key.isDown() メソッドを呼び出すといいでしょう。
例) 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.イベントリスナーに登録する
Key.addListener() を使用すると、オブジェクトがイベントを受け取ることができます。
これで、キーボードの入力があるたびに、コールバック関数が実行されるようになります。
通知を受け取るオブジェクトを登録
var key_obj = new Object ();
key_obj.onKeyDown = function(){}
key_obj.onKeyUp = function(){}
Key.addListener( key_obj );
4.登録したオブジェクトを解除
通知を止めたいときは、Key.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()で一応識別できるキーコードの一覧表です。(Windows 環境で確認)
| キー | keyCode |
| マウス左ボタン | 1 |
| マウス右ボタン | 2 |
| マウス中央ボタン | 4 |
2つのキーが同時に押されたか調べたい
サンプルをダウンロード
■2つのキーが同時に押されたか調べる
2つのキーが同時に押されたか調べるには if 文でそれぞれのキーの入力状態を調べます。
どちらも真であれば、同時に押されている事がわかります。
例えば、A キーと B キーが同時に押されているか調べたい場合は、以下のように if 文で入れ子にします。
例) 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 文で 『1フレーム前はキーが離されている』 かつ 『現在は押されている』 かを調べます。
この両方の条件を満たす場合、キーボードが押された瞬間である事がわかります。
例) 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フレーム前で押されていて、現在のフレームで押されていない状態と考える事ができます。
また、「キーが離しっぱなし」とはどういう状態でしょうか。
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 文で 『1フレーム前はキーが押されている』 かつ 『現在は離されている』 かを調べます。
この両方の条件を満たす場合、キーボードが押された瞬間である事がわかります。
例) 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 だったときに押されていない事がわかります。
下の例は、キーボードが1つでも押されているかを調べる関数です。false が返ってきたときは、どのキーも押されていない事がわかります。
下の例は、キーボードが1つでも押されているかを調べる関数です。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 イベント」や「MovieClip クラスの 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",
"Cancel",
"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. | 論理演算で処理 |
…という事で下のような処理を作ってみました。(Flash 5 ではエラーが出るのでコメントを削除してください。)
キーコード入力汎用関数
// ------------------------------------------------------
// 設定
// ------------------------------------------------------
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が押された");


