速習Webデザイン ActionScript3.0を読む その8

速習Webデザイン ActionScript 3.0

速習Webデザイン ActionScript 3.0

part7 外部ファイルの読み込み

    • これまたかなり実践的な内容だ!
  • 01-01 Loaderクラス
    • なんでもかんでもクラスとかオブジェクトだとかいうことに慣れてきた今日この頃。
    • Loaderクラスのオブジェクトは他の表示オブジェクトを子として1つだけ持てる。
    • Loaderオブジェクトにイメージファイルを配置する処理と、Loaderオブジェクト自身を表示リストに追加する処理の両方が必要。
    • ようは額縁みたいなもんですね。
  • 01-02
    • 大まかな流れと書式は以下。
    1. Loaderオブジェクトの生成。
    2. Loader.load()メソッドによる外部ファイルの読み込み
    3. Loaderオブジェクトを表示リストに追加。

var loader:Loader = new Loader();
var urlReq:URLRequest = new URLRequest("phot.jpg");
loader.load(urlReq);
addChild(loader);

    • なるほどURLRequestをイチイチかまさなあかんのがやらしいなぁー。*1
    • load()メソッドを実行してファイルがダウンロードし終わらないと表示されない。*2
    • ダウンロード待ちを行うにはDL完了時に行われるcompleteイベントを設定する。
  • Let's TRY!!
    • 2枚の画像を同時に読み込む課題。
    • サンプルを参考にloaderを二つ用意したら簡単だった。

*1:「loader.load(new URLRequest ("phot.jpg") );」で変数はさまなくてもイイらしい。こっちが普通かな。

*2:何らかの処理を実行し、その結果がすぐに反映されない処理を「非同期処理」という、らしい。

速習Webデザイン ActionScript3.0を読む その7

速習Webデザイン ActionScript 3.0

速習Webデザイン ActionScript 3.0

part6 表示オブジェクトのコントロール:応用 のつづき

  • 02-01 フィルタ
    • フィルタごとにそれぞれ別のクラスとして扱われる。
    • 表示オブジェクトにフィルタを関連づけるには「DisplayObjct.filters」プロパティを使うがfiltersプロパティにフィルタオブジェクトを代入という形では一つのフィルタしか適用できない。
    • そのためfilterプロパティにはフィルタオブジェクトを要素として格納したArrayオブジェクトを代入する。

表示オブジェクト.filters=[フィルタオブジェクト1,フィルタオブジェクト2]

  • 02-02
    • フィルタオブジェクトの作成も今までのオブジェクトと同じ形。
    • 「_mc」にぼかしのフィルタを入れる場合は以下。

var blurObj:BlurFilter = new BlurFilter();

blurObj.blurX =128; ←値は0~255
blurObj.blurY =128;

_mc.filters =[blurObj];

    • 設定されているフィルタを解除する時はnullを代入。
  • 02-03
    • 現在適用されているフィルタの設定を変更するには一度変数に取り出して、変数を変更した上で代入し直す必要がある。
  • 次の操作は無効

_mc.filters.filter[0].blurX -=BLUR_STEP;

  • 正しい操作

var blur.BlurFilter = _mc.filters[0];
blur.blurX -= BLUR_STEP;
_mc.filters = [blur];

  • Let's TRY!!
    • 前回の課題の続きでインスタンス登場時にぼかしフィルタを入れる課題。テキストのサンプルを参照したら難なくクリア。
    • つーか前回のもpart5のポストカードサンプル*1熟読してたら結構簡単にできたかも。。。。
  • 03-01 機能ごとにムービークリップにまとめる
    • 長くなったスクリプトを独立性の高い機能ごとに分散して管理する方法の学習と。
    • 上級者であればカスタムクラスを使って機能の分散をする。
    • ムービークリップ内のフレームアクションとして記述し分散させることが出来る。
    • 代表的なパターンとして以下の二つ。
そのMCの情報や動作を定義する
MC内にアニメーションの再生・停止のための関数を定義しておきそれを呼び出すようにする。
グラフィックに関係なく独立性の高い一連の機能を定義する
空のMC内に特定の機能を管理するためのカスタムメソッド・プロパティを定義する。
  • Let's TRY!!
    • このpart6でやってる課題の続きでスクリプトの分割。
    • 20分くらい悩んで何とか出来た。

