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

第14回 キー操作とif以外の条件判定

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

switchステートメント

前掲スクリプト1の関数xMove()におけるifおよびelse if条件は,4つともすべて左辺は関数に渡された第1引数nKeyCodeである。このように一つの式(変数やプロパティを含む)といくつかの式の値を等価比較するときには,switchステートメントを用いて条件判定することができる。シンタックスは,次のとおりだ。

switch (式0) {
  case 式1 :
    ステートメント1;
  case 式2 :
    ステートメント2;
  ...
  case 式N :
    ステートメントN;
  default :
    ステートメントdefault;
}

switch条件に指定された式0(変数やプロパティを含む)を,caseステートメントの式1,式2から式Nまでの値と順に等価比較する。等しいと評価されれば,対応したステートメントが処理される。defaultステートメントはオプション(省略可能)※2),switch条件がいずれのcaseステートメントの値とも等しくないとき処理される。

switchステートメントで注意しなければならないのは,あるcaseステートメントの値と条件が等しいと評価されたら,そのステートメントだけでなく,以降のcaseステートメントの処理がすべて行われてしまうことだ。たとえば,関数xMove()の処理を水平方向つまりDisplayObject.xプロパティの操作のみ,switchステートメントでつぎのように記述したとする。

function xMove(nKeyCode:int, bShiftKey:Boolean):void {
  switch (nKeyCode) {
    case Keyboard.LEFT :
      x -= xGetPixels(bShiftKey);
    case Keyboard.RIGHT :
      x += xGetPixels(bShiftKey);
  }
}

すると,右矢印キーでインスタンスは右に移動できるものの,左矢印キーではインスタンスが動かない。これは,左矢印キーを押したとき,switch条件の変数nKeyCodeが最初のcaseステートメントの値Keyboard.LEFTと一致して座標が左に動かされても,さらにつぎのcaseステートメントも実行されるので,同じ距離右に移動されて相殺されることになるからだ。

一つのcaseステートメントごとに処理を抜けるには,そのためのステートメントbreakを明示的に記述する必要がある。したがって,前掲のスクリプト1をswitchステートメントで書替えると,つぎのようになるスクリプト2)。

スクリプト2 キーコードをswitchステートメントで判定

// MovieClip: キー操作で動かすインスタンス
var nMove:int = 1;
var nShiftMove:int = 10;
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 {
  switch (nKeyCode) {
    case Keyboard.LEFT :
      x -= xGetPixels(bShiftKey);
      break;
    case Keyboard.RIGHT :
      x += xGetPixels(bShiftKey);
      break;
    case Keyboard.UP :
      y -= xGetPixels(bShiftKey);
      break;
    case Keyboard.DOWN :
      y += xGetPixels(bShiftKey);
      break;
  }
}
function xGetPixels(bShiftKey:Boolean):int {
  var nPixels:int = bShiftKey ? nShiftMove : nMove;
  return nPixels;
}

caseステートメントの最後,つまり次のcaseステートメントの直前にそれぞれbreakステートメントが記述されている。したがって,一つのcaseステートメントの処理を終えれば,次のcaseステートメントに移らずに,switchステートメントから抜けるのである。なお,最後のcaseステートメントには,厳密にはbreakステートメントは不要だ。しかし,後で処理を追加する可能性もあるので,念のために書き加えてある。

[ムービープレビュー]を確かめると,スクリプト1と同じように,矢印キーで1ピクセル,[shift]キーを加えると10ピクセルずつインスタンスが動く。switchステートメントを使った方が,キーコード(nKeyCode)の値を各caseステートメントの値と比較して処理するという構成が明らかになる。

図2 キーコードの判定をswitchステートメントで書替えたフレームアクション

図2 キーコードの判定をswitchステートメントで書替えたフレームアクション

さて,次回は同じキーボードによる操作を,さらに別の構成で書いてみる。配列(Arrayインスタンス)を使うことにより,条件判定なしに処理する。配列はさまざまに応用できる可能性があるので,ぜひ覚えておきたい。

※2)
[ヘルプ]のswitchステートメントの項には,「switchステートメントには,どのcaseステートメントも式に一致しない場合に実行するデフォルトケースを指定する必要があります」という説明がある。しかし,本文に述べたとおり,defaultステートメントの記述は任意だ。defaultステートメントの項を見れば,switchステートメントにdefaultケースステートメントは必須ではありません」と明記されている。

今回解説した次のサンプルファイルがダウンロードできます。

著者プロフィール

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

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

URLhttp://www.FumioNonaka.com/

著書

コメント

コメントの記入