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

パスワード:


パスワード紛失

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

スレッド表示 | 古いものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
加藤達雄
Åê¹ÆNo.3461
投稿日時: 2004-2-2 16:59
新米
居住地: 東京
投稿: 24
使用環境:
Win XP Pro
MX Pro 2004
Re: 関数をメインタイムライン上に集結させたいの
引用:

kombinatさんは書きました:
と言う事は、
new FadeIn(my_mc, 3).execute();

のイメージは、「オブジェクトインスタンスのメソッド(を実行する人)を生成」と言う感じになるのでしょうか?
従って、メソッドが有効でなくなると自動的に消去される、というイメージ。

そういうことになります。
その「実行する人」に参照を与えても与えなくても、仕事はしてくれるというわけです。そして、execute()実行後、つまりそれにまつわる処理すべてが終ったとき、消えてくれます。
kombinat
Åê¹ÆNo.3459
投稿日時: 2004-2-2 16:55
新米
居住地: 目黒区
投稿: 13
使用環境:
on 10.3
Re: 関数をメインタイムライン上に集結させたいの
と言う事は、
new FadeIn(my_mc, 3).execute();

のイメージは、「オブジェクトインスタンスのメソッド(を実行する人)を生成」と言う感じになるのでしょうか?
従って、メソッドが有効でなくなると自動的に消去される、というイメージ。

引用:
Fade.executeメソッドは、オブジェクトインスタンスへの参照であるthisをローカル変数oに代入し、oはMovieClipインスタンスに設定されたMovieClip.onEnterFrameイベントハンドラメソッドのコールバック関数内で使用されています。

したがって、オブジェクトインスタンスは、Activationオブジェクトにプロパティoのかたちで設定され、コールバック関数内から参照が保持されている間は破棄されません。そのため、MovieClip.onEnterFrameメソッドがdeleteされるまでは存続することになります。

頭の中のイメージがかなりクリアになった気がします。
野中文雄
Åê¹ÆNo.3455
投稿日時: 2004-2-2 16:12
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 関数をメインタイムライン上に集結させたいの
new演算子で生成したオブジェクトインスタンスは、その参照を(通常変数またはプロパティとして)保持しないかぎり消滅します。しかし、以下のステートメントでは、FadeInオブジェクトに対して、(スーパークラスの)メソッドexecuteを呼出しています。
引用:
「どこかに生まれた FadeIn オブジェクトの行方」です。
FadeInオブジェクトはどこかに存在したままになっているのでしょうか?
new FadeIn(my_mc, 3).execute();

で、生まれたオブジェクトの行方が気になってます。

Fade.executeメソッドは、オブジェクトインスタンスへの参照であるthisをローカル変数oに代入し、oはMovieClipインスタンスに設定されたMovieClip.onEnterFrameイベントハンドラメソッドのコールバック関数内で使用されています。

