前回の第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 キー操作で動かすインスタンスのフレームアクションに[shift]キーによる動作を追加 図1 キー操作で動かすインスタンスのフレームアクションに[shift]キーによる動作を追加](/assets/images/dev/serial/01/as3/0014/thumb/TH800_01.gif)
[ムービープレビュー]で確かめると、
第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
ステートメントで書替えたフレームアクション![図2 キーコードの判定をswitchステートメントで書替えたフレームアクション 図2 キーコードの判定をswitchステートメントで書替えたフレームアクション](/assets/images/dev/serial/01/as3/0014/02.gif)
さて、
今回解説した次のサンプルファイルがダウンロードできます。