ActionScript 3.0で始めるオブジェクト指向スクリプティング

第15回 配列を使ったキーコードとプロパティの扱い

この記事を読むのに必要な時間:およそ 4 分

前回の第14回キー操作とif以外の条件判定では,switchステートメントでキーコードを判定した。今回は,配列とも呼ばれるArrayクラスを使って,条件判定なしにキーコードの処理を行ってみよう。

配列と配列エレメントの扱い

Arrayクラスのインスタンスは「配列」とも称され,複数の値をひとつのインスタンスに納められる。いわば容れ物のような機能をもったインスタンスだ。納められた各値は,配列の要素とか「エレメント」という。配列エレメントには,0から始まる整数の整理番号がつけられて,管理される。この番号は,「インデックス」と呼ばれる。

配列インスタンスは,Dateクラスと同じく,new演算子を使って生成する。そして,値を加えるには,配列アクセス演算子[ ] でインデックスを指定し,値を代入する。たとえば,新規のArrayインスタンス(配列)のインデックス0に文字列"日曜日"を納めるには,つぎのようなスクリプトを記述すればよい。

var my_array:Array = new Array();
my_array[0] = "日曜日";
trace(my_array[0]);   // 出力: 日曜日

なお,Arrayインスタンスの生成は,以下のステートメントで行うこともできる。つまり,配列アクセス演算子[ ] を空で記述することが,空の配列を作成することになる。

var my_array:Array = [ ];

さらに,配列アクセス演算子[ ] の中にエレメントを記述すれば,エレメントの入った配列が生成される。つまり上記スクリプトの最初の2行は,つぎの1行で記述することもできる※1)。

var my_array:Array = ["日曜日"];

上記スクリプトのとおり,Arrayインスタンスから値を取出すときにも,配列アクセス演算子[ ] でインデックスを指定する。さて,第7回「Dateクラスの日付と文字列の操作で紹介したDate.dayプロパティは,曜日を0から6までの整数で返した。すると,以下のスクリプトは,今日の曜日を配列から取出した漢字で[出力]する図1)。

var my_array:Array = new Array();
my_array[0] = "日曜日";
my_array[1] = "月曜日";
my_array[2] = "火曜日";
my_array[3] = "水曜日";
my_array[4] = "木曜日";
my_array[5] = "金曜日";
my_array[6] = "土曜日";
trace(my_array[new Date().day]);

図1 今日の曜日を配列から取出した漢字で[出力]

図1 今日の曜日を配列から取出した漢字で[出力]

配列インデックスは,別に連番で使わなければいけない訳ではない。たとえば,いきなりインデックス10に値を代入してもよい。だからといって,インデックス0から9までのメモリが無駄に確保されたりはしない。Arrayインスタンス内では,インデックスはいわば変数名と同じで,今の例なら10という名前のメモリに値が納められているだけだからだ。

すると,これから扱おうとしているキーコードは,整数でしかも互いに値が重複することはない。配列で管理するには,きわめて好都合といえる。まずは,左右の矢印キーの操作について,Arrayインスタンスを使って処理してみようスクリプト1)。処理の大きな流れは,前回のスクリプト2と基本的に同じだ。

スクリプト1 配列を使って左右矢印キーによるインスタンスの移動を処理

// MovieClip: キー操作で動かすインスタンス
var nMove:int = 1;
var nShiftMove:int = 10;
var keys_array:Array = new Array();
keys_array[Keyboard.LEFT] = -1;
keys_array[Keyboard.RIGHT] = 1;
stage.addEventListener(KeyboardEvent.KEY_DOWN, xKeyDown);
function xKeyDown(eventObject:KeyboardEvent):void {
  var nKeyCode:int = eventObject.keyCode;
  var bShiftKey:Boolean = eventObject.shiftKey;
  xMove(nKeyCode, bShiftKey);
}
function xMove(nKeyCode:int, bShiftKey:Boolean):void {
  var nPixels:Number = keys_array[nKeyCode];
  if (nPixels) {
    x += nPixels*xGetPixels(bShiftKey);
  }
}
function xGetPixels(bShiftKey:Boolean):int {
  var nPixels:int = bShiftKey ? nShiftMove : nMove;
  return nPixels;
}

上記スクリプト1は,Arrayインスタンスを作成し,左右矢印キーのキーコードをインデックスに指定して,それぞれの水平移動の向きを±1として代入した。そして,関数xMove()は,押されたキーのコードをインデックスに指定して,配列から値を取出す。左右の矢印キーが押されれば,±1の値が得られる。

押したキーが左右の矢印以外で,インデックスに指定したエレメントが存在しなければ,未定義を意味するundefinedという値が配列から返される。しかし,Number型で指定した変数(nPixels)にundefinedを代入すると,数値演算の対象にならないことを示すNaNという値に変わる。したがって,変数値が数値かNaNかを判定する必要がある。

上記スクリプト1の関数xMove()では,if条件に直接変数(nPixels)を指定している。すると,ifステートメントは,変数の値そのものを評価して,trueまたはfalseと判定する。そして,Number型の値は,NaNと0以外はtrueと評価される。よって,if条件に指定したNumber型変数(nPixels)trueと評価されれば,左右の矢印キーのいずれかが押されて変数に±1の値が入っていると判別できるので,インスタンスの座標をその値にしたがって移動させればよい※2)。

これで,どのキーが押されて,どちらの方向にインスタンスを動かすべきかは,条件判定によることなく処理できた。前述のifステートメントは,単に有効なキーが押されたかどうかを確かめているだけだ。[ムービープレビュー]で試すと,左右の矢印キーでインスタンスが移動する。[shift]キーにより移動距離を変更することも可能だ。

※1)

複数のエレメントを指定する場合は,カンマ区切りでたとえばつぎのように記述する。

var my_array:Array = ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"];
※2)
インスタンスの移動ピクセル数は,関数xGetPixels()の戻り値を掛合わせて算出している。つまり,配列(keys_array)に代入した±1という値は,ピクセル数という意味ではなく,単に移動方向(±の符号)を決める数値となっている。

著者プロフィール

野中文雄(のなかふみお)

ソフトウェアトレーナー,テクニカルライター,オーサリングエンジニア。上智大学法学部卒,慶応義塾大学大学院経営管理研究科修士課程修了(MBA)。独立系パソコン販売会社で,総務・人事,企画,外資系企業担当営業などに携わる。その後,マルチメディアコンテンツ制作会社に転職。ソフトウェアトレーニング,コンテンツ制作などの業務を担当する。2001年11月に独立。Web制作者に向けた情報発信プロジェクトF-siteにも参加する。株式会社ロクナナ取締役(非常勤)。

URLhttp://www.FumioNonaka.com/

著書

コメント

コメントの記入