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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     onEnterFrameの動作
投稿するにはまず登録を

スレッド表示 | 古いものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
Duke15
Åê¹ÆNo.25865
投稿日時: 2006-6-1 18:38
常連
居住地: 埼玉
投稿: 196
使用環境:
XPpro,2Kpro,
MX2004prov7.2
FlashPro8
Flash9Preview α
Player8r24
Player9.0.16
Player7r63
Firefox1.5.0.5
IE6,NB8.1en
Re: onEnterFrameの動作
野中さん、ありがとう御座います。
1フレでの記述で疑問なことがスッキリしてきました。
これ自分にとっては重要なこととして参考にさせてもらいます。
引用:

野中文雄さんは書きました:
「以下の2つ」の書き方については、多分に趣味の問題で、どちらでも結構だと思います。

もっとも、無名関数で定義せず、通常の関数定義を行った方がよいと考えられる場合は、ふたつあります。

[1]複数のインスタンスに同じ内容の関数を定義する場合
もし、このイベントハンドラメソッドを無名関数で定義すると、functionオブジェクトは、xSetAnimation()関数を呼出しすたびに、引数に渡したMovieClipインスタンスの数分だけ作成されてしまいます。

上記のMovieClip.onEnterFrameイベントハンドラメソッドの定義なら、各MovieClipインスタンスには関数boundの参照が設定されるだけですので、メモリの効率として有利です。

関数を予め定義しておけば、やはり参照を設定するだけで済みますので、(funcitonを毎度作成するという)無駄な処理を省くことができます。
// MovieClip: クリックで水平移動のアニメーションさせる
// 第1フレームアクション
var nTarget:Number;
this.onRelease = function():Void  {
	nTarget = this._x+100;
	this.onEnterFrame = xEaseOut;
};
function xEaseOut():Void {
	var nDistance = (nTarget-this._x);
	if (Math.abs(nDistance)<0.5) {
		this._x = nTarget;
		delete this.onEnterFrame;
	} else {
		this._x += nDistance*0.2;
	}
	trace(this._x);
}


----------------
site:
http://www.yumenext.com/
blog:
http://star.ap.teacup.com/flash/

野中文雄
Åê¹ÆNo.25863
投稿日時: 2006-6-1 11:59
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: onEnterFrameの動作
「以下の2つ」の書き方については、多分に趣味の問題で、どちらでも結構だと思います。
引用:
Duke15さんは書きました:
以下の2つ書いてみましたが、
書き方としては、こういった書き方は良くないとかの
指摘が御座いましたら、ご意見をお願いしたいのですが。
...[中略]...
以下のスクリプトで動作させる。
btn_mc.onRelease = function() {
    xSetAnimation(ball1_mc);
    xSetAnimation(ball2_mc);
}

もう一つの書き方は、更に関数を作成して
function btnStart() {
    xSetAnimation(ball1_mc);
    xSetAnimation(ball2_mc);
}

以下のスクリプトで動作させる。
btn_mc.onRelease = btnStart;

もっとも、無名関数で定義せず、通常の関数定義を行った方がよいと考えられる場合は、ふたつあります。

[1]複数のインスタンスに同じ内容の関数を定義する場合
以下のMovieClip.onEnterFrameイベントハンドラメソッドが、まさにその場合です。
function xSetAnimation(_mc) {
    _mc.speed = speed;
    _mc.accel = accel;
    _mc.boundPos = boundPos;
    _mc.onEnterFrame = bound;
}

もし、このイベントハンドラメソッドを無名関数で定義すると、functionオブジェクトは、xSetAnimation()関数を呼出しすたびに、引数に渡したMovieClipインスタンスの数分だけ作成されてしまいます。

