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

パスワード:


パスワード紛失

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

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
Duke15
Åê¹ÆNo.25761
投稿日時: 2006-5-26 17:42
常連
居住地: 埼玉
投稿: 196
使用環境:
XPpro,2Kpro,
MX2004prov7.2
FlashPro8
Flash9Preview α
Player8r24
Player9.0.16
Player7r63
Firefox1.5.0.5
IE6,NB8.1en
onEnterFrameの動作
メインステージにa_mc,b_mc,c_mc,d_mcを置き
メイン(_root)1フレに
以下のようなスクリプトを記述し、確認をしたところ、
各MCは同時に移動しました。

function move () {
    this._x += 5;
    if (this._x >= 100) {
        delete this.onEnterFrame;
    }
}

stop ();

b_mc.onEnterFrame = move;
c_mc.onEnterFrame = move;
d_mc.onEnterFrame = move;
a_mc.onEnterFrame = move;

しかし、1秒後各MCが移動するように以下のようなスクリプトを
記述したのですが、


function move () {
    var nextTime = getTimer ();
    var diffTime = nextTime - startTime;
    if (diffTime >= 1000) {
        startTime = getTimer ();
        this._x += 5;
        if (this._x >= 100) {
            delete this.onEnterFrame;
        }
    }
}
stop ();

b_mc.onEnterFrame = move;
c_mc.onEnterFrame = move;
d_mc.onEnterFrame = move;
a_mc.onEnterFrame = move;

d_mc-->c_mc-->b_mc-->a_mcの順に移動します。
何故だか??なんですが、どなたか、理由のお分かりの方
教えて頂けませんか?


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

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

Flash Professional CS4/CS6/CC

Safari 6.1
Re: onEnterFrameの動作
引用:
Duke15さんは書きました:
d_mc-->c_mc-->b_mc-->a_mcの順に移動します。
何故だか??なんですが、どなたか、理由のお分かりの方
教えて頂けませんか?

理由までは説明できませんが。

どうやら、配置したのと逆順に、動くみたいです。
a, b, c, d の順に配置すると、d --> c --> b --> a
a, c, b, d の順に配置すると、d --> b --> c --> a
となりました。

どこかに、onEnterFrame の実行順に関するスレッドがあったと思うのですが...
逆の順序になるのは、
onEnterFrameでの順番」が参考になるでしょうか。


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

Duke15
Åê¹ÆNo.25763
投稿日時: 2006-5-26 19:06
常連
居住地: 埼玉
投稿: 196
使用環境:
XPpro,2Kpro,
MX2004prov7.2
FlashPro8
Flash9Preview α
Player8r24
Player9.0.16
Player7r63
Firefox1.5.0.5
IE6,NB8.1en
Re: onEnterFrameの動作
過去スレッドを見ました。
オブジェクト(インスタンス)が作られ
onEnterFrameで確認するとインスタンスが逆から表示のようですが、

今回、最初のスクリプトではオブジェクトが同時に移動するのに、
getTimer()が入るとオブジェクトが同時に移動しないのは??
これが、どうも分かりかねます。

引用:

ひろゆきさんは書きました:
どうやら、配置したのと逆順に、動くみたいです。
a, b, c, d の順に配置すると、d --> c --> b --> a
a, c, b, d の順に配置すると、d --> b --> c --> a
となりました。


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

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

Flash Professional CS4/CS6/CC

Safari 6.1
Re: onEnterFrameの動作
引用:
Duke15さんは書きました:
今回、最初のスクリプトではオブジェクトが同時に移動するのに、
getTimer()が入るとオブジェクトが同時に移動しないのは??

とりあえず、
function move () {
	var nextTime = getTimer ();
	var diffTime = nextTime - startTime;
	if (diffTime >= 1000) {
		var startTime = getTimer ();
		this._x += 5;
		if (this._x >= 100) {
			delete this.onEnterFrame;
		}
	}
}
stop ();

b_mc.onEnterFrame = move;
c_mc.onEnterFrame = move;
d_mc.onEnterFrame = move;
a_mc.onEnterFrame = move;
とすると、同時に動作しますね。


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

