第1回:Flash Liteの基本を学ぼう!

第1回←教材はこれ!

  • ケータイの待ち受けFLASHを自作したいのでここでお勉強してみようとおもいます。
  • なるほどDoCoMoは2.0は無くって最新機種でいきなり3.0対応か−。
  • とりあえず自分のケータイで動けばいいのでauW54Tを調べたらFlash Lite2.0対応でした。
  • お、いきなり資料関係へのリンク集。

Flash Liteの仕様については、各キャリアのサイトや、Adobeサイトなどで情報が公開されています。下記に関連するWebサイトをまとめましたので参考にしていただければと思います。



 各キャリアのFlashコンテンツの概要は下記になります。



NTT docomo

au

SoftBank(「メディア編」のPDFを参照)

Adobe(関連資料)



 また、機種別対応一覧は下記となります。



NTT docomo

au

SoftBank画面領域情報対応サービス


  • そしてFLASH再生方法に関して。このあたりはPCサイトと同じかな。
インライン再生
HTMLにswfを貼り付けて再生。キーイベント使用不可。
インタラクティブ再生
swfを直接再生。キーイベント使用可能。
  • キーイベントに関して使用可能なキーは以下。
    • 方向キー(上/下)
    • 決定キー
    • ダイヤルキー(0〜9/#/*)
  • 方向キーの左右はブラウザの進む・戻るに割り当てられてて使えないと!!!*1
  • 早速サンプルのアニメ。FL1.0。
  • ためしに自分のケータイに送って再生してみる。ちゃんと動いた。ループせず。
  • 横いっぱいに広がって動いたのは仕様のよう。

インタラクティブ再生の場合は、携帯の画面サイズに合わせて自動的にFlash Liteコンテンツのサイズも調整されます。場合によっては文字が読みにくくなったり、画像がにじんだりするケースもあります。その場合は、再度調整などを加えていきましょう。

  • このページの参考文献になってるWebDesigning僕持ってるわ。後で読もう。

*1:SoftBankは例外らしい

第19回 Objectクラスと静的メソッドの定義

第19回

  • 前回作ったスクリプトを改造すると。
  • そしてここで「クラスとは?」の謎に迫るさりげない発言が!

Objectクラスは,その使い方によって,いくつかの側面をもつ。今回は,配列(Arrayクラス)と似た,複数の値を収める容れ物として用いる。

  • いくつかの側面がありすぎるせいかイマイチつかめません、先生!

var myObject:Object = new Object();

配列は整数インデックスに値を格納した。Objectインスタンスには,インデックスでなく変数のように識別子をつけて値を代入する。識別子は,Objectインスタンスにドットシンタックスで以下のように設定すればよい。

myObject.hours = 12;
myObject.minutes = 34;
myObject.seconds = 56;
myObject.milliseconds = 789;

  • つまり書式が違うだけでほぼ配列、連想配列的な使い方ってことですね。
  • そしてミリ秒から時分秒を計算する関数が以下。

// フレームアクション
function translateToTimeObject(nTime:Number):Object {
 var oTime:Object = new Object();
 oTime.milliseconds = nTime%1000;
 nTime = Math.floor(nTime/1000);
 oTime.seconds = nTime%60;
 nTime = Math.floor(nTime/60);
 oTime.minutes = nTime%60;
 oTime.hours = Math.floor(nTime/60);
 return oTime;
}

  • ここでMath.floor()は小数点以下切り捨て。
  • さて次のページの静的なメソッドがよく分からない。

静的なメソッドは,Math.sin()やMath.cos()メソッドなどのように,インスタンスを作成することなくクラスを直接参照して呼出す*1インスタンスでなく,クラス自身に定義されたメソッドである。

  • うーん、スタティックなメソッド自体の意味はなんとなく分かるんだけど。
  • クラスにメソッドを定義する時はスタティックだと覚えておけばいいってこと?
  • そんなわけでASファイルはこんな感じ。

// ActionScript 3.0クラス定義ファイル: MyTimer.as
package {
 public class MyTimer {
  private var my_date:Date;
  public function MyTimer() {
   my_date = new Date();
  }
  public function getElapsedTime():Object {
   var current_date:Date = new Date();
   var nElapsedTime:Number = current_date.time-my_date.time;
   var oElapsedTime:Object = translateToTimeObject(nElapsedTime); // クラスの参照を省略
   return oElapsedTime;
  }
  public static function translateToTimeObject(nTime:Number):Object {
   var oTime:Object = new Object();
   oTime.milliseconds = nTime%1000;
   nTime = Math.floor(nTime/1000);
   oTime.seconds = nTime%60;
   nTime = Math.floor(nTime/60);
   oTime.minutes = nTime%60;
   oTime.hours = Math.floor(nTime/60);
   return oTime;
  }
 }
}

  • やっぱり属性指定で「static」にしてるな。
  • そんでこれを呼び出すフレームアクションは以下。

var myObject:MyTimer = new MyTimer(); ←クラスインスタンスの生成
stage.addEventListener(MouseEvent.CLICK, xTrace);
function xTrace(eventObject:MouseEvent):void {
 var oElapsedTime:Object = myObject.getElapsedTime();
 trace(oElapsedTime.hours);
 trace(oElapsedTime.minutes);
 trace(oElapsedTime.seconds);
 trace(oElapsedTime.milliseconds);
}

  • うーん、インスタンスのクラスってのがごっちゃになってきたー。
  • つーか、やっぱしクラスの概念がイマイチはっきりせんわー。

*1:「同じように,クラスを直接参照してアクセスする「静的なプロパティ」もある。たとえば,Math.PIがその例だ(厳密には,静的な定数とされる)。静的なプロパティやメソッドは「クラスプロパティ」および「クラスメソッド」とも呼ばれ,前出注の「インスタンスプロパティ」や「インスタンスメソッド」と対比される。」とある

第18回 カスタムクラスを定義する

第18回←教材はこれ!

  • かなり脱初心者っぽいテーマ!
  • ASファイルを別に用意するあたりが玄人っぽいですね☆
  • そしてクラスの概念がイマイチ掴めてないこと思い出した★
  • 定義の書式はこれ。

package [パッケージ名] { ←パッケージ名はオプション
 class クラス名 {
   function クラス名() { ←コンストラクタメソッド
  }
 }
}

  • クラスを定義するとクラス名が3カ所で使われる。特にASファイルは「クラス名.as」で保存する必要がある。
    1. クラス名
    2. コンストラクタメソッド名
    3. ActionScript(AS)ファイル名
  • なんとなく形は理解したけど(関数定義とほぼ一緒)、次の記述がよくわからない。

なお,コンストラクタメソッドはクラスのインスタンスを返すが,戻り値(returnステートメント)とそのデータ型は指定しないことに注意してほしい。

  • 「クラスのインスタンスを返す」の意味がいまいち。
  • そして次のページでアクセス範囲の指定について。mixiを例に出されたら分かったつもりになる。
  • とりあえずpublicを付けなさいと言うことね。

// ActionScript 3.0クラス定義ファイル: MyClass.as
package {
public class MyClass { // コンストラクタメソッド
  function MyClass() {
  }
 }
}

  • そして3ページ目では新たに定義したクラスにメソッドとプロパティを!これでクラスの概念がなんとなく分かるか?!
  • そんなわけで次のスクリプト

// ActionScript 3.0クラス定義ファイル: MyTimer.as
package {
public class MyTimer {
private var my_date:Date;
public function MyTimer() {
my_date = new Date();   ←クラスを生成した時の時刻をゲット
  }
public function getElapsedTime():Number {
   var current_date:Date = new Date();
   var nElapsedTime:Number = current_date.time-my_date.time; ←現在の時刻との差を取って経過時間を計算
   return nElapsedTime;
  }
 }
}

  • キッチンタイマーアプリみたいなのがこれで作れるのかな。
  • ここでアクセス範囲のおさらい
private
定義されたクラス内からのみ,アクセスすることができる。
public
任意のクラスやタイムラインから,アクセスすることができる。コンストラクタメソッドは,このpublic属性しか指定できない。
  • コンストラクタメソッドが外部から呼び出せなかったらそもそもクラス定義する意味無いっちゅーことですな。
  • クラスって結局、うーん、関数群?ツールパレット的な?
  • 次回持ち越しです(´Д⊂

第17回 3D風に回転するアニメーション

第17回←教材はこれ!

  • 3D風とな。
  • 奥に行って小さくなって手前で大きくなるとかそんな感じかな。
  • 当たってた。

インスタンスの幅やサイズを変えるには,DisplayObject.scaleXとDisplayObject.scaleYプロパティを使う。これらのプロパティは,[変形]パネルの幅と高さのスケールに当たる(図3)。ただし,単位はパーセンテージ(%)ではなく,実寸を1.0とする小数値であることに注意しよう。

  • 100%が1.0だから三角関数と相性良いのか。でも三角関数は負の値もあるから絶対値取る必要がありそう。

また,DisplayObject.scaleX/DisplayObject.scaleYプロパティの特色として,マイナスの値を与えるとインスタンスが反転する。だから,sin値をそのままプロパティに設定するだけでよいという訳だ。

  • なるほど!絶対値取る必要なく、負の値になったら方向変わるんだ!こりゃ相性ばっちりですな。
  • 仮想3次元でもっとも手前のスケールを1、奥で一番遠いところを0.8にするためにsinの値を変換する関数xGetIndexZ()を考える。

function xScale(eventObject:Event):void {
scaleX = scaleY = xGetIndexZ(0.8, 1);←最小値0.8から最大値1.0までのものとする
scaleX *= xGetIndexZ(-1, 1); ←Xだけ実際のsinの値を乗算
}

function xGetIndexZ(nMin:Number, nMax:Number):Number {
var nIndexZ:Number = (nMax-nMin)*(nSin+1)/2+nMin;
return nIndexZ;
}

// MovieClip: 回転するインスタンス
var nDegree:Number = 0;
var nRadian:Number = 0;
var nSpeed:Number = 5;
var nDegreeToRadian:Number = Math.PI/180;
var nCenterX:Number = stage.stageWidth/2;
var nCenterY:Number = stage.stageHeight/2;
var nRadiusX:Number = 100;
var nRadiusY:Number = 50;
var nCos:Number = Math.cos(nRadian);
var nSin:Number = Math.sin(nRadian);
addEventListener(Event.ENTER_FRAME, xMoveX);
addEventListener(Event.ENTER_FRAME, xMoveY);
addEventListener(Event.ENTER_FRAME, xScale);
addEventListener(Event.ENTER_FRAME, xUpdate);
function xMoveX(eventObject:Event):void {
x = nCenterX+nCos*nRadiusX;
}
function xMoveY(eventObject:Event):void {
y = nCenterY+nSin*nRadiusY;
}
function xScale(eventObject:Event):void {
scaleX = scaleY=xGetIndexZ(0.8, 1);
scaleX *= xGetIndexZ(); ←引数指定なし!
}
function xUpdate(eventObject:Event):void {
nDegree += nSpeed;
nDegree = (nDegree%360+360)%360;
nRadian = nDegree*nDegreeToRadian;
nCos = Math.cos(nRadian);
nSin = Math.sin(nRadian);
}
function xGetIndexZ(nMin:Number=-1, nMax:Number=1):Number {
var nIndexZ:Number = (nMax-nMin)*(nSin+1)/2+nMin;
return nIndexZ;
}

  • 最後のxGetIndexZ関数でさりげに引数を定数として定義してる。
  • その前のxScale関数の中で引数指定なく呼び出されてるけど、この場合はあらかじめ定義されているものが使われる。
  • なるほどー。
  • そして今回は3ページ目もある!
  • なんとさらにぼかしまで加えると!
  • フィルタの適用手順。
    1. 配列(Array)インスタンスを作成する。
    2. フィルタインスタンスを作成する。
    3. フィルタインスタンスを配列インスタンスに格納する。
    4. インスタンスのDisplayObject.filtersプロパティに配列インスタンスを代入する。
  • ここでもまた配列が活躍。
  • そして脚注になにげに大切そうなことが!

配列はフィルタインスタンスを納めてからDisplayObject.filtersプロパティに設定する必要がある。プロパティに配列を設定した後で,配列にフィルタインスタンスを追加したり,エレメントのフィルタに変更を加えても,それらの操作はインスタンスにフィルタとして適用されない。

  • うーんなんとなく分かったような分からんようなー。
  • そしてぼかしを入れたいインスタンスのフレームアクションが以下。

var filters_array:Array = new Array();
var myBlur:BlurFilter = new BlurFilter();
filters_array.push(myBlur);
my_mc.filters = filters_array;

  • なんかめんどくさいねー。
  • 「push()」って何?格納用メソッド?
  • そしていきなりコンストラクタという用語が出てきた。知らない。調べたら先生の解説発見。関数と読み替えて問題なさそう。
  • ぼかしように書き足される関数が以下。

function xBlur(eventObject:Event):void {
var nBlur:Number = xGetIndexZ(4, 0);
var myBlur:BlurFilter = new BlurFilter(nBlur, nBlur/2);
filters = [myBlur];
}

  • xGetIndexZの引数が(4,0)となってる。単純に対応の関係か。
  • 第3ステートメントが分かりにくい。「[ ]」で囲むのはそういう書式かな?以下が解説。

第3ステートメントは,BlurFilterインスタンスを納めた配列のDisplayObject.filtersプロパティへの設定だ。前述のフィルタの適用手順では4つに分けたステップのうち,配列の作成とフィルタインスタンスの格納,およびそのDisplayObject.filtersプロパティへの設定の3つを,1つのステートメントで済ませている。

  • イマイチよくわかんないけど、filtersプロパティ全体がよくわかんないからしょうがない。
  • とりあえずこんなことできるんだなーくらいで覚えておこう。

第16回 三角関数を使った楕円軌道のアニメーション

第16回←教材はこれ!

  • やったー三角関数だ−。
  • アニメーションを水平に振動させるのにcos関数をつかう。*1
  • 振動させるインスタンスに記述するのは以下。

// MovieClip: 振動させるインスタンス
var nRadian:Number = 0;
var nCenterX:Number = stage.stageWidth/2;
var nRadiusX:Number = 100;
addEventListener(Event.ENTER_FRAME, xMoveX);

function xMoveX(eventObject:Event):void {
  x = nCenterX+Math.cos(nRadian)*nRadiusX;
  nRadian += 0.1;
}

  • nRadianが0からスタートして実行される度に0.1ずつ増えていくと。*2
  • 一往復31.4フレームつーことですね。
  • sinを使って垂直に振動させる記述もあった。つーことはもしや!!!

// MovieClip: 振動させるインスタンス
var nRadian:Number = 0;

var nCenterY:Number = stage.stageHeight/2;
var nRadiusY:Number = 100;
addEventListener(Event.ENTER_FRAME, xMoveY);
function xMoveY(eventObject:Event):void {
  y = nCenterY+Math.sin(nRadian)*nRadiusY;

  nRadian += 0.1;
}

  • そして次のページ、やはり水平・垂直移動の合体で円運動!これやりたくなるのは人の性!!!
  • でもよくみたらタイトルにちゃんと「楕円軌道のアニメーション」ってあるよね。

// MovieClip: 振動させるインスタンス
var nRadian:Number = 0;
var nCenterX:Number = stage.stageWidth/2;
var nCenterY:Number = stage.stageHeight/2;

var nRadiusX:Number = 100;
var nRadiusY:Number = 100;
addEventListener(Event.ENTER_FRAME, xMoveX);
addEventListener(Event.ENTER_FRAME, xMoveY);
addEventListener(Event.ENTER_FRAME, xUpdate);
function xMoveX(eventObject:Event):void {
  x = nCenterX+Math.cos(nRadian)*nRadiusX;
}
function xMoveY(eventObject:Event):void {

  y = nCenterY+Math.sin(nRadian)*nRadiusY;
}
function xUpdate(eventObject:Event):void {
  nRadian += 0.1;
}

  • x、yのプロパティそれぞれ別に呼び出して処理してますね。なるほど。
  • そしてこのページではちゃんとラジアンに関する記述もある。さすが野中先生ぬかりなし!*3
  • んでなんと角度(度数)で記述する方法も伝授!

// MovieClip: 振動させるインスタンス
var nDegree:Number = 0;
var nRadian:Number = 0;
var nSpeed:Number = 5;

var nDegreeToRadian:Number = Math.PI/180;
var nCenterX:Number = stage.stageWidth/2;
var nCenterY:Number = stage.stageHeight/2;
var nRadiusX:Number = 100;
var nRadiusY:Number = 50;←楕円にするためにこっちは50
var nCos:Number = Math.cos(nRadian);

var nSin:Number = Math.sin(nRadian);
addEventListener(Event.ENTER_FRAME, xMoveX);
addEventListener(Event.ENTER_FRAME, xMoveY);
addEventListener(Event.ENTER_FRAME, xUpdate);
function xMoveX(eventObject:Event):void {

  x = nCenterX+nCos*nRadiusX;
}
function xMoveY(eventObject:Event):void {

  y = nCenterY+nSin*nRadiusY;
}
function xUpdate(eventObject:Event):void {
  nDegree += nSpeed;
  nDegree = (nDegree%360+360)%360;←角度が負の値でも大丈夫!
  trace(nDegree); // 確認用

  nRadian = nDegree*nDegreeToRadian;
  nCos = Math.cos(nRadian);
  nSin = Math.sin(nRadian);
}

  • でもこれかなり面倒なことやてる気がする。素直にラジアンで処理した方がいいかも。

*1:ちなみにsinの方が最初が0なのになぜcos使うのかな?あとで分かるのか??

*2:ちなみにラジアンって忘れてたんで調べました。180度=πラジアン

*3:1ページ目の最後には単振動にも触れてたし、先生完全に理系男子ですな☆

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

第15回←教材はこれ!

  • 配列のお勉強。
  • 配列もDateクラス同様new演算子を使って生成する。
  • でも普通は代入とともにいっきに以下の記述で生成。これがよく見る形かな。

var my_array:Array = ["日曜日"]; ←インデックス0に「日曜日」が納まった

  • 配列のインデックス番号に何を入れるかの指定は以下のように。

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]); ←出力用

  • 配列は別に0番から格納する必要はなく何番から入れ始めても良い。しかもそれにより無駄なメモリ消費もない。
  • そんなわけで前回のキーコード*1をそのままインデックスにするわけですね。

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

  • なるほど!これは説明聞かないといきなりこの数列見ても何の処理か分からなかったかも。
  • そんでこの場合は左右の矢印キーのみの処理。
  • ほかのキーが押されると未定義の配列の中身が指定される。

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

  • そんなわけでよくみると関数xMove内のif文が「if (nPixels)」となってます!これ大事じゃね?!

