D0804291 ボタンを押すと何秒後かに、他のページに飛ばす…(複数MC編)
Name トモ
Date 2008年04月29日 (火) 18時04分
Message 憲ちゃんさんいつもサイトを参考にさせてもらってます。
今日は思い切って質問させていただきます。よろしくお願いします。

現在、
D0212061 ボタンを押すと何秒後かに、他のページに飛ばすには?
を参考にボタンを作成しているのですが、
目標が複数のボタンを動かことなので、そこからどうしたらいいのか悩んでいます。

例えば上記記事の3つのボタンのいずれかを押すと、
全てのボタンがフェードアウトしてから他のページに飛ばす…などです

全てのボタンに共通するスクリプトを他に書いたりするのでしょうか…?
どうすればいいのか想像もつかずに困っています。どうぞよろしくお願いします。
Response 01
2008年04月29日 (火) 21時58分> daniwell 
やり方はいろいろあるかと思いますが、、、

フェードアウトの場合で考えます。

ボタンを作ってステージに配置し、
それぞれのインスタンス名に "b0", "b1", "b2" と名付けてください。

そしてルート上のフレームに以下のスクリプトを記述します。


b0.onPress = function ( ) {
    func_fadeout( "http://www.google.co.jp/" );
}
b1.onPress = function ( ) {
    func_fadeout( "http://www.yahoo.co.jp/" );
}
b2.onPress = function ( ) {
    func_fadeout( "http://jp.msn.com/" );
}

function func_fadeout ( address :String ) {

    _root.al = 100;
    _root.address = address;

    /* 設置しているボタンの分だけループ */
    for ( var i = 0; _root[ "b"+i ] != undefined; i ++ )
        _root[ "b"+i ].enabled = false;  // ボタンを押せなくする

    _root.onEnterFrame = function ( ) {

        this.al -= 5;  // アルファの値を 5 マイナス

        /* 設置しているボタンの分だけループ */
        for ( var i = 0; _root[ "b"+i ] != undefined; i ++ ) {
            var mc = _root[ "b"+i ];
            mc._alpha = this.al;
        }
        if ( this.al == 0 ) {  // アルファが 0 になったら
            this.getURL( this.address );  // 別ページへジャンプ
            delete this.onEnterFrame;  // エンターフレームを削除
        }
    }
}


ボタンを押すと、移動先のアドレスを引数にして
関数 func_fadeout を呼び出すという風になっています。

アルファが 0 になったらそのページへ飛びます。

ボタンを追加したい場合は、順次、"b3", "b4" … と追加できます。

例)
インスタンス名に "b3" と名付けたボタンを配置し、スクリプトに以下の記述を加える

b3.onPress = function ( ) {
    func_fadeout( "http://www.excite.co.jp/" );
}


スクリプトを読むと分かるかと思いますが、
ボタンのインスタンス名は、"b0"から順に、"b1","b2","b3" …
とあいだを飛ばさずに名付けないと上手く動作しません。

また、別ページへ移動する際、新しいウィンドウを開くようになっていないので、
新しいウィンドウを開きたい場合は以下のようにする必要があります。

this.getURL( this.address );
    ↓
this.getURL( this.address, "_blank" );


あ、あと、このスクリプトでは、
一度押してしまうとブラウザを更新しないとボタンが出現しません。
Response 02
2008年04月30日 (水) 02時26分> joy 
トモさん、daniwellさん、
今晩は。というか。おはようございますでしょうか?
daniwellさんの方法とは少し違った方法で、サンプル作ってみました。違いは、ボタンを押した後の、何秒後に、urlにリンクするという方法です。もちろん、ボタン消失までの時間を計算に入れた上で、時間の設定を行う必要があります。(実は、以前、daniwellさんに、setIntervalの正確性を教えて貰っていましたので、これを使ってみた次第であります)

1)とりあえず、ボタンは3つ(実態は、MovieClipボタンです)とホームポジションに戻るボタン(コンポーネントのボタン使用)の計4つのケースで行いました。
2)シーンの第一フレームに、

this.stop();
var Check:Boolean = false;//btn1_mcからbtn3_mcを動かすかどうかを決める、制御変数で、初期値は、false。
var theX:Number = btn1_mc._x;//最初に配置された、btn1_mcの_xを変数 theXに代入して、保存する。
var theURL = "";//リンク先の初期値は、blankとする

for (i=1; i<=3; i++) {//3つなので、for文を使う必要もないですが、練習です。
this["btn"+i+"_mc"].onEnterFrame = function():Void {
if (Check && this._x<=450) {//制御変数が、trueで、且つ、X座標が、450以内なら、以下の等速運動を行い、alpha値も小さくして、透明度を増す。
this._x += 10;
this._alpha += (0-this._alpha)/10;//少しずつ、透明度を上げたい場合は、このようにします。分母の10より大きい数字を入れると、ゆっくり、透明になります。
}
};
}

function Link(theURL) {//setIntervalで呼び出す、カスタム関数の定義
getURL(theURL, "_blank");
nextFrame();//次のフレームに進み、clearInterval(myTime);を行う。行わないと、5秒間隔で、該当URLが次々と立ち上がってしまいます。
}


