ActionScriptの最近のブログ記事

仕事が忙しくてプルタブを更新している暇がありません。
ごめんなさい。pulltabのSEOも最近落ちてきているので、やり直さなければなりません。
あうー。

本題

ボタンインスタンスbtn0~btn9の合計10個ある場合、
どれを押されたかを検出するには、一つ一つにコードを書き、フラグで検出するよりは
関数に飛ばして、関数内でfor文で処理させたほうが短くて済む。

for(i=0;i<10;i++){
    btnOnRelease(i);
}

function btnOnRelease(_num){
    this["btn"+i].onRelease = function(){
        trace("btn"+i+" is released");
    }
}


たとえばこんな感じ
3Dプログラミングできます。何でもご相談ください。
たとえばっすよ!先輩!

        switch (this._name) {
        case "mcSamnail1" :
            nImgNum = 1;
            break;
        case "mcSamnail2" :
            nImgNum = 2;
            break;
        case "mcSamnail3" :
            nImgNum = 3;
            break;
        case "mcSamnail4" :
            nImgNum = 4;
            break;
        case "mcSamnail5" :
            nImgNum = 5;
            break;
        case "mcSamnail6" :
            nImgNum = 6;
            break;
        case "mcSamnail7" :
            nImgNum = 7;
            break;
        case "mcSamnail8" :
            nImgNum = 8;
            break;
        case "mcSamnail9" :
            nImgNum = 9;
            break;
        case "mcSamnail10" :
            nImgNum = 10;
            break;
        case "" :
            nImgNum = Math.floor(1+Math.random()*6);
            break;
        default :
            //nImgNum = Math.floor(1+Math.random()*6);
        }


こいつを・・・
ActionScriptでの変数の罠です。仕事で1時間ほどはまったのでメモ。下記の二つのスクリプトを見比べてください。ActionScriptの書き出し設定を1.0のままにして、うっかりActionScript2.0で記述してしまいハマる人もおおいのでは?実は私も・・・


① AS1.0で正解
onClipEvent (load) {
    nSpd = 4;
    nTempWidth = 1200;
    trace(nTempWidth);
}
// 実行結果
// 1200

②AS1.0では間違い
onClipEvent (load) {
    var nSpd:Number = 4;
    var nTempWidth:Number = 1200;
    trace(nTempWidth);
}
// 実行結果
// undefined


ActionScript書き出し設定1.0
Flash MX2004pro
WindowsXP sp2
記事修正:12:29 2008/02/08

ActionScript スコープ this. のfunction内における動作の検証

ムービークリップ_root.mcHogeにASを書き込む。他にムービークリップ_root.mcPiyoを作成しておく。

/*:mcHoge:*/
onClipEvent ( load ){
    //
    _parent.mcPiyo.onRelease = function () {
        trace("_name = " + _name);
        trace("this._name = " + this._name);
    };
}


実行結果
_name = mcHoge
this._name = mcPiyo


う~ん、マンダム 謎は深まるばかり。


WindowXP sp2
Flash MX 2004 pro
Flash player 7
img01_080118.jpg

7レイヤー(下から順に"Layer01"~"Layer07")ぐらいに分けて、それぞれにムービークリップ(以下、MC)等を配置し、ActionScript(以下、AS)で動かしている状況で、あるレイヤー"Layer04"にあるMC(仮にインスタンス名を"mc_menu"とします)の動作をASで制御したとします。たとえば

this.mc_menu.onLoad = function () {
    //ステートメント記述
}

の様な具合でインスタンスmc_menuを制御したりしてね。で、
その二つ下のレイヤー"Layer02"自体にはAS以外記述せず空レイヤー(ステージには何も配置しない状態)のまま実行すると

二つ上のレイヤー"Layer04"にあるオブジェクトが一切表示されませんでした。

上記の画像だと"Layer02"にあたるのが「loadMC背景+AS」レイヤー。"Layer04"にあたるのが「subMenu」レイヤーです。まぁ、二つ下のレイヤーを空にしなければ大丈夫なのでどうとでもなる小さな事なのですけどね。 原因不明です。お分かりになる方がいらっしゃったらコメントをいただけると幸いです。丸1日はまってしまいました。

img01_080117.jpg

ActionScript、解りやすい独自の書き方

 定数、変数、関数、クラス名、ムービークリップ、ボタン、グラフィック、オブジェクトなどなどの名前をつける際は、先頭の文字を小文字にし単語の切れ目において次の文字を大文字にしてみる。