ifステートメントは,変数の値そのものを評価して,trueまたはfalseと判定する。そして,Number型の値は,NaNと0以外はtrueと評価される。

  • 「0」でもfalseになるのね。
  • なんで左右方向のみの移動なのかなと思ってたら、配列使うとif・swicth文のときと違ってyプロパティいじりにくいのね。
  • そしていきなりこんな記述が。

配列アクセス演算子[ ] は,配列つまりArrayインスタンスだけでなく,他のインスタンスのプロパティにアクセスするために使うこともできる。

  • お、なんか分かるような分からんような。
  • アクセス演算子が超便利に使えるってこと??

たとえば,フレームアクションで,タイムラインに配置されたインスタンスmy_mcの水平座標を10ピクセル右に動かすには,今まではつぎのようにステートメントを記述した。

my_mc.x += 10;

この同じ処理は,配列アクセス演算子を使って,つぎのように書替えることができる。

my_mc["x"] += 10;

  • ようはインスタンスのプロパティが連想配列に格納されてるってイメージですね。
  • それにしても野中先生は初心者がミスしやすい考えをよく知ってる。自身の失敗の経験か指導者としての経験か。とにかくためになる。

しかし,ここでひとつ注意しなければならない。つぎのステートメントは,エラーになってしまうということだ。

