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

パスワード:


パスワード紛失

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

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
加藤達雄
Åê¹ÆNo.3334
投稿日時: 2004-1-30 17:47
新米
居住地: 東京
投稿: 24
使用環境:
Win XP Pro
MX Pro 2004
Re: 関数をメインタイムライン上に集結させたいの
皆さんからの指摘が反映されたようでよかったです。
引用:
何か有りましたら、バンバン指摘してください。

ということですので、ミクロの話になりますが気がついたことを少し・・・。
フェードを実行する対象のmcが「万一」RATEというプロパティを別に持っていたら破綻します。原則としてできるだけ外からのプロパティ設定は避けたほうが無難ということは言えると思います。
あと、if判定ですが、
if (this._alpha>=0 && this._alpha<=100)
ですと常にフェードアウト用、フェードイン用両方のチェックをすることになりますから、極ミクロな話になりますが、無駄があるのかもしれません。

ifによる分岐をできるだけ少なくしたいというのは皆さん結構考えられることだと思いますが、そういった場合はこんな方法もあります。

//抽象クラス
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;
}

//使用例
button1.onRelease = function() {
    new FadeIn(my_mc, 3).execute();
}
button2.onRelease = function() {
    new FadeOut(my_mc, -3).execute();
}

今回の例のようなシンプルな例では、何もここまでしなくてもという感もありますが(^^;、条件判定が複雑で且つ何度も判定する必要が出てくる場合は、こういったやり方も有効だと思います。
野中文雄
Åê¹ÆNo.3351
投稿日時: 2004-1-31 6:24
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 関数をメインタイムライン上に集結させたいの
私は、元のスクリプトがある場合には、できるだけそれを出発点に書替えの案を示しています。ですから、私自身が書く場合のスクリプトとは違っています。自分で書くスクリプトは、Katoさんの最初のサンプルに近いと思います。
引用:
kombinatさんは書きました:
1つの事を実現しようとした場合でも、Fumioさん的表現とKatoさん的表現の様にすごく大きな作り方の違いが出てくるのがおもしろいですね。僕はその辺ですごく困っていて(迷ってしまう)、自分のスクリプトのスタイルを確立しきれないのですが・・・。

RATEというプロパティの重複より、MovieClip.onEnterFrameメソッドの重複の方が、可能性としては高いように思います。それを避けるためにはイベント取得専用のMovieClipをつくって、しかも複数のインスタンスから利用可能にするにはリスナーを作成して、とかなりややこしい話になります。(^^;

ですから、注意事項として意識したうえであれば、現行でもよいような気がします。
引用:
TatsuoKatoさんは書きました:
フェードを実行する対象のmcが「万一」RATEというプロパティを別に持っていたら破綻します。原則としてできるだけ外からのプロパティ設定は避けたほうが無難ということは言えると思います。

スクリプトの記述量は増えますが、フェードインとフェードアウトのコールバック関数を別途に定義してもよいでしょう(実行されるのはどちらか一方なので、処理効率は上がります。先の私のサンプルは、そのような構成です)。
引用:
あと、if判定ですが、
if (this._alpha>=0 && this._alpha<=100)
ですと常にフェードアウト用、フェードイン用両方のチェックをすることになりますから、極ミクロな話になりますが、無駄があるのかもしれません。


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

youich
Åê¹ÆNo.3363
投稿日時: 2004-1-31 15:47
職人
居住地: kobe
投稿: 349
使用環境:
Tiger
Re: 関数をメインタイムライン上に集結させたいの
引用:

Fade.prototype.execute = function() {
var o = this;
this.mc.onEnterFrame = function() {
if (o.isInRange()) {
this._alpha += o.rate;
} else {
delete this.onEnterFrame;
}
};
};

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

まぁ、なんです、、後気になるのはswf7から実行速度が早くなった理由が
いわゆる「ActionDefineFunction2」内でローカル変数がレジスターで処理されるようになったことですが、
activationObjectを使う場合これを、レジスターで処理してくれません。。。。

気にしなくてもこういうことが影響するようなコードにはあまりならないと思いますが、念のため。。


----------------
- 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を使わずに行う場合は、何らかのオブジェクトにプロパティとしてある値を置いておくことになり、当然レジスターでの処理ではなくなるわけですから、それと同じことですよね?
その件に関しては、イーブンじゃないでしょうか(^^;
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.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.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.3446
投稿日時: 2004-2-2 14:37
新米
居住地: 東京
投稿: 24
使用環境:
Win XP Pro
MX Pro 2004
Re: 関数をメインタイムライン上に集結させたいの
引用:
youichさんは書きました:
ふ?む?、しかしkatoさんのPC速いですね、、ぼくのMacより3倍ぐらい速い。。。
もしかして、さばよんだりしてません

はい、ちょっとだけ見栄はりました。数回テストして一番速いのを書きました。(笑)
でも値の範囲はどちらも3?4msほどでしたよ。
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.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;

を一行で書くなら、上の書き方になります。どちらでも全く問題ないと思います。
« 1 (2) 3 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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