したがって、オブジェクトインスタンスは、Activationオブジェクトにプロパティoのかたちで設定され、コールバック関数内から参照が保持されている間は破棄されません。そのため、MovieClip.onEnterFrameメソッドがdeleteされるまでは存続することになります。
//抽象クラス
function Fade(mc, rate) {
    // [後略]
Fade.prototype.execute = function() {
    var o = this;
    this.mc.onEnterFrame = function() {
        if (o.isInRange()) {
            // [中略]
        } else {
            delete this.onEnterFrame;
            // [後略]
//フェードイン用具象クラス
function FadeIn(mc, rate){
    // [後略]
FadeIn.prototype = new Fade();
FadeIn.prototype.isInRange = function() {
    // [後略]


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

加藤達雄
Åê¹ÆNo.3452
投稿日時: 2004-2-2 15:54
新米
居住地: 東京
投稿: 24
使用環境:
Win XP Pro
MX Pro 2004
Re: 関数をメインタイムライン上に集結させたいの
引用:
kombinatさんは書きました:
まず、「FadeIn」オブジェクトが「どこか」に生まれる。
(その「FadeIn」オブジェクトは、「Fade」クラスを継承)
「FadeIn」のスーパークラス「Fade」のメソッド「execute」が実行される。
(おお、けっこう単純だ!すごいっ)

という感じなのですが、

はい、その通りです。やってることは単純ですよね。

引用:

あと、上記の解釈で間違っていないとした場合に気になる部分が有ります。
「どこかに生まれた FadeIn オブジェクトの行方」です。
FadeInオブジェクトはどこかに存在したままになっているのでしょうか?

    new FadeIn(my_mc, 3).execute();

で、生まれたオブジェクトの行方が気になってます。

そのFadeInオブジェクトは、execute()実行後、消えてなくなります。

fi = new FadeIn(my_mc, 3);
fi.execute();
delete fi;

を一行で書くなら、上の書き方になります。どちらでも全く問題ないと思います。
kombinat
Åê¹ÆNo.3449
投稿日時: 2004-2-2 15:16
新米
居住地: 目黒区
投稿: 13
使用環境:
on 10.3
Re: 関数をメインタイムライン上に集結させたいの
Katoさんのスクリプトをじっくり眺めて、何となくオブジェクト指向でプログラミングするときの考え方が、ぼやーっと解ってきたような気がします。
ここで、もう少しクリアにするために質問しても良いでしょうか。

以前、参考にいただいたスクリプトについてです。
//抽象クラス
function Fade(mc, rate) {
    this.mc = mc;
    this.rate = rate;
}
Fade.prototype.execute = function() {
    var o = this;
    this.mc.onEnterFrame = function() {
        if (o.isInRange()) {
            this._alpha += o.rate;
        } else {
            delete this.onEnterFrame;
        }
    };
};
//フェードアウト用具象クラス
function FadeOut(mc, rate) {
    super(mc, rate);
}
FadeOut.prototype = new Fade();
FadeOut.prototype.isInRange = function() {
    return this.mc._alpha > 0;
}
//フェードイン用具象クラス
function FadeIn(mc, rate){
    super(mc, rate);
}
FadeIn.prototype = new Fade();
FadeIn.prototype.isInRange = function() {
    return this.mc._alpha < 100;
}
このとき、
new FadeIn(my_mc, 3).execute();
というコードが実行された場合の解釈は(私の頭の中では)、
まず、「FadeIn」オブジェクトが「どこか」に生まれる。
(その「FadeIn」オブジェクトは、「Fade」クラスを継承)
「FadeIn」のスーパークラス「Fade」のメソッド「execute」が実行される。
(おお、けっこう単純だ!すごいっ)

という感じなのですが、変な解釈をしていないでしょうか?
あと、上記の解釈で間違っていないとした場合に気になる部分が有ります。
「どこかに生まれた FadeIn オブジェクトの行方」です。
FadeInオブジェクトはどこかに存在したままになっているのでしょうか?

    new FadeIn(my_mc, 3).execute();

で、生まれたオブジェクトの行方が気になってます。
もしかしたら、すごくトンチンカンなことを言っているのかもしれないのですが、よろしくお願いします。
加藤達雄
Åê¹ÆNo.3446
投稿日時: 2004-2-2 14:37
新米
居住地: 東京
投稿: 24
使用環境:
Win XP Pro
MX Pro 2004
Re: 関数をメインタイムライン上に集結させたいの
引用:
youichさんは書きました:
ふ?む?、しかしkatoさんのPC速いですね、、ぼくのMacより3倍ぐらい速い。。。
もしかして、さばよんだりしてません

はい、ちょっとだけ見栄はりました。数回テストして一番速いのを書きました。(笑)
でも値の範囲はどちらも3?4msほどでしたよ。
youich
Åê¹ÆNo.3428
投稿日時: 2004-2-2 3:30
職人
居住地: kobe
投稿: 349
使用環境:
Tiger
Re: 関数をメインタイムライン上に集結させたいの
引用:

TatsuoKatoさんは書きました:
youichさん、了解です。これは面白いテストですね。

そ、それは、katoさんが面白くさせてますねんやん。


function f1() {
	var n = 0;
	var t0 = getTimer();
	while (n<100000) {
		n++;
	}
	trace(getTimer() - t0);//240
	mc.onEnterFrame = function() {
		this._x += n/10000;
	};
}
function f2() {
	var tttttttttttttttttmmmmmmmmmmmmmmppppppppppppppppppppppp = 0;
	var t0 = getTimer();
	while (tttttttttttttttttmmmmmmmmmmmmmmppppppppppppppppppppppp<100000) {
		tttttttttttttttttmmmmmmmmmmmmmmppppppppppppppppppppppp++;
	}
	trace(getTimer() - t0);//70
	var n = tttttttttttttttttmmmmmmmmmmmmmmppppppppppppppppppppppp;
	mc.onEnterFrame = function() {
		this._x += n/10000;
	};
}


てっきりバイオのキーボードがおなくなりになったのかと、

ふ?む?、しかしkatoさんのPC速いですね、、ぼくのMacより3倍ぐらい速い。。。
もしかして、さばよんだりしてません


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

加藤達雄
Åê¹ÆNo.3372
投稿日時: 2004-1-31 19:53
新米
居住地: 東京
投稿: 24
使用環境:
Win XP Pro
MX Pro 2004
Re: 関数をメインタイムライン上に集結させたいの
youichさん、了解です。これは面白いテストですね。

function f1() {
	var n = 0;
	var t0 = getTimer();
	while (n<100000) {
		n++;
	}
	trace(getTimer() - t0);//240
	mc.onEnterFrame = function() {
		this._x += n/10000;
	};
}
function f2() {
	var tttttttttttttttttmmmmmmmmmmmmmmppppppppppppppppppppppp = 0;
	var t0 = getTimer();
	while (tttttttttttttttttmmmmmmmmmmmmmmppppppppppppppppppppppp<100000) {
		tttttttttttttttttmmmmmmmmmmmmmmppppppppppppppppppppppp++;
	}
	trace(getTimer() - t0);//70
	var n = tttttttttttttttttmmmmmmmmmmmmmmppppppppppppppppppppppp;
	mc.onEnterFrame = function() {
		this._x += n/10000;
	};
}

とちょっと極端な例で試してみたんですが、確かにf2()でのみ、ループ内でレジスタが使われているようです。
外側の関数のローカル変数が内側の関数で参照されたが最後、もうそれはレジスタでは扱われなくなるということですね。
youich
Åê¹ÆNo.3370
投稿日時: 2004-1-31 19:15
職人
居住地: kobe
投稿: 349
使用環境:
Tiger
Re: 関数をメインタイムライン上に集結させたいの
引用:

引用:
activationObjectを使う場合これを、レジスターで処理してくれません。。。。

あ、そうなんですか。ただ、Activation Objectを使わずに行う場合は、何らかのオブジェクトにプロパティとしてある値を置いておくことになり、当然レジスターでの処理ではなくなるわけですから、それと同じことですよね?
その件に関しては、イーブンじゃないでしょうか(^^;

すいません、説明が不十分ですた。

fは普通にレジスタを使ってOK
f1がレジスタを使えないでX
f2はループの所はレジスタが使えてOK
というようなのことでした?

function f(){
    var n=0;
    while(n<100){
        n++;
    }
}

function f1(){
    var n=0;
    while(n<100){
        n++;
    }
    mc.onEnterFrame = function(){
        this._x += n;
    }
}

function f2(){
    var tmp=0;
    while(tmp<100){
        tmp++;
    }
    var n=tmp;
    mc.onEnterFrame = function(){
        this._x += n;
    }
}


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

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

youichさんは書きました:
えらいactivation objectが気に入ってますねぇ
ぜひkatoさんにも「AO友の会」に入っていただきたいところです。。(^^;

youichさんが会長さんですか?入会希望(^^)

特にActivation Object云々を気にしなくても、とりあえず、
「ネストされた関数がある場合、内側の関数内で外側の関数のローカル変数を参照できる」というのは便利な仕様なので使わない手はないと思うんですよね。ちなみに最新(?)OOP言語,C#の次期バージョンでもその仕様が取り入れられるそうです。

引用:
activationObjectを使う場合これを、レジスターで処理してくれません。。。。

あ、そうなんですか。ただ、Activation Objectを使わずに行う場合は、何らかのオブジェクトにプロパティとしてある値を置いておくことになり、当然レジスターでの処理ではなくなるわけですから、それと同じことですよね?
その件に関しては、イーブンじゃないでしょうか(^^;
(1) 2 3 »
スレッド表示 | 古いものから 前のトピック | 次のトピック | トップ

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