トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     関数をメインタイムライン上に集結させたいの
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
kombinat
Åê¹ÆNo.3293
投稿日時: 2004-1-30 0:27
新米
居住地: 目黒区
投稿: 13
使用環境:
on 10.3
関数をメインタイムライン上に集結させたいの
各ムービークリップにメソッドを記述するのではなく、メインタイムラインに記述しておいて、必要なときにメインタイムラインから実行するような事は出来ないかと思いスクリプトを書いているのですが。壁に当たってしまいました。アドバイスをいただきたいです。

簡単な例で説明します。

ステージ上に「ball_mc」と言うmcがある状態を考えてください。

// メインタイムライン上フレーム1
function cfMoveRight(targetMc) {
	this[targetMc].onEnterFrame = cfMove(Vx);
}
function cfMove(Vx) {
	this._x++;
}

// メインタイムライン上フレーム2
this.cfMoveRight("ball_mc");
this.stop();

こんなかんじで、左から右にball_mcが動く事を期待していたのですが、動きません。
ball_mcのonEnterFrameで実行されるcfMoveはメインタイムラインのメソッドとして働いている、と言う事だと思うのですが、このcfMoveをball_mcに記述することなくball_mcのメソッドとして動かすようにするためにはどうしたらよいのでしょうか。

よろしくおねがいします。
youich
Åê¹ÆNo.3297
投稿日時: 2004-1-30 1:06
職人
居住地: kobe
投稿: 349
使用環境:
Tiger
Re: 関数をメインタイムライン上に集結させたいの
function cfMoveRight(targetMc) {
	targetMc.onEnterFrame = cfMove;
}
function cfMove() {
	this._x++;
}
// メインタイムライン上フレーム2 
this.cfMoveRight(ball_mc);
this.stop();

と言うかんじでしょうか、、、


もし引数を渡したいのでしたらtargetのMovieClipのプロパティにしてしまうか
function cfMoveRight(targetMc,val) {
	targetMc.val = val;
	targetMc.onEnterFrame = cfMove;
}
function cfMove() {
	this._x += this.val;
}
// メインタイムライン上フレーム2 
this.cfMoveRight(ball_mc,10);
this.stop();

すこし特殊なですがactivationObjectを使ってでしょうか。。。

function cfMoveRight(targetMc, val) {
	targetMc.onEnterFrame = function() {
		cfMove.apply(targetMc, [val]);
	};
}
function cfMove(val) {
	this._x += val;
}
// メインタイムライン上フレーム2 
this.cfMoveRight(ball_mc, 10);
this.stop();


----------------
- yo

野中文雄
Åê¹ÆNo.3298
投稿日時: 2004-1-30 1:08
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 関数をメインタイムライン上に集結させたいの
イベントハンドラメソッドを定義する場合、コールバック関数には括弧()をつけません。

参考: [メソッドもプロパティ]
引用:
kombinatさんは書きました:
ステージ上に「ball_mc」と言うmcがある状態を考えてください。

// メインタイムライン上フレーム1
function cfMoveRight(targetMc) {
	// this[targetMc].onEnterFrame = cfMove(Vx);
	this[targetMc].onEnterFrame = cfMove;
}
function cfMove(Vx) {
	this._x++;
}

// メインタイムライン上フレーム2
this.cfMoveRight("ball_mc");
this.stop();

こんなかんじで、左から右にball_mcが動く事を期待していたのですが、動きません。


----------------
 

kombinat
Åê¹ÆNo.3316
投稿日時: 2004-1-30 12:44
新米
居住地: 目黒区
投稿: 13
使用環境:
on 10.3
Re: 関数をメインタイムライン上に集結させたいの
Fumioさん、Youichiさん、ありがとうございました。
自分のスクリプトに関する知識の根本的な部分があやふやだったみたいで、とっても勉強になりました。
(いろいろとクリアになりました)

いただいたアドバイスを参考に、mcオブジェクトのフェードイン/フェードアウト用の関数を書いてみました。(今回の目的はこれだったんです。)
function fadeIn(targetMc) {
	trace("function fadeIn");
	RATE = 3;
	MODE = 1;  // フェードイン
	targetMc.onEnterFrame = function() {
		cfFader.apply(targetMc, [RATE, MODE, 1]);
	};
}

function fadeOut(targetMc) {
	trace("function fadeOut");
	RATE = 3;
	MODE = 0;  // フェードアウト
	targetMc.onEnterFrame = function() {
		cfFader.apply(targetMc, [RATE, MODE, 1]);
	};
}

function cfFader(theRate, theMode, blnFade) {
	trace("draw");
	if (theMode != 0 && theMode != 1) {
		this.blnFade = 0;
	} else {
		if (theMode == 1) {
			this._alpha += theRate;
			if (this._alpha>=100) {
				this.blnFade = 0;
				delete this.onEnterFrame;
			}
		} else if (theMode == 0) {
			this._alpha -= theRate;
			if (this._alpha<=0) {
				this.blnFade = 0;
				delete this.onEnterFrame;
			}
		}
	}
}

