前回の第13回ifでなくswitchというステートメントによる処理に書替える。
[shift]キーを押したら移動距離を変える
矢印キーを操作する際、
[shift]キーを押しているかどうかは、KeyboardEvent.プロパティで調べることができたInteractiveObject.イベントKeyboardEvent.)KeyboardEvent.プロパティの値を取出したうえで、
stage.addEventListener(KeyboardEvent.KEY_DOWN, xKeyDown);
function xKeyDown(eventObject:KeyboardEvent):void {
var nKeyCode:int = eventObject.keyCode;
var bShiftKey:Boolean = eventObject.shiftKey;
xMove(nKeyCode, bShiftKey);
}
関数xMove()は、trueつまり[shift]キーが押されていればインスタンスの移動距離を10に設定し、falseで[shift]キーが押されていない場合には移動距離を1にする。この引数値がtrueかfalseかによって、
function xMove(nKeyCode:int, bShiftKey:Boolean):void {
if (nKeyCode == Keyboard.LEFT) {
x -= xGetPixels(bShiftKey);
} else if (nKeyCode == Keyboard.RIGHT) {
x += xGetPixels(bShiftKey);
} else if (nKeyCode == Keyboard.UP) {
y -= xGetPixels(bShiftKey);
} else if (nKeyCode == Keyboard.DOWN) {
y += xGetPixels(bShiftKey);
}
}
関数xGetPixels()は、trueなら10を、falseであれば1を返す。この処理はifステートメントを使って簡単に書くことができるだろう。しかし、?:を用いてみたい。条件演算子?:は、trueなら式1の値を、falseであれば式2の値を返す。
条件 ? 式1 : 式2
戻り値は、
var nPixels:int = bShiftKey ? 10 : 1;
さて、
// 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 {
if (nKeyCode == Keyboard.LEFT) {
x -= xGetPixels(bShiftKey);
} else if (nKeyCode == Keyboard.RIGHT) {
x += xGetPixels(bShiftKey);
} else if (nKeyCode == Keyboard.UP) {
y -= xGetPixels(bShiftKey);
} else if (nKeyCode == Keyboard.DOWN) {
y += xGetPixels(bShiftKey);
}
}
function xGetPixels(bShiftKey:Boolean):int {
var nPixels:int = bShiftKey ? nShiftMove : nMove;
return nPixels;
}
[ムービープレビュー]で確かめると、
第1は、if/それぞれのステートメントで、
function xMove(nKeyCode:int, bShiftKey:Boolean):void {
var nPixels:int = xGetPixels(bShiftKey);
if (nKeyCode == Keyboard.LEFT) {
x -= nPixels;
} else if (nKeyCode == Keyboard.RIGHT) {
x += nPixels;
// ...[後略]...
しかし、
第2に、?:を使ったことだ。if/ステートメントと比べたメリットは何か。条件演算子?:を使うと、if/の方が見やすいと思う読者は、
switchステートメント
前掲スクリプト1の関数xMove()におけるifおよびelse if条件は、switchステートメントを用いて条件判定することができる。シンタックスは、
switch (式0) {
case 式1 :
ステートメント1;
case 式2 :
ステートメント2;
...
case 式N :
ステートメントN;
default :
ステートメントdefault;
}
switch条件に指定された式0caseステートメントの式1、defaultステートメントはオプションswitch条件がいずれのcaseステートメントの値とも等しくないとき処理される。
switchステートメントで注意しなければならないのは、caseステートメントの値と条件が等しいと評価されたら、caseステートメントの処理がすべて行われてしまうことだ。たとえば、DisplayObject.プロパティの操作のみ、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.と一致して座標が左に動かされても、caseステートメントも実行されるので、
一つのcaseステートメントごとに処理を抜けるには、breakを明示的に記述する必要がある。したがって、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ステートメントは不要だ。しかし、
[ムービープレビュー]を確かめると、switchステートメントを使った方が、caseステートメントの値と比較して処理するという構成が明らかになる。
switchステートメントで書替えたフレームアクション
さて、
今回解説した次のサンプルファイルがダウンロードできます。