上記のMovieClip.onEnterFrameイベントハンドラメソッドの定義なら、各MovieClipインスタンスには関数boundの参照が設定されるだけですので、メモリの効率として有利です。
function xSetAnimation(_mc) {
    // ...[中略]...
    _mc.onEnterFrame = function() {  // 毎回functionが作成される
	// ...[後略]...

[2]同じ関数を何度も設定する場合
以下のフレームアクションは、クリックでアニメーションを開始して、目的座標まで到達するとMovieClip.onEnterFrameイベントハンドラメソッドをクリアします。

このときもしMovieClip.onEnterFrameを無名関数で定義すると、functionを毎回つくり直すことになります。この場合、(処理としてはわずかだとしても)functionオブジェクトを生成する負荷が無駄にかかります。

関数を予め定義しておけば、やはり参照を設定するだけで済みますので、(funcitonを毎度作成するという)無駄な処理を省くことができます。
// MovieClip: クリックで水平移動のアニメーションさせる
// 第1フレームアクション
var nTarget:Number;
this.onRelease = function():Void  {
	nTarget = this._x+100;
	this.onEnterFrame = xEaseOut;
};
function xEaseOut():Void {
	var nDistance = (nTarget-this._x);
	if (Math.abs(nDistance)<0.5) {
		this._x = nTarget;
		delete this.onEnterFrame;
	} else {
		this._x += nDistance*0.2;
	}
	trace(this._x);
}


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

Duke15
Åê¹ÆNo.25850
投稿日時: 2006-5-31 11:10
常連
居住地: 埼玉
投稿: 196
使用環境:
XPpro,2Kpro,
MX2004prov7.2
FlashPro8
Flash9Preview α
Player8r24
Player9.0.16
Player7r63
Firefox1.5.0.5
IE6,NB8.1en
Re: onEnterFrameの動作
他のスレでのmitsuruさんの引用ですが、
引用:

文法等基本を身につけるのと同様に、というかある意味ではそれ以上に大切なことが、
『デバッグする方法、習慣をみにつける』ということかもしれませんね。

まったく、私にも適用されることですね。(汗)

ところで、一つ確認したいのですが、
野中さんの書かれた

var speed = 0;
var accel = 1;
var boundPos = 200;
function bound() {
    this._y += this.speed;
    if (this._y>=this.boundPos) {
        this.speed *= -1;
    } else {
        this.speed += this.accel;
    }
}
function xSetAnimation(_mc) {
    _mc.speed = speed;
    _mc.accel = accel;
    _mc.boundPos = boundPos;
    _mc.onEnterFrame = bound;
}
xSetAnimation(ball1_mc);
xSetAnimation(ball2_mc);

このコードで引数があるので、
ボタンから動作させる書き方として、
以下の2つ書いてみましたが、
書き方としては、こういった書き方は良くないとかの
指摘が御座いましたら、ご意見をお願いしたいのですが。
よろしくお願いします。
あくまで、メインrootの1フレでの記述方法としてですが。

var speed = 0;
var accel = 1;
var boundPos = 200;
function bound() {
    this._y += this.speed;
    if (this._y>=this.boundPos) {
        this.speed *= -1;
    } else {
        this.speed += this.accel;
    }
}
function xSetAnimation(_mc) {
    _mc.speed = speed;
    _mc.accel = accel;
    _mc.boundPos = boundPos;
    _mc.onEnterFrame = bound;
}
ここで、更に関数を作成
--------------------------------
以下のスクリプトで動作させる。
btn_mc.onRelease = function() {
    xSetAnimation(ball1_mc);
    xSetAnimation(ball2_mc);
}
もう一つの書き方は、更に関数を作成して
function btnStart() {
    xSetAnimation(ball1_mc);
    xSetAnimation(ball2_mc);
}
以下のスクリプトで動作させる。
btn_mc.onRelease = btnStart;

私個人的には
xxx.onRelease = function(){
を使うよりか
xxx.onRelease = fffff;の書き方のほうが
直感的に理解し易いと思うのですが・・・。
どうなのでしょう。


----------------
site:
http://www.yumenext.com/
blog:
http://star.ap.teacup.com/flash/

Duke15
Åê¹ÆNo.25798
投稿日時: 2006-5-28 21:16
常連
居住地: 埼玉
投稿: 196
使用環境:
XPpro,2Kpro,
MX2004prov7.2
FlashPro8
Flash9Preview α
Player8r24
Player9.0.16
Player7r63
Firefox1.5.0.5
IE6,NB8.1en
Re: onEnterFrameの動作
ご指摘通り、AS2.0で記述すればいいのかも知れませんが、
もう少し、メイン1フレでの記述で慣れておこうと思いまして、
平行してAS2.0のクラスを使っていくつもりです。

引用:

私は個人的には、MovieClipシンボル内の第1フレームアクションに設定しますね。それだと見とおしが悪くなるということでしたら、ActionScript 2.0でクラス定義をすればかなりすっきりします。


----------------
site:
http://www.yumenext.com/
blog:
http://star.ap.teacup.com/flash/

Duke15
Åê¹ÆNo.25797
投稿日時: 2006-5-28 21:12
常連
居住地: 埼玉
投稿: 196
使用環境:
XPpro,2Kpro,
MX2004prov7.2
FlashPro8
Flash9Preview α
Player8r24
Player9.0.16
Player7r63
Firefox1.5.0.5
IE6,NB8.1en
Re: onEnterFrameの動作
そうです。タイムライン変数のことです。
過去のFlash5,MXで作成していたため、グローバル変数と
言ってしまいました。
現在は、その変数はタイムライン変数ですね。

引用:

野中文雄さんは書きました:
細かいことですけど、念のため。

youichさんが「タイムライングローバルな変数」といういい方をされているのは、ActionScriptの用語でいう「グローバル変数」(_global)ではなく、共通に参照される(_level0の)タイムライン変数という意味でしょう。


----------------
site:
http://www.yumenext.com/
blog:
http://star.ap.teacup.com/flash/

野中文雄
Åê¹ÆNo.25796
投稿日時: 2006-5-28 20:46
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: onEnterFrameの動作
細かいことですけど、念のため。

youichさんが「タイムライングローバルな変数」といういい方をされているのは、ActionScriptの用語でいう「グローバル変数」(_global)ではなく、共通に参照される(_level0の)タイムライン変数という意味でしょう。
引用:
Duke15さんは書きました:
ひろゆきさん、野中さんが指摘の変数のデバックで
youichさんのご指摘通りグローバル変数になっていると
理解はしたのですが、関数内で使うときの変数値の
持って来方がどうもあやふやだったものでした。

私は個人的には、MovieClipシンボル内の第1フレームアクションに設定しますね。それだと見とおしが悪くなるということでしたら、ActionScript 2.0でクラス定義をすればかなりすっきりします。
引用:
無理にメインタイムラインの1フレでの記述に固執することは
無いのかと思いますが、この記述方法で今後やっていこうと
思いましたので、いろいろ混乱してます。

// ActionScript 2.0クラス定義ファイル: Ball.as
class Ball extends MovieClip {
	var speed:Number = 0;
	var accel:Number = 1;
	var boundPos:Number = 200;
	function onEnterFrame() {
		this._y += speed;
		if (this._y>=boundPos) {
			speed *= -1;
		} else {
			speed += accel;
		}
	}
}


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

Duke15
Åê¹ÆNo.25794
投稿日時: 2006-5-28 20:32
常連
居住地: 埼玉
投稿: 196
使用環境:
XPpro,2Kpro,
MX2004prov7.2
FlashPro8
Flash9Preview α
Player8r24
Player9.0.16
Player7r63
Firefox1.5.0.5
IE6,NB8.1en
Re: onEnterFrameの動作
ひろゆきさんあ、野中さん、
毎度、有り難うございます。
マルチレスですみません。

ひろゆきさん、野中さんが指摘の変数のデバックで
youichさんのご指摘通りグローバル変数になっていると
理解はしたのですが、関数内で使うときの変数値の
持って来方がどうもあやふやだったものでした。

無理にメインタイムラインの1フレでの記述に固執することは
無いのかと思いますが、この記述方法で今後やっていこうと
思いましたので、いろいろ混乱してます。
これからもよろしくお願いします。

引用:

ひろゆきさんは書きました:
speed がタイムライン変数になっているので、
その値を引き継いでしまうようになっているのではないでしょうか?
#おそらく、youichさんが指摘されていることと同じようなことかと。

なので、speed を各ムービークリップに持たせて、
ball1_mc.speed = ball2_mc.speed = 0;
とするとか。

引用:

野中さんは書きました:
[デバッグ] > [変数のリストアップ]で、変数の設定タイムラインと、その意味を理解される必要があると思われます。


----------------
site:
http://www.yumenext.com/
blog:
http://star.ap.teacup.com/flash/

野中文雄
Åê¹ÆNo.25791
投稿日時: 2006-5-28 20:02
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: onEnterFrameの動作
[デバッグ] > [変数のリストアップ]で、変数の設定タイムラインと、その意味を理解される必要があると思われます。
引用:
Duke15さんは書きました:
この関係で更に以下のコードを試しました。

[変数のリストアップ]より引用:
ムービークリップ: ターゲット="_level0.ball1_mc"
変数 _level0.ball1_mc.speed = 10
変数 _level0.ball1_mc.accel = 1
変数 _level0.ball1_mc.boundPos = 200
ムービークリップ: ターゲット="_level0.ball2_mc"
変数 _level0.ball2_mc.speed = 10
変数 _level0.ball2_mc.accel = 1
変数 _level0.ball2_mc.boundPos = 200

引用:
//MovieClip:ball1_mc,ball2_mc
onClipEvent (load) {
    speed = 0;
    accel = 1;
    boundPos = 200;
}
onClipEvent (enterFrame) {
    this._y += speed;
    if (this._y >= boundPos) {
        speed *= -1;
    } else {
        speed += accel;
    }
}

すると、ちゃんと同時動作します。

[変数のリストアップ]より引用:
変数 _level0.speed = -1
変数 _level0.accel = 1
変数 _level0.boundPos = 200

引用:
しかし、以下のコードのように、
_rootの1フレに記述した場合では同時動作になりません。
...[中略]...
var speed = 0;
var accel = 1;
var boundPos = 200;
function bound () {
    this._y += speed;
    if (this._y >= boundPos) {
        speed *= -1;
    } else {
        speed += accel;
    }
}

ball1_mc.onEnterFrame = bound;
ball2_mc.onEnterFrame = bound;

タイムラインに記述したフレームアクションでも、同じ処理が行われれば、同じ動作になります。
var speed = 0;
var accel = 1;
var boundPos = 200;
function bound() {
	this._y += this.speed;
	if (this._y>=this.boundPos) {
		this.speed *= -1;
	} else {
		this.speed += this.accel;
	}
}
function xSetAnimation(_mc) {
	_mc.speed = speed;
	_mc.accel = accel;
	_mc.boundPos = boundPos;
	_mc.onEnterFrame = bound;
}
xSetAnimation(ball1_mc);
xSetAnimation(ball2_mc);


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

ひろゆき
Åê¹ÆNo.25787
投稿日時: 2006-5-28 19:41
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: onEnterFrameの動作
speed がタイムライン変数になっているので、
その値を引き継いでしまうようになっているのではないでしょうか?
#おそらく、youichさんが指摘されていることと同じようなことかと。

なので、speed を各ムービークリップに持たせて、
ball1_mc.speed = ball2_mc.speed = 0;
var accel = 1;
var boundPos = 200;
function bound () {
	this._y += this.speed;
	if (this._y >= boundPos) {
		this.speed *= -1;
	} else {
		this.speed += accel;
	}
}
ball1_mc.onEnterFrame = bound;
ball2_mc.onEnterFrame = bound;
とするとか。

他にも方法がありそうですが。


----------------
質問する際は、回答者に具体的な情報を与えてください。

Duke15
Åê¹ÆNo.25785
投稿日時: 2006-5-28 18:56
常連
居住地: 埼玉
投稿: 196
使用環境:
XPpro,2Kpro,
MX2004prov7.2
FlashPro8
Flash9Preview α
Player8r24
Player9.0.16
Player7r63
Firefox1.5.0.5
IE6,NB8.1en
Re: onEnterFrameの動作
この関係で更に以下のコードを試しました。

//MovieClip:ball1_mc,ball2_mc
onClipEvent (load) {
    speed = 0;
    accel = 1;
    boundPos = 200;
}
onClipEvent (enterFrame) {
    this._y += speed;
    if (this._y >= boundPos) {
        speed *= -1;
    } else {
        speed += accel;
    }
}

すると、ちゃんと同時動作します。
しかし、以下のコードのように、
_rootの1フレに記述した場合では同時動作になりません。
このように1フレでも同時動作は、
どう記述すれば同時動作するのでしょうか?

var speed = 0;
var accel = 1;
var boundPos = 200;
function bound () {
    this._y += speed;
    if (this._y >= boundPos) {
        speed *= -1;
    } else {
        speed += accel;
    }
}

ball1_mc.onEnterFrame = bound;
ball2_mc.onEnterFrame = bound;

引用:

Duke15は書きました:
グローバル変数でのズレの動き
ローカル変数での動き
thisによる各オブジェクトの動き

いずれも、とても参考になりました。
引用:

youichさんは書きました:
この場合startTimeがタイムライングローバルな変数になっちゃってるから
b_mc,c_mc,d_mc,a_mcのどれかがdiffTime>1000の条件をクリアーした後
startTimeはgetTimer()の値を代入されるので残り3つのムービークリップの
diffTimeは0ということになってしまいます。


----------------
site:
http://www.yumenext.com/
blog:
http://star.ap.teacup.com/flash/

(1) 2 »
スレッド表示 | 古いものから 前のトピック | 次のトピック | トップ

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