※activationObjectを使うのは特殊なんですか?僕的には、数行を使ってプロパティを設定するよりも使いやすいかなと思ったんですが、どうでしょうか。
もしデメリットなどが有れば教えて下さい。

ありがとうございました
youich
Åê¹ÆNo.3318
投稿日時: 2004-1-30 13:22
職人
居住地: kobe
投稿: 349
使用環境:
Tiger
Re: 関数をメインタイムライン上に集結させたいの
これでは、もし2つのMovieClipにfadeIn,fadeOutをかけようと思ったらうまくいきませんですよ、
例えば、mc1,mc2とステージにおいて
mc1._alpha = 100;
mc2._alpha = 0;
fadeOut(mc1);
fadeOut(mc2);
としてみれば、うまく動かないはずです。。

これは
function fadeIn(targetMc) {
     trace("function fadeIn");
       RATE = 3;
       MODE = 1;  // フェードイン
    targetMc.onEnterFrame = function() {
            cfFader.apply(targetMc, [RATE, MODE, 1]);
       };
}
↑で、RATEとMODEがタイムライン変数(そのタイムラインでのグローバルな変数)になってるので、
一方がfadeInでMODEが0にしても、もう一方がMODEを1に上書きしてしまうからです。
だから
function fadeIn(targetMc) {
     trace("function fadeIn");
      var  RATE = 3;
      var  MODE = 1;  // フェードイン
    targetMc.onEnterFrame = function() {
            cfFader.apply(targetMc, [RATE, MODE, 1]);
       };
}

↑のようにRATE,MODEにvarをつければローカル変数になり
functionの中で生成されたfunction(onEterFrame)からは
activationObjectの中の変数RATE,MODEとして個別にアクセスできます。

引用:
※activationObjectを使うのは特殊なんですか?僕的には、数行を使ってプロパティを設定するよりも使いやすいかなと思ったんですが、どうでしょうか。
もしデメリットなどが有れば教えて下さい。