btn1_mc.onRelease = function():Void {
Check = true;//クリックされたら、制御変数を、trueにして、自らを動かし、
theURL = "http://hfm-kenchan.com";//URLに、適当なURLを代入する。
myTime = setInterval(Link, 5000, theURL);//5秒間隔で、Link(theURL)を呼び出す。
};

btn2_mc.onRelease = function():Void {
Check = true;
theURL = "http://www.google.co.jp";
myTime = setInterval(Link, 5000, theURL);
};

btn3_mc.onRelease = function():Void {
Check = true;
theURL = "http://www.infoseek.co.jp";
myTime = setInterval(Link, 5000, theURL);
};

back_btn.onRelease = function():Void {
prevFrame();//btn1_mc〜btn3_mcで第二フレームに移動するので、第一フレームに戻します。
Check = false;//クリックされたら、btn1_mcからbtn3_mcのEnterFrameによる、動きを停止させる
for (i=1; i<=3; i++) {
_root["btn"+i+"_mc"]._x = theX;//元の位置に戻します。
_root["btn"+i+"_mc"]._alpha = 100;//上のEnterFrameで透明になったものを、100に戻します。
}
};

3)シーンの第二フレームのscriptレイヤーに、

clearInterval(myTime);//第一フレームで、設定した、myTimeを削除します。しないと、5秒間隔で、URLが次々と立ち上がってしまいます。

と記載してるだけです。

尚、3つのボタンが同じ動きをしてますが、違う動きをさせるには、for文を使わずに、個別にスクリプトを記載すれば、お好みの動きを与えることが出来ると思います。

ご参考までに。
http://homepage2.nifty.com/joys/answers/3btnsfout.html
Response 03
2008年04月30日 (水) 10時35分> トモ 
daniwellさん、joyさん>
とても詳しく記述していただいて有難うございます!(joyさんサンプルまで本当に助かります)
順を追って見れるのでとても見やすく、分かりやすいです!

しかしこんなに大変なものだったとは…もう少し簡単なものだとかなり甘く考えてました
まだまだ初心者の身なのでfor文の事など少し勉強してからでないと…;
すぐには出来そうにありませんが、その日を夢見て頑張ります!

本当に有難うございました!(また何かあったらよろしくお願いします…;)
Response 04
2008年04月30日 (水) 14時20分> TOYAMA 
Tweenクラスを使用すると比較的容易に実現できます。一例を下記に示します。
import mx.transitions.Tween;
var m:Number;
var n:Number;
function controllBotton(Void):Void {//ボタンの動作を非動作にして透明度を変化させる関数
for (var i:Number = 1; i<=3; i++) {
this["my"+i+"_btn"].enabled = false;//ボタンを非動作
//3つのボタンを3秒で透明度を100から0に変化させる
new Tween(this["my"+i+"_btn"], "_alpha", easing.None.easeNone, 100, 0, 3, true);
}
n = setInterval(callURL, 3000);//3秒後にcallURL関数を呼び出す
}
function callURL(Void):Void {//メーラーとWebページを呼び出す関数
clearInterval(n);//クリアの処理
switch (m) {
case 1 :
getURL("mailto:jin_toyama@yahoo.co.jp", "_self");//メーラーを起動する
break;
case 2 :
getURL("http://hfm-kenchan.com/", "_blank");//別ウィンドウでWebページを開く
break;
case 3 :
getURL("http://www.geocities.jp/jin_toyama/index.html", "_blank");//別ウィンドウでWebページを開く
break;
}
}
my1_btn.onRelease = function() {//ボタン1を押した時の処理
m = 1;
controllBotton();
};
my2_btn.onRelease = function() {//ボタン2を押した時の処理
m = 2;
controllBotton();
};
my3_btn.onRelease = function() {//ボタン3を押した時の処理
m = 3;
controllBotton();
};
http://www.geocities.jp/jin_toyama/index.html
Response 05
2008年05月05日 (月) 04時01分> joy 
トモさん、
今晩は。
daniwellさんやTOYAMAさんの方法も研究しようと、私のサンプルを弄っていたら、重大なBUGがあることが分かりました。
【BUGの内容】
・ボタンが消失する前に、back_btnを押すと、第二フレームに移動しないので、clearIntervalが効かず、次々とURLが、5秒間隔で立ち上がってしまいます。これは、立派なBUGです。
【訂正内容】

back_btn.onRelease = function():Void {
if (_currentframe == 2) {//第一フレームにMCがある内に、back_btnを押すと、clearIntervalが効かずに、次々とURLが立ち上がるので、第二フレームに移動した後でないと、以下のスクリプトは効かせないようにしました。
prevFrame();//btn1_mc〜btn3_mcで第二フレームに移動するので、第一フレームに戻します。
//Check = false;//クリックされたら、btn1_mcからbtn3_mcのEnterFrameによる、動きを停止させる→第一フレームで停止するので、こいつが重大BUGの原因でした。
for (i=1; i<=3; i++) {
_root["btn"+i+"_mc"]._x = theX;//元の位置に戻します。
_root["btn"+i+"_mc"]._alpha = 100;//上のEnterFrameで透明になったものを、100に戻します。
}
}
};

これを参考にサイト作成してないと思いますが、重大BUGなので、サンプルも訂正いたしました。失礼しました。

このページの先頭へ