Duke15
Åê¹ÆNo.25770
投稿日時: 2006-5-26 23:47
常連
居住地: 埼玉
投稿: 196
使用環境:
XPpro,2Kpro,
MX2004prov7.2
FlashPro8
Flash9Preview α
Player8r24
Player9.0.16
Player7r63
Firefox1.5.0.5
IE6,NB8.1en
Re: onEnterFrameの動作
ひろゆきさん、ご苦労様です。
同時に動作するためには、変数宣言がポイントですね。
変数宣言しない場合は、本来の動作でないということですね。
ちゃんと宣言をするようにしないといけないですね。

でも、こういう動きも面白い使い方ができそうです。

引用:

ひろゆきさんは書きました:
とりあえず、

var startTime = getTimer ();
とすると、同時に動作しますね。


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

youich
Åê¹ÆNo.25772
投稿日時: 2006-5-27 1:04
職人
居住地: kobe
投稿: 349
使用環境:
Tiger
Re: onEnterFrameの動作


function move () {
    var nextTime = getTimer ();
    var diffTime = nextTime - startTime;
 trace([this,diffTime,startTime]);
    if (diffTime >= 1000) {
        startTime = getTimer ();
        this._x += 5;
        if (this._x >= 100) {
            delete this.onEnterFrame;
        }
    }
}
stop ();

b_mc.onEnterFrame = move;
c_mc.onEnterFrame = move;
d_mc.onEnterFrame = move;
a_mc.onEnterFrame = move;


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

上記のtraceの結果です。
_level0.a_mc,NaN,undefined
_level0.d_mc,0,496
_level0.c_mc,0,496
_level0.b_mc,1,496
....
....
_level0.a_mc,917,496
_level0.d_mc,917,496
_level0.c_mc,917,496
_level0.b_mc,917,496
_level0.a_mc,1000,496 //<--ここ
_level0.d_mc,0,1496 //<--ここ
_level0.c_mc,0,1496
_level0.b_mc,0,1496

もしかしてDuke15さんの意図するコードは↓なんじゃないすか?

function move () {
    var nextTime = getTimer ();
    var diffTime = nextTime - this.startTime;
    if (diffTime >= 1000) {
        this.startTime = getTimer ();
        this._x += 5;
        if (this._x >= 300) {
            delete this.onEnterFrame;
        }
    }
}
stop ();
b_mc.startTime = c_mc.startTime = d_mc.startTime = a_mc.startTime = getTimer();
b_mc.onEnterFrame = move;
c_mc.onEnterFrame = move;
d_mc.onEnterFrame = move;
a_mc.onEnterFrame = move;


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

Duke15
Åê¹ÆNo.25775
投稿日時: 2006-5-27 10:00
常連
居住地: 埼玉
投稿: 196
使用環境:
XPpro,2Kpro,
MX2004prov7.2
FlashPro8
Flash9Preview α
Player8r24
Player9.0.16
Player7r63
Firefox1.5.0.5
IE6,NB8.1en
Re: onEnterFrameの動作
youichさん、どうも。
なるほど、タイムのズレは分かりました。
有り難うございます。

当初、私が、意図してたのは、ひろゆきさんの指摘してた動きでした。

でも、タイムのズレで生じる動きも何か使いみちがありそうです。
そして、youichさんの書かれたコードは、これはまた。
参考になりました。

グローバル変数でのズレの動き
ローカル変数での動き
thisによる各オブジェクトの動き

いずれも、とても参考になりました。
有り難うございます。
引用:

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

もしかしてDuke15さんの意図するコードは↓なんじゃないすか?

function move () {
    var nextTime = getTimer ();
    var diffTime = nextTime - this.startTime;
    if (diffTime >= 1000) {
        this.startTime = getTimer ();
        this._x += 5;
        if (this._x >= 300) {
            delete this.onEnterFrame;
        }
    }
}
stop ();
b_mc.startTime = c_mc.startTime = d_mc.startTime = a_mc.startTime = getTimer();
b_mc.onEnterFrame = move;
c_mc.onEnterFrame = move;
d_mc.onEnterFrame = move;
a_mc.onEnterFrame = move;


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

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/

ひろゆき
Åê¹Æ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;
とするとか。

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


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

野中文雄
Åê¹Æ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);


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

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

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