ぼくは、好きなんですが(^^;
例えば、XMLonLoadのcallback先を指定する場合なんか重宝すると思います。
デメリットとして、activationObjectを利用するということは、余分にメモリーを消費することになるから、よくないという意見があります。

今回のfunction fadeInではactivationObjectを使うメリットがそう感じられませんから、
function fadeIn(targetMc) { 
    
    targetMc.RATE = 3; 
    targetMc.MODE = 1;  // フェードイン 
 targetMc.onEnterFrame = cfFader;
}

function cfFader() {
    
    if (this.MODE != 0 && this.MODE != 1) {
        this.blnFade = 0;
    } else {
        if (this.MODE == 1) {
            this._alpha += this.RATE;
            ...

            

のほうがよいんじゃないかなぁと思います。


----------------
- yo

野中文雄
Åê¹ÆNo.3321
投稿日時: 2004-1-30 14:30
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 関数をメインタイムライン上に集結させたいの
変数がタイムラインに設定されてしまっていることの問題点は、youichさんのいわれたとおりです。それから、変数theModeの値判定を、MovieClip.onEnterFrameメソッドの関数内で毎フレーム行うのは、無駄な感じがします。また、theModeの値が1と0の場合を分岐処理するなら、elseアクションでそのどちらにも当てはまらない(theMode != 0 && theMode != 1)場合が残るはずです。
function fadeIn(targetMc) {
	trace("function fadeIn");
	targetMc.RATE = 3;
	targetMc.MODE = 1;
	// フェードイン 
	cfFader(targetMc);
}
function fadeOut(targetMc) {
	trace("function fadeOut");
	targetMc.RATE = 3;
	targetMc.MODE = 0;
	// フェードアウト 
	cfFader(targetMc);
}
function cfFader(target_mc) {
	if (target_mc.MODE == 1) {
		target_mc.onEnterFrame = cfFadeIn;
	} else if (target_mc.MODE == 0) {
		target_mc.onEnterFrame = cfFadeOut;
	} else {
		cfFadeStop.apply(this);
	}
}
// MovieClip適用メソッド
function cfFadeIn() {
	this._alpha += this.RATE;
	if (this._alpha>=100) {
		this._alpha = 100;
		cfFadeStop.apply(this);
	}
	trace(["in", this, this._alpha]);  // テスト用
}
function cfFadeOut() {
	this._alpha -= this.RATE;
	if (this._alpha<=0) {
		this._alpha = 0;
		cfFadeStop.apply(this);
	}
	trace(["out", this, this._alpha]);  // テスト用
}
function cfFadeStop() {
	delete this.MODE;
	delete this.RATE;
	this.blnFade = 0;
	delete this.onEnterFrame;
}

引用:
kombinatさんは書きました:
function fadeIn(targetMc) {
	trace("function fadeIn");
	RATE = 3;
	MODE = 1;  // フェードイン
	targetMc.onEnterFrame = function() {
		cfFader.apply(targetMc, [RATE, MODE, 1]);
// [中略]
function fadeOut(targetMc) {
	trace("function fadeOut");
	RATE = 3;
	MODE = 0;  // フェードアウト
	targetMc.onEnterFrame = function() {
		cfFader.apply(targetMc, [RATE, MODE, 1]);
// [中略]
function cfFader(theRate, theMode, blnFade) {
	trace("draw");
	if (theMode != 0 && theMode != 1) {
		this.blnFade = 0;
	} else {
		if (theMode == 1) {
// [中略]
		} else if (theMode == 0) {
// [中略]
		}
	}
}

Activationオブジェクトは、実際に参照しているローカル変数だけでなく、関数ブロック内のローカルスコープのすべてのプロパティを保持します。ですから、不要なローカル変数がメモリを占有している場合には、あまり望ましくないといわれます。また、ローカル変数への参照は、不要になったら確実に破棄しておかないと、ずっと残ってしまう危険性もあります。ですから、使用には注意が必要だということです。

私は、1回使ったらすぐ捨ててしまうような処理に利用しています。setInterval()関数で、処理のタイミング待ちをして、処理し終えたら即clearInterval()でクリアするような場合です(setInterval()の戻り値をローカル変数に保持)。
引用:
※activationObjectを使うのは特殊なんですか?僕的には、数行を使ってプロパティを設定するよりも使いやすいかなと思ったんですが、どうでしょうか。
もしデメリットなどが有れば教えて下さい。


----------------
 

加藤達雄
Åê¹ÆNo.3323
投稿日時: 2004-1-30 15:11
新米
居住地: 東京
投稿: 24
使用環境:
Win XP Pro
MX Pro 2004
Re: 関数をメインタイムライン上に集結させたいの
イベントハンドラを設定する際は、Activation Objectが大変重宝すると私も思います。例えばフェードイン、フェードアウトの例ですと、こんなふうにも書けますね。
function fade(mc, rate) {
    var isInRange = (rate > 0) ? function(){return mc._alpha<=100;}
                               : function(){return mc._alpha>=0;};
    mc.onEnterFrame = function() {
        if (isInRange()) {
            this._alpha += rate;
        } else {
            delete this.onEnterFrame;
        }
    };
}

//使用例
button1.onRelease = function() {
    fade(my_mc, 3);
};
button2.onRelease = function() {
    fade(my_mc, -3);
};

delete this.onEnterFrame と同時にActivation Objectは参照されなくなり、自動的にガベージコレクトされます。
youich
Åê¹ÆNo.3324
投稿日時: 2004-1-30 15:25
職人
居住地: kobe
投稿: 349
使用環境:
Tiger
Re: 関数をメインタイムライン上に集結させたいの
あ、、katoさん、コードの部分は<code>を[...]ではざむと等幅になりますよ、
後、タブ->スペースの置換をしてからコードをペーストするときれいにインデントされるようです。

引用:

<code>function fade(mc, rate) {


----------------
- yo

加藤達雄
Åê¹ÆNo.3325
投稿日時: 2004-1-30 15:35
新米
居住地: 東京
投稿: 24
使用環境:
Win XP Pro
MX Pro 2004
Re: 関数をメインタイムライン上に集結させたいの
引用:

youichさんは書きました:
あ、、katoさん、コードの部分は<code>を[...]ではざむと等幅になりますよ、
後、タブ->スペースの置換をしてからコードをペーストするときれいにインデントされるようです。


はい、何せ新米なもので・・・(^^;
今までタグをミスったことはなかったんですけど、久しぶりのポストでボケてました。修正しました。m(_._)m
タブのインデント幅の設定は確かに少し長すぎるのかもしれないですね。。
kombinat
Åê¹ÆNo.3333
投稿日時: 2004-1-30 16:39
新米
居住地: 目黒区
投稿: 13
使用環境:
on 10.3
Re: 関数をメインタイムライン上に集結させたいの
1つの事を実現しようとした場合でも、Fumioさん的表現とKatoさん的表現の様にすごく大きな作り方の違いが出てくるのがおもしろいですね。僕はその辺ですごく困っていて(迷ってしまう)、自分のスクリプトのスタイルを確立しきれないのですが・・・。

人生相談みたいで、すいません。

自分なりにかみ砕いて、こんなコードになりました。
function cfFadeAction(mc, rate) {
	mc.RATE = rate;
	mc.onEnterFrame = cfFader;
}

function cfFader() {
	if (this._alpha>=0 && this._alpha<=100) {
		this._alpha += this.RATE;
	} else {
		delete this.onEnterFrame;
		delete this.RATE;
	}
}


// メインタイムラインから実行
this.cfFadeAction([mc名], 3) ;


何か有りましたら、バンバン指摘してください。
お願いします。
(1) 2 3 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops