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

第14回←教材はこれ!

  • 矢印キーと同時にシフトキーを押した時に移動距離を増やす方法。
  • 条件分岐が少し複雑になるのかな?
  • まずはKeyboardEvent.shiftKeyプロパティを取得して関数に渡す記述。

stage.addEventListener(KeyboardEvent.KEY_DOWN, xKeyDown);
function xKeyDown(eventObject:KeyboardEvent):void {
var nKeyCode:int = eventObject.keyCode;
var bShiftKey:Boolean = eventObject.shiftKey;
xMove(nKeyCode, bShiftKey);
}

  • ちなみにBooleanの読み方忘れてた。「ブーリアン」。学生時代はブール型をプール型と読み間違えて*1たの思い出した。
  • 関数xMoveは第2引数がtrueなら+10、falseなら+1移動させる。その判定に関数xGetPixels()を定義している。

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;
}

  • なるほど条件式を複雑にしないために関数xGetPixelsの利用。
  • ここでxGetpixelsで利用されてる、新たな条件分岐の書式。

条件 ? 式1 : 式2

  • 条件の評価がtrueなら式1の値を,falseであれば式2の値を返す。
  • そんなわけでint型で宣言した変数nPixelsに代入する以下。

var nPixels:int = bShiftKey ? 10 : 1;

  • 1ページ目の最後にこんな記述が。なにげに重要★

関数本体({}内)でvar宣言された変数を「ローカル変数」(local variable)という。関数本体の中でのみ有効で,関数の外や他の関数からアクセスすることはできない([ヘルプ]の[ActionScript 3.0のプログラミング] > [ActionScript言語とシンタックス] > 変数参照)。関数が終了すれば,ローカル変数は原則としてメモリからクリアされる。
これに対して,フレームアクションで関数の外にvar宣言された変数は,スクリプトを記述したタイムラインにメモリされるので,「タイムライン変数」と呼ばれる。

  • やっと出てきたswicth文!

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

  • break文が必須だと言うことですね。つーか最初からステートメント処理したらbreakすることにしといたらいいのに。
  • そんなわけでswicth文使って書き換えたら以下。

// 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;
}

  • なるほど変数の種類も増えちゃってて分かりづらい気もするけどこんなもんか。
  • そんで次回は配列使って条件分岐なくすとな!

*1:濁点と半濁点って文字が小さいと間違えやすいですよね!