add_btn.addEventListener(MouseEvent.CLICK, xAddClick);

  function xAddClick(evt:MouseEvent):void {
    var newCharacter:MovieClip = new Character();
    addChild(newCharacter);
  }

var speedX:int =xGetSpeed();
var speedY:int =xGetSpeed();
var scale:Number = Math.random() * 0.5 + 0.6;

x = Math.floor(Math.random() * 400) + 50;
y = Math.floor(Math.random() * 200) + 50;
scaleX = scale;
scaleY = scale;


this.addEventListener(Event.ENTER_FRAME, xCharaEnterFrame);

  function xCharaEnterFrame(evt:Event):void {
      x += speedX;
      y += speedY;
    if (x < 0 || x > 550 - width){
      speedX *= -1;
    }
    if (y < 0 || y > 400 - height){
      speedY *= -1;
    }
  }

  function xGetSpeed():int {
      var speed:int = Math.floor(Math.random() * 8) + 5;
    if (Math.random() < 0.5){
      speed *= -1;
    }
    return speed;
}

    • ポイントはEnterFrameをMC内でやってること。
    • そしてaddEventListenerのターゲットがthis。もちろん省略可。なにげに今までadd~のターゲットがボタンとかMCインスタンスだったのでthisになることが新鮮。

*1:ポストカードカタログサンプルは斜め読みしてました(´Д⊂

速習Webデザイン ActionScript3.0を読む その6

速習Webデザイン ActionScript 3.0

速習Webデザイン ActionScript 3.0

part6 表示オブジェクトのコントロール:応用

  • 01-01 埋め込みアセットクラス
    • ライブラリのデータは「埋め込みアセットクラス」として設定することでスクリプトから指定できるようになる。
    • リンケージプロパティで「ActionScriptに書き出し」にチェックを入れる。
  • 01-02
    • アセットクラス化したMCのインスタンスを表示させるには二つのプロセス。
    1. インスタンスを生成
    2. インスタンスを表示リストに追加
    • 書式は以下。
  • 生成

var 変数 :データ型 = new 埋め込みアセットクラス名() ;

  • 表示

表示オブジェクトコンテナ.addChild(インスタンス) ;

  • 削除

表示オブジェクトコンテナ.removeChild(インスタンス) ;

    • removeした後もメモリ上にインスタンスは残っているのでさらにaddChild()で表示できる。
    • メモリ上からも削除する場合は変数にnullを代入する。
    • クラス名を文字列で指定できると繰り返し処理が使えるので便利。
    • そのためのメソッドが「getDefinitionByName()」メソッド。
    • これ使う課題とかあるんじゃなかろか。
  • Let'TRY!!
    • ボタンクリックのたびにアセットクラスCharacterのインスタンスをステージに追加させる。インスタンスはランダムな位置にランダムなサイズで。インスタンスはランダムな移動をし、ステージ枠に当たったら跳ね返る。
    • なんか難しそう−。
    • とりあえず段階踏んで作ってみようとAddボタン押したらランダムな位置に表示させてみた。

var NewCharacter:MovieClip = new Character();

add_btn.addEventListener(MouseEvent.CLICK,xAddClick);

  function xAddClick(evt:MouseEvent):void{
    addChild(NewCharacter);
    NewCharacter.x = Math.floor(Math.random()*501)+50;
    NewCharacter.y = Math.floor(Math.random()*351)+50;
  }

try_06-01_00.fla

    • ちゃんと動いたけど、ボタンクリックの度に古いのが消えて新しいのが生成される。つまり「クリックのたびに」増えていかない。(15時30分)
    • 参考用の完成SWFファイルではクリックごとに増えていった。。。
    • もしかして個数用の変数を置いて、文字列でアセットクラスを指定しろっていうことなのかなー。
    • とか考えて試してみたけど、よく考えたらリンケージ貼ってるのはそもそも「character」一個だけだからその必要なし。
    • とりあえずいっぱい出すの難しいからランダム移動と跳ね返りを実装してみる。
    • まずはランダム移動。

var NewCharacter:MovieClip = new Character();

add_btn.addEventListener(MouseEvent.CLICK,xAddClick);

  function xAddClick(evt:MouseEvent):void{
    NewCharacter.x = Math.floor(Math.random()*501)+50;
    NewCharacter.y = Math.floor(Math.random()*351)+50;
    addChild(NewCharacter);
    NewCharacter.addEventListener(Event.ENTER_FRAME,xMove);
  }

  function xMove(evt):void{
    var xStep:int =Math.floor(Math.random()*10)-5;
    var yStep:int =Math.floor(Math.random()*10)-5;
    NewCharacter.x += xStep;
    NewCharacter.y += yStep;
  }

try_06-01_01.fla

    • これだと毎フレームで方向もステップも決めてることになるので、時々方向とステップを変えてそれ以外はそのままで進むようにしてみる。(16時13分)

var NewCharacter:MovieClip = new Character();
const Ini_STEP = 10;

add_btn.addEventListener(MouseEvent.CLICK,xAddClick);

  function xAddClick(evt:MouseEvent):void{
    NewCharacter.x = Math.floor(Math.random()*501)+50;
NewCharacter.y = Math.floor(Math.random()*351)+50;
addChild(NewCharacter);
xMove();
  }

  function xMove():void{
    var xStep:int =Math.floor(Math.random()*Ini_STEP)-Math.floor(Ini_STEP/2);
    var yStep:int =Math.floor(Math.random()*Ini_STEP)-Math.floor(Ini_STEP/2);
    trace(xStep, yStep);
      for(var i:uint=0;i<10000;i++){
        trace(i);
        NewCharacter.x += xStep;
        NewCharacter.y += yStep;
        if(NewCharacter.x <0 || NewCharacter.x >550){
          xStep *= -1;
        }
        if(NewCharacter.y <0 || NewCharacter.y >400){
          yStep *= -1;
        }
      }
}

try_06-01_02.fla

    • EnterFrame使わないとアニメーションにならず(´Д⊂
    • 難しいなー。。。。(16時46分)

NewCharacter.addEventListener(Event.ENTER_FRAME,xMove(xStep,yStep));
}

function xMove(xx:int,yy:int){
NewCharacter.x += xx;
NewCharacter.y += yy;
if(NewCharacter.x <0 || NewCharacter.x >550){
xx *= -1;
}
if(NewCharacter.y <0 || NewCharacter.y >400){
yy *= -1;
}
}

    • イベントハンドラに引数渡すことって出来ないのかな−。これだとエラーになる。。。(17時07分)
    • ちょっと考えてxStep、yStepをグローバル関数にすることで解決。

var NewCharacter:MovieClip = new Character();
const Ini_STEP = 10;
var xStep:int =0;
var yStep:int =0;

add_btn.addEventListener(MouseEvent.CLICK,xAddClick);

  function xAddClick(evt:MouseEvent):void{
    NewCharacter.x = Math.floor(Math.random()*501)+50;
    NewCharacter.y = Math.floor(Math.random()*351)+50;
    addChild(NewCharacter);
    xStep = Math.floor(Math.random()*Ini_STEP)-Math.floor(Ini_STEP/2);
    yStep = Math.floor(Math.random()*Ini_STEP)-Math.floor(Ini_STEP/2);
    NewCharacter.addEventListener(Event.ENTER_FRAME,xMove);
  }

  function xMove(evt:Event){
    NewCharacter.x += xStep;
    NewCharacter.y += yStep;
    
    
    if(NewCharacter.x <0 || NewCharacter.x >550){
      xStep *= -1;
    }
    if(NewCharacter.y <0 || NewCharacter.y >400){
      yStep *= -1;
    }
  }

try_06-01_03.fla

    • ランダム移動と跳ね返りが実装できた。(17時23分)
    • あとはクリックの度に増やしていく方法。うーん。
    • とりあえず18時まで考えて分からなかったらお手本参照してみよう。

var NewCharacter:Array = new Array();
var i :uint=0;
const Ini_STEP = 10;
var xStep:Array = new Array();
var yStep:Array = new Array();

add_btn.addEventListener(MouseEvent.CLICK,xAddClick);

  function xAddClick(evt:MouseEvent):void{
    NewCharacter[i] = new Character();
    NewCharacter[i].x = Math.floor(Math.random()*501)+50;
    NewCharacter[i].y = Math.floor(Math.random()*351)+50;
    addChild(NewCharacter[i]);
    xStep[i] = Math.floor(Math.random()*Ini_STEP)-Math.floor(Ini_STEP/2);
    yStep[i] = Math.floor(Math.random()*Ini_STEP)-Math.floor(Ini_STEP/2);
    NewCharacter[i].addEventListener(Event.ENTER_FRAME,xMove);
    i++;
}

    • 配列を使ってインスタンスを増やすことに成功。(17時52分)
    • でもxMoveをどうすればいいか分からず。複数のインスタンスを別々にどう動かすか。
    • うーん、なんとなく見えてる気がするんだけど。最後に増やすって遠回りしたのかなー。
    • そして目標時間ちょいオーバーだけど何とか出来た!!!!
    • xStepの代入式勘違いしてて書き直す。最後が「(Ini_STEP/2)」ではなく「(Ini_STEP*2)」。それにともない初期値のIni_STEPも10から5にした。

var NewCharacter:Array = new Array();
var i :uint=0;
const Ini_STEP = 5;
var xStep:Array = new Array();
var yStep:Array = new Array();

add_btn.addEventListener(MouseEvent.CLICK,xAddClick);

  function xAddClick(evt:MouseEvent):void{
    NewCharacter[i] = new Character();
    NewCharacter[i].x = Math.floor(Math.random()*501)+50;
    NewCharacter[i].y = Math.floor(Math.random()*351)+50;
    addChild(NewCharacter[i]);
    xStep[i] = Math.floor(Math.random()*Ini_STEP)-Math.floor(Ini_STEP*2);
    yStep[i] = Math.floor(Math.random()*Ini_STEP)-Math.floor(Ini_STEP*2);
    NewCharacter[i].addEventListener(Event.ENTER_FRAME,xMove);
    i++;
  }

  function xMove(evt:Event){
    for(var j:uint=0; j< NewCharacter.length ; j++){
      NewCharacter[j].x += xStep[j];
      NewCharacter[j].y += yStep[j];
        if(NewCharacter[j].x <0 || NewCharacter[j].x >550){
          xStep[j] *= -1;
        }
        if(NewCharacter[j].y <0 || NewCharacter[j].y >400){
          yStep[j] *= -1;
        }
    }
}

try_06-01_04.fla

    • 実はイマイチ納得できてなくて無理矢理動いてる気がする。EnterFrameの処理がもっと上手なやり方がありそう。
    • そしてサイズがランダムになってないことに気づいた。今から実装。
    • 以下を付け足す。(18時30分)

NewCharacter[i].scaleX = NewCharacter[i].scaleY = Math.random()*2+0.5;

    • 無事動く。
    • ただお手本は壁に当たらずとも途中で早さや向きが変わっていた気がする。
    • あと、壁に当たったかの判定はそれ用の関数にすべきかも。
    • rotationプロパティを使って壁に当たる度に角度が変わるようにするのもありかも。
  • お手本見たらたら全然違うぞー!!!
    • まず配列なんか使ってないし。。。どーゆーことやぁぁぁぁぁ!!!
    • お手本のキモはここですね。

function charaEnterFrame(evt:Event):void {
  var chara:MovieClip = evt.target as MovieClip;

    • イベントリスナー変数「evt」に「.target」とasによる型変換で「chara」に代入ね。なるー。
    • つーか一番ビックリしたのがコレ↓

var newChara:MovieClip = new Character();
  newChara.speedX = xGetSpeed();

    • これって勝手に「speedX」っていうプロパティ作ってませんか?こんなことできるんだっけ?
    • もとのアセットクラスにカスタムプロパティってことかな?
    • それからそもそも、複数のインスタンスが生成できなかったのはリスナー関数の中で生成しなかったからかな。
    • お手本ではクリック用イベントハンドラの中で生成してる。
    • そんなわけで「try_06-01_00.fla」を書き換えてみる。

add_btn.addEventListener(MouseEvent.CLICK,xAddClick);

  function xAddClick(evt:MouseEvent):void{
    var NewCharacter:MovieClip = new Character();
    addChild(NewCharacter);
    NewCharacter.x = Math.floor(Math.random()*501)+50;
    NewCharacter.y = Math.floor(Math.random()*351)+50;
}

try_06-01_00re00.fla

    • うわー、ばっちりうまくいったー。。。。
    • 生成する場所変えるだけ、一行場所変えるだけだったのか−。。。。。
    • 勉強になりましたっっっっっっっっ(ロ_ロ)ゞ

速習Webデザイン ActionScript3.0を読む その5

速習Webデザイン ActionScript 3.0

速習Webデザイン ActionScript 3.0

part5 見えないオブジェクト のつづき

  • 02-02 Arrayオブジェクトの作成と使用
    • 配列に関するメソッドのまとめ
Array.push(データ1,・・・,データn)
データを最後尾に追加し追加後の要素数を返す。
Array.unshift(データ1,・・・,データn)
データを先頭に追加し追加後の要素数を返す。
Array.pop
最後尾の要素を削除し、それを返す。←最後尾を取り出す
Array.shift
先頭の要素を削除し、それを返す。←先頭を取り出す
    • プロパティとしてよく使いそうなの
Array.length
素数
    • pushとpopてC習った学生時代に聞き覚えあり。スッタク関連で出てきた気が。
  • 03-02 for・・・inステートメント
    • Objectオブジェクト自身をtrace()してもカスタムプロパティの内容が取り出せないのでfor inを使う。
    • 書式は以下。

for (変数 in オブジェクト ){
    処理
}

  • Let's TRY!!
    • 与えられたオブジェクトのプロパティを表示させるという課題。
    • 記述したスクリプトは以下。uintをうにっと綴りミスしててエラー食らった(´Д⊂

var pcInfo_array:Array = new Array();
pcInfo_array.push({title:"パリ:サン・ルイ島", price:"\\126", code:"pc001"});
pcInfo_array.push({title:"パリ:セーヌ川1", price:"\\157", code:"pc002"});
pcInfo_array.push({title:"パリ:セーヌ川2", price:"\\126", code:"pc003"});
pcInfo_array.push({title:"パリ:丘からの風景", price:"\\115", code:"pc004"});
pcInfo_array.push({title:"パリ:コンコルド広場", price:"\\157", code:"pc005"});

↓ここから記述
var ArraySize:uint = pcInfo_array.length;

for (var i:uint = 0; i< ArraySize ; i++){
  trace("Array Index=",i);
  var pcInfo_data:Object = pcInfo_array[i];

    for (var propName:String in pcInfo_data){
      trace(propName,pcInfo_data[propName]);
    }
}

    • 一応動いたんだけど出力結果が以下。

Array Index= 0
code pc001
price \126
title パリ:サン・ルイ島
Array Index= 1
code pc002
price \157
title パリ:セーヌ川1
Array Index= 2
code pc003
price \126
title パリ:セーヌ川2
Array Index= 3
code pc004
price \115
title パリ:丘からの風景
Array Index= 4
code pc005
price \157
title パリ:コンコルド広場

    • プロパティの順番が逆になってますね。popだから?
    • お手本の方もこの順番だったからまぁいいか。
  • 04-01 URLRequestクラス
    • 前にバンドのサイト作った時にここで大きく時間取られた。AS2.0の時と全然違うから。
    • がっちり基本から覚えたい。
    • 他のファイルへのリクエストを行う場合のリクエストの情報を扱うのがURLRequestクラス。
    • 書式は以下。

var 変数:URLRequest = new URLRequest(リクエストファイルのURL);

または

var 変数:URLRequest = new URLRequest();
変数.url = リクエストファイルのURL;

    • リクエストファイルのURLは文字列として指定。
  • 04-02
    • で実際にリンク先に飛ぶにはnavigateToURLメソッドを利用。以下の書式。

navigatetoURL(URLRequestオブジェクト,[ターゲット]);*1

    • ターゲットはウィンドウ名とか"_blank"、"_self"、"_parent"とかおなじの。省略した場合は"_blank"となる。
  • Let'sTRY!!
    • クリックで飛べるリンクボタンの作成。
    • 以下のスクリプトで一発OKだった。

const URL01:String = "http://vabune.com";
const URL02:String = "http://gihyo.jp";

link1_btn.addEventListener(MouseEvent.CLICK, xLink01);
  function xLink01(evt:MouseEvent):void{
    var urlReq:URLRequest = new URLRequest(URL01);
    navigateToURL(urlReq,"_blank");
  }

link2_btn.addEventListener(MouseEvent.CLICK, xLink02);
  function xLink02(evt:MouseEvent):void{
    var urlReq:URLRequest = new URLRequest(URL02);
    navigateToURL(urlReq,"_blank");
  }

*1:テキストp145にあるのは誤植っぽいのでちょっと書き換えた

速習Webデザイン ActionScript3.0を読む その4

速習Webデザイン ActionScript 3.0

速習Webデザイン ActionScript 3.0

part5 見えないオブジェクト

  • 01-01 「クラス」について
    • 今までWeb上でAS3を勉強してきてなんとなく分かったような、分かってないような「クラス」について、この本でようやく理解できるのかどうか?!

それぞれのデータ型の機能は仕様書のようなものに定義されています。この仕様書にあたるものが「クラス」です。


「○○○型のデータ」は「○○○クラスのインスタンス」「○○○クラスのオブジェクト」といい換えることができます。

p126 Part5 Lesson-1 STEP01

    • おお、なんとなくすっきりな解説。確かに今まで学んだことを総合すると仕様書っぽい気がする。
  • 01-02 Objectクラスについて
    • 特定の機能や役割を持っていない変わったクラス。
    • Objectクラスのオブジェクト(Objectオブジェクト←ややこしっ!)はカスタムプロパティを設定できる。
  • 01-03 Objectオブジェクトの作成と使用
  • 見えないクラスのオブジェクトはスクリプトで作成。以下の書式。

var 変数 : データ型 = new クラス名() ;

    • 作成したオブジェクトを変数に代入すると、その変数を通してオブジェクトを特定しコントロールできるようになる*1
  • Let's TRY!!
    • Objectオブジェクトを生成してカスタムプロパティに情報を入れていく課題。
    • またしてもテキストフィールドに代入する時に書式間違えた。
正しい書式
title_txt.text
同じ間違え繰り返したの
title_txt:text
    • そんなわけでちゃんと表示できたのは以下。

var pCard:Object ={title:"パリ:サン・ルイ島",price:"\126",code:"pc001"};

title_txt.text = pCard.title;
price_txt.text = pCard.price;
code_txt.text = pCard.code;

*1:ムービークリップインスタンスで言うとプロパティインスペクタでインスタンス名を設定する操作に相当、とのこと

速習Webデザイン ActionScript3.0を読む その3

速習Webデザイン ActionScript 3.0

速習Webデザイン ActionScript 3.0

part4 関数

  • 01-01
    • いままでもイベントハンドラとして普通に関数が出てきてたけどここであらためて解説。
    • イベントハンドラ名の後の「()」にイベントオブジェクトを受け取る変数が必要。このテキストのサンプルでは全て「evt」だった。
  • 02-01
    • このテキストではユーザー定義関数名は「x」から始まっている。
    • 関数の定義と実行は異なるフレームに記述されても問題なし。
  • 02-03
    • 戻り値を返す関数の定義では戻り値のデータ型も指定する。

function 関数名():データ型 {
  処理の記述

  return 戻り値;
 }

    • 戻り値がない場合は「void」型となる。
  • Let's TRY!!
    • テキストフィールドに入力された数値を用意された関数「xAdd」を使って計算し表示させる、という課題。
    • 型の変換がよく分からぬまま以下のようにやってみた。

function xAdd(num1:Number, num2:Number):Number {
  return num1 + num2;
}

add1_btn.addEventListener(MouseEvent.CLICK,xad01);
function xad01(evt):void{
  ans1_txt:text =String(xAdd(in1_txt,in2_txt));←ここでエラーが出てる
}

以下のようにコンパイルエラー。

1120: 未定義のプロパティ text へのアクセスです。
1067: 型 flash.text:TextField の値が、関連しない型 Number に暗黙で型変換されています。

    • まず単純ミスの「ans1_txt:text」を「ans1_txt.text」に直し、「in1_txt」も「in1_txt.text」とそれぞれ直すと動いた。
    • 動いたけど、計算結果が「NaN(Not a Number)」に。
    • そんなわけで「in1_txt.text」も型変換して「Number(in1_txt.text)」とそれぞれ直すとばっちり☆
    • 全体のスクリプトは以下のように記述。

function xAdd(num1:Number, num2:Number):Number {
  return num1 + num2;
 }

add1_btn.addEventListener(MouseEvent.CLICK,xad01);
  function xad01(evt):void{
    ans1_txt.text =String(xAdd(Number(in1_txt.text),Number(in2_txt.text)));
  }

add2_btn.addEventListener(MouseEvent.CLICK,xad02);
  function xad02(evt):void{
    ans2_txt.text =String(xAdd(xAdd(Number(in3_txt.text),Number(in4_txt.text)),Number(in5_txt.text)));
  }

    • 最後の長い行でカッコの閉じミスがあったけど直したらきちんと動いた。
    • 模範解答みたら変数に代入して読みやすくまとまっていた。なるほど!!!(´Д⊂

  var inputNum1:Number = Number(in1_txt.text);
  var inputNum2:Number = Number(in2_txt.text);
  var answerNum:Number = xAdd(inputNum1, inputNum2);

    • とにかく型変換が難しいね。