D0805051 ループする関数をクリック等のイベントと直接関連付ける
Name Deep
Date 2008年05月05日 (月) 06時15分
Message こんにちは。初めまして。
最近ここを見つけたのですが、あまりの内容の濃さに目眩すら覚えてます。

今までフレームを使ったアニメーションは作っていたのですが、scriptも書けるようになりたいと思い、最近色々と専門書を購入し、空いた時間に少しづつ独学しています。
スクリプト歴は一月程度の超初心者です。
早速壁にぶつかった様で、恥ずかしながら投稿させていただきました。
以下のような疑問です。

例えば、MCが水平移動していく様なスクリプトがあるとします。

var gX:Number = 100; //移動先の座標

function idou(){
this._x += (gX - this._x)/3;
}

で、_root上にaa_mcと、bb_mc(これをボタンとして扱う。)の2つのムービークリップがあり、

bb_mcをクリックした時に、idou関数を呼び出したいとします。

var aa:MovieClip = "_root.aa_mc";

bb_mc.onRelease = function(){
eval(aa)._x += (gX - eval(aa)._x)/3;
}

等とすれば、bb_mcに対するアクションで、idouメソッドはaa_mcに対して反応しますが、勿論ループしてないので、1回ぶんしか移動はしません。

aa_mc.onEnterFrame = idou;

とすれば、移動はするわけですが、そうなるとbb_mcのイベントハンドラプロパティとの関連付けが途端に良く分らなくなってしまいます。

“ループする関数をクリック等のイベントと直接関連付ける”つまり、この例で言いますと、“bb_mcに対して何かアクションを起こすと、aa_mcにidouメソッドが適応され、そしてループ再生される”という凄く単純な動作です。

ひっかかるのは、色々と他の方のスクリプトを見てみたのですが、これだけの単純な動作の為に、ひどく回りくどいコードを書いている様な印象を受けました。(自分の圧倒的な知識不足かもしれませんが)

こういった動作を解決する為の、シンプルな方法、お決まりの構文などがあるのでしたらお教え願えないでしょうか?

下らない質問でしたら、お手間をおかけして申し訳ないのですが、とても知りたいです。(今AS2.0から始めています。)

よろしくお願いいたします。
Response 01
2008年05月05日 (月) 08時41分> TOYAMA 
下記に2つの例を揚げておきます。しかし、my1_mcとmy2_mcはムービークリップのインスタンス名です。
例1:onEnterFrameを使用した例
var q:Number = 500;
function idou(mc:MovieClip):Void {//移動する関数を定義
this.onEnterFrame = function() {
mc._x += (q-mc._x)/3;
if (Math.abs(q-mc._x)<=1) {//接近した時の処理
mc._x = q;
delete this.onEnterFrame;//onEnterFrameを削除
}
};
}
my1_mc.onRelease = function() {
idou(my2_mc);
};
my2_mc.onRelease = function() {
idou(my1_mc);
};

例2:Tweenを使用した例
import mx.transitions.Tween;
var q:Number = 500;
function idou(mc:MovieClip):Void {
//Tweenを使用して2秒で現在位置からqまで移動する
new Tween(mc, "_x", easing.Strong.easeOut, mc._x, q, 2, true);
}
my1_mc.onRelease = function() {
idou(my2_mc);
};
my2_mc.onRelease = function() {
idou(my1_mc);
};
http://www.geocities.jp/jin_toyama/index.html
Response 02
2008年05月05日 (月) 13時20分> joy   
Deepさん、TOYAMAさん、
今日は。
>“ループする関数をクリック等のイベントと直接関連付ける”つまり、この例で言いますと、“bb_mcに対して何かアクションを起こすと、aa_mcにidouメソッドが適応され、そしてループ再生される”という凄く単純な動作です。

このループという意味が良く、分かりませんが、とりあえず、2つのMCが押されて、移動も終了したなら、自動的に、元の位置に戻るという意味に解釈し、TOAYAMAさんのscriptに、少し、追記してみました。(TOAYAMさんが、このサイトで、以前から、TWEENクラス使用の効果と手軽さを教えて下さってます。TOYAMAさん、勝手に、追記させて頂きましたが、以下の追記内容でおかしくないでしょうか? ご指摘があれば、また、ご指導下さい)


import mx.transitions.Tween;

/*〜追記分:ここから〜*/
var theX = my1_mc._x;//最初に配置された、X座標を変数に保管
var Ceck1:Boolean=false;//my1_mcが押されたかどうかの制御変数で、初期値は、false
var Check2:Boolean=false;//上と同様
/*〜ここまで〜*/