["x"] += 10;

なぜなら,上のステートメントの左辺は,インスタンスのxプロパティにアクセスしているのではない。文字列"x"をエレメントとしてもつ配列をつくってしまっているのだ。Arrayインスタンスそのものに,直接数値を加算することはできない。だから,エラーになる。

  • そんなわけで配列を使うとなると、「どのプロパティ」に「どの方向かに移動させるか」の二つの情報を格納する必要がある。

var keys_array:Array = new Array();
keys_array[Keyboard.LEFT] = ["x", -1];
keys_array[Keyboard.RIGHT] = ["x", 1];
keys_array[Keyboard.UP] = ["y", -1];
keys_array[Keyboard.DOWN] = ["y", 1];

  • 二次元配列かな。なるほど。プロパティは文字列なので「"」で囲むと。
  • そんなわけで最終的にはこうなる。

// MovieClip: キー操作で動かすインスタンス
var nMove:int = 1;
var nShiftMove:int = 10;
var keys_array:Array = new Array();

keys_array[Keyboard.LEFT] = ["x", -1];
keys_array[Keyboard.RIGHT] = ["x", 1];
keys_array[Keyboard.UP] = ["y", -1];
keys_array[Keyboard.DOWN] = ["y", 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 key_array:Array = keys_array[nKeyCode];
  if (key_array) {
    this[ key_array[0] ] += key_array[1]*xGetPixels(bShiftKey);
  }
}

function xGetPixels(bShiftKey:Boolean):int {
  var nPixels:int = bShiftKey ? nShiftMove : nMove;
  return nPixels;
}

  • はいここで「this[ keys_array[0] ]」ですね。知らないと記述に困るよね。
  • つーわけで今回一番の鱗ドロピング・フロム・ジ・アイズは以下。

配列アクセス演算子[ ] は,ドット演算子.と基本的に同じ役目だ。ドット(.)の左には,必ずプロパティの持ち主(ターゲット)となるべきインスタンスを指定しなければならない。スクリプトを記述しているインスタンス自身がターゲットであれば,thisキーワードを指定する。

  • 先生!今回も勉強になりました!!!!

*1:整数で互いに重複しないので好都合!!!

*2:何の略か忘れてたんで調べたら「Not a Number」でした★

第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:濁点と半濁点って文字が小さいと間違えやすいですよね!