例: var hogeHoge;

関数名の場合、先頭に文字は何もつけない。関数利用の際はfeedReader();の様に、必ず()まで記述すること。でもこれだとmy_mc.onEnterFrame = feedReader();みたいな形としては利用できないんですよね。すこし考えないといけないかもです。

function feedReader(){
// ここにステートメントを記述
}

feedReader();

記述方法の違いでたとえば

my_mc.onEnterFrame = feedReader();

だと動作しないのに

my_mc.onEnterFrame = function (){
feedReader();
}

こういう書き方だと動作するのは何故なのでしょう・・・。

 変数名の場合、Number型ならn、string型ならs、 boolean型true or flaseならb、フラグ(1 or 0 or -1などの例外処理)ならfを変数名の先頭につける。

  • var nHoge:Number = 15;
  • var sText:String = 'hogehoge';
  • var bFlag:Boolean = true;
  • var fFlag:Number = -1;

ムービークリップなら先頭にmc、ボタンならbtn、グラフィックならgr、オブジェクトならobj。インスタンス名も同じように対処する。

定数はすべて大文字で単語の切れ目に_(アンダースコア)を使う。
定数の場合も同じように先頭小文字で型判別する。

var sVAL_ALPHA

ググればググる程、人によって記述の仕方が異なるので、一番良い方法を見つけたいとおもう今日この頃。とりあえずこの方法でやってみて不具合が出たらまた考えて見ます。最終的には非公式テクニカルノートの野中さんやyougopと同じ記述方法にしてみたいですね。

IMAJUK別窓)さんというサイトのブログでAS2とAS3の違い(その1)|(別窓)で興味深い一節を見つけました。

どうやらAS3でようやくMovieClipがnewできるようになったらしいのです。
しかし、 flash:ムービークリップそれはオブジェクトの一部なのか?というエントリ内で書いたように、なぜかMX2004pro、FlashPlayer7、winXPsp2の環境下でMCをnewできてしまっています。とりあえずトラックバックを送ってみよう。

07/12/21追記

この記事は私の勉強不足による勘違いの可能性が高いです。異なるスクリプトを試してみたところMovieClipはnewできていませんでした。

mc_submenu = new MovieClip();
mc_submenu.onEnterFrame = function(){
    trace("aiueo");
}
このソースコードにおいてEnterFrame内のtraceは実行されません。
img01_071220.gif
flashのマニュアルを呼んでいると「データ型について」という項目があります。そこには

  • ストリング (String) データ型
  • 数値 (Number) データ型
  • ブール (Boolean) データ型
  • オブジェクト (Object) データ型
  • MovieClip データ型
  • ヌル (Null) データ型
  • 未定義 (Undefined) データ型
  • Void データ型
この8個のデータ型がある訳ですが、これは本当に正しいのか?とよく考えると疑問が沸いてきます。

前回の記事(ActionScript:object.onRelease、object.onEnterFrame関数の二重入れ子)で return();では入れ子にしたonEnterFrameを抜け出せないと書いていましたが、別の方法で抜け出せるようです。

あるムービークリップ mcAに以下のようなコードを打ち込み、実行してみます。ActionScript上では、このコードは不正確で正しくありません。ActionScriptではonClipEventハンドラの二重入れ子は出来ないことになっております。が、なぜかコンパイルを通ってしまいますのでよしとします。

onClipEvent (load) {
    this.onPress = function(){
        trace("push");
        this.onEnterFrame = function(){
            trace("enterframe");
        }
    }
    this.onRelease = function(){
        delete this.onEnterFrame;
        trace("release");
    }
}

実行するとボタンを押している間
push
enterframe
enterframe
    ・
    ・
    ・
と表示され、ボタンを離すと
release
と表示されenterframeが終わり(削除され)ます。


関連記事:ActionScript:object.onRelease、object.onEnterFrame関数の二重入れ子

BROADCASTing

うにくろっく

pulltaBlogParts ばーじょんべーた

ごめんなさい無断転載しております。 引用元忘れました。まずい場合はご連絡ください。直ちに取り消します。

このアーカイブについて

このページには、過去に書かれたブログ記事のうちActionScriptカテゴリに属しているものが含まれています。

次のカテゴリはCSSテクニックです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.1

2008年11月

            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30