var q:Number = 500;

function back(mc:MovieClip):Void{//追記分:下のidou();で使うので、idou();の前に記載しておく
var Tween_back:Tween=new Tween(mc, "_x", easing.Strong.easeOut, mc._x, theX, 2, true);
}

function idou(mc:MovieClip):Void {
//Tweenを使用して2秒で現在位置からqまで移動する
var Tween_idou:Tween = new Tween(mc, "_x", easing.Strong.easeOut, mc._x, q, 2, true);

/*〜以下追記分:移動が両方とも終了したら、元の位置に戻して、ループの準備をさせる〜*/
Tween_idou.onMotionFinished=function():Void{//Tween_idouが終了して、
if(Check1 && Check2){//2つのmcともに、押されていたなら、
back(my1_mc);//back();を実行
back(my2_mc);//back();を実行
Check1=Check2=false;//my1_mcとmy2_mcの制御変数を初期値に戻す
}
}
/*〜ここまで〜*/
}


my1_mc.onRelease = function() {
Check1=true;//追記分:押されたら、制御変数 Checkをtrueにする
idou(my2_mc);
};
my2_mc.onRelease = function() {
Check2=true;//追記分:同様に、押されたら、制御変数 Checkをtrueにする
idou(my1_mc);
};
Response 03
2008年05月05日 (月) 14時23分> TOYAMA   
joyさん良く勉強されていますね。
2つのブービークリップとも移動後、最初の位置に戻すにはこれでOKです。
http://www.geocities.jp/jin_toyama/index.html
Response 04
2008年05月05日 (月) 14時54分> joy 
TOYAMAさん、
今日は。
コメント、ありがとうございます。
後、XMLについては、TOYAMAさんが紹介されていた、「XML for Flash by Sas Jacobs」を購入して、勉強始めましたが、読破するには、まだまだの感があります。
どうしても、分からなくなったら、また、教えてください。
Response 05
2008年05月05日 (月) 18時40分> Deep 
こんにちは。早々のレスありがとうございます。
周りにはスクリプトを書ける人が一人も居ないので、凄くありがたいです。

>>TOYAMAさん、joyさん:
丁寧な解説ありがとうございます。

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
例1:onEnterFrameを使用した例 ですが、

・「カスタムメソッド定義内にて、イベントハンドラを記述可能」 という事を知りませんでした。
イベントハンドラプロパティ というのは、何か特別な仕様のような気がしていたのですが、“一種のMovieClipクラスインスタンスのプロパティ” という理解で良いのでしょうか?

・function idou(mc:MovieClip):Void {//移動する関数を定義
this.onEnterFrame = function() {

ここの"this"は、メインのタイムラインを指すという理解であってますか?

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
例2:Tweenを使用した例 ですが、

・まだ基本的なクラスしか勉強出来てなくて、Tweenクラスっていうのがあるというのを初めて知りました。また調べてみます。

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

後、解説を御聞きして、自分の混乱の原因がなんとなくはっきりとしたのですが、

1、あらかじめ、引数をとるカスタム関数を定義する。
例:
function funkName(引数1,引数2){
statement;
}

2、あるMCに何かアクションがあった時に、funcNameを起動させたい時、
例:
MC.eventHandler = funkName;
とした場合、この代入の書式では、引数を渡せないといった事が起こりますよね?

3,そうした場合、以下の様なコールバック関数をまた書き直さないといけなくなる。
例:
MC.eventHandler =function(引数1,引数2){
statement;
}

4,???なんかすっきりとしないな〜。という思考の流れです。

その場合(引数をとるカスタムメソッドを、あるイベントハンドラによってコールする場合)、
MC.eventHandler =function(){
funcName(引数1,引数2);
}
という様に、書けば良いのですか?


なんだか初歩的な質問攻めで申し訳ないです(^ ^;)。

早く上達して、思う様にスクリプトが書けたら楽しいだろうな〜と思います。

自分の様に、周りに聞ける人がいない者にとっては、ここはとてもありがたい場です。
Response 06
2008年05月05日 (月) 19時45分> TOYAMA 
this.onEnterFrameのthisはルートのタイムラインを指すと解釈します。

MC.eventHandler =function(引数1,引数2){
statement;
}
これは、どうのような場合に使用するのでしょうか。
この形は正常に動作しない場合があり、私は使用していません。
my1_mc.onRelease = function() {
idou(my2_mc);
};
のように関数呼び出しはステートメントの中に書いた方が無難でしょう。idou(my2_mc);のように引数も指定できます。
http://www.geocities.jp/jin_toyama/index.html

このページの先頭へ