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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     無限ループ時のずれ
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
ニューライス
Åê¹ÆNo.34339
投稿日時: 2007-7-24 17:12
常連
居住地:
投稿: 81
使用環境:
MacOSX(10.4.2)
Flash8
無限ループ時のずれ
こんにちわ、ニューライスです。

こちらのページを参考にサムネイルを横に並べてスクロールする無限ループをするものを作成しました。(ステージ幅550px、サムネイル50×50ピクセル)


(※onEnterFrame処理の部分のみ記載します)

//ループ処理(myArray内にサムネイルMCを格納)
_root.onEnterFrame = function() {
	for( var i:Number = 0 ; i < myArray.length ; i++ ){
		if(this["_mc"+i]._x < 0){
			this["_mc"+i]._x += サムネイルと間隔×個数;
		} else if ( this["_mc"+i]._x > 550){
			 this["_mc"+i]._x -= サムネイルと間隔×個数;
		}
		this["_mc"+i]._x += ((550/2)-_root._xmouse )/10;
	}
}

function chkMove(){
	for(var i:Number = 0 ; i < myArray.length ; i++ ){
		trace(myArray[i]._x-myArray[i-1]._x)
	}
}

chkbtn.onRelease = function(){
	chkMove();
}

ループをしばらく続けてからchkMove();を実行すると
サムネイルどうしの間隔がどんどんずれていることがわかります。

このバラけはonEnterFrameでの処理のタイミングなのでしょうか?
これを調整する方法や確実な仕組みをご存じの方、
何か、よい対応方法はありませんでしょうか?(3日間悩んでます‥

是非よろしくお願いします。

ニューライス
野中文雄
Åê¹ÆNo.34340
投稿日時: 2007-7-24 18:01
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 無限ループ時のずれ
おそらく、MovieClip._xプロパティの有効桁数による誤差が発生しているためでしょう。

たとえば、数人で小銭貯金を始めたとします。毎日帰宅後、財布に入っている50円玉以下の小銭を、すべて貯金箱に入れます。1年後あるいは10年後に、全員で貯金箱を持寄ったとき、それぞれの金額には無視できない差が生じているはずです。

参考:「同じスクリプトで動かしているMovieClipの間隔がばらつく
引用:
ニューライスさんは書きました:
こちらのページを参考にサムネイルを横に並べてスクロールする無限ループをするものを作成しました。(ステージ幅550px、サムネイル50×50ピクセル)

(※onEnterFrame処理の部分のみ記載します)
//ループ処理(myArray内にサムネイルMCを格納)
_root.onEnterFrame = function() {
	for( var i:Number = 0 ; i < myArray.length ; i++ ){
		// ...[中略]...
		this["_mc"+i]._x += ((550/2)-_root._xmouse )/10;
	}
}

function chkMove(){
	for(var i:Number = 0 ; i < myArray.length ; i++ ){
		trace(myArray[i]._x-myArray[i-1]._x)
	}
}
// ...[後略]...

ループをしばらく続けてからchkMove();を実行すると
サムネイルどうしの間隔がどんどんずれていることがわかります。

このバラけはonEnterFrameでの処理のタイミングなのでしょうか?
これを調整する方法や確実な仕組みをご存じの方、
何か、よい対応方法はありませんでしょうか?(3日間悩んでます‥


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

ニューライス
Åê¹ÆNo.34345
投稿日時: 2007-7-25 2:39
常連
居住地:
投稿: 81
使用環境:
MacOSX(10.4.2)
Flash8
Re: 無限ループ時のずれ
こんばんわ、野中さん。

引用:
それぞれの金額には無視できない差が生じているはずです。


(笑)近場の海外ぐらいには行ける額ですね。

こんなドキュメントがあったとは。本当にありがとうございます。
内容を見ましたが、なるほどと感動してしまいました。
「onEnterFrame」とか「ずれ」とかでばっかり検索してました。

早速、試して結果を報告しますね。

本当にありがとうございます
ニューライス
Åê¹ÆNo.34355
投稿日時: 2007-7-25 12:50
常連
居住地:
投稿: 81
使用環境:
MacOSX(10.4.2)
Flash8
Re: 無限ループ時のずれ
野中さん
さっそく処理を試してみましたが、あまり変わりがないように感じられます。

forですべてのサムネイルを一斉に処理をしているため、変数の持たせ方を間違えているのでしょうか?


//ループ処理(変数加算)
_root.onEnterFrame = function() {
	for( var i:Number = 0 ; i < myArray.length ; i++ ){
		var n_x = this["_mc"+i]._x;
		if( n_x < nLeftLimit ){
			n_x += nlength;
		} else if ( n_x > nRightLimit ){
			 n_x -= nlength;
		}
		n_x += ((550/2)-_root._xmouse )*0.1;
		this["_mc"+i]._x = n_x;
	}
}


ニューライス
野中文雄
Åê¹ÆNo.34357
投稿日時: 2007-7-25 13:12
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 無限ループ時のずれ
「変わりがない」でしょうね。

JPEG画像を加工する際、元画像はPNGやPSDに保存して使い、1度保存したJPEGを再加工して保存することはしないと思います。JPEG画像は、保存を繰返すたびに劣化するからです。したがって、加工はつねに元画像(PNG/PSD)に対して行い、劣化のない元画像を保持したまま、JPEG画像に書出すはずです。

引用したノートで、MovieClip._xプロパティが代入式の右辺にくる処理は、ただ1度きりであることをお確かめください。
引用:
ニューライスさんは書きました:
forですべてのサムネイルを一斉に処理をしているため、変数の持たせ方を間違えているのでしょうか?
//ループ処理(変数加算)
_root.onEnterFrame = function() {
	for( var i:Number = 0 ; i < myArray.length ; i++ ){
		var n_x = this["_mc"+i]._x;  // 誤差のある値を元変数に再保存(データ劣化)
		// ...[後略]...

PNG/PSDに保存さえすればよいだろうと、再加工したJPEGを開いてはPNG/PSDに保存すれば、やはり劣化は避けられません。JPEGへの保存(書出し)は何度行うにしても、2度とJPEGから画像を開かない。PNG/PSDを開けてJPEGに保存するという、PNG/PSD→JPEGの一方通行を守ることが重要なのです。


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

ニューライス
Åê¹ÆNo.34361
投稿日時: 2007-7-25 15:38
常連
居住地:
投稿: 81
使用環境:
MacOSX(10.4.2)
Flash8
Re: 無限ループ時のずれ
for文ですべてのMCを一斉に処理しているため、[1]x座標を浮動小数値で格納するための変数をどこに置けば、x座標を記録しておけるのかがわかりません。
下記のようにしましたが、これでは結局さっきと変らないことが分かっているのに掲載してしまいました‥。

配列やMCごとに変数を持たせるなどするのでしょうか?


//ループ処理(変数加算)
var n_x:Number = 0;
_root.onEnterFrame = function() {
	for( var i:Number = 0 ; i < myArray.length ; i++ ){
		
		//浮動小数点の_xを変数n_xに代入
		n_x = this["_mc"+i ]._x;
		
		//ループ処理
		if( n_x < nLeftLimit ){
			n_x += nlength;
		} else if ( n_x > nRightLimit ){
			n_x -= nlength;
		}
		
		//マウスのx座標に応じた移動量を加算
		n_x += ((550/2)-_root._xmouse )*0.1;
		
		//マウスのx座標に応じた移動量を加算
		this["_mc"+i]._x = n_x;
	}
}

野中文雄
Åê¹ÆNo.34363
投稿日時: 2007-7-25 18:37
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 無限ループ時のずれ
変数は、小数点以下2桁の精度しかないMovieClip._xプロパティを、代替するものとして設定します。このプロパティ値は、MovieClipインスタンスごとに異なるはずです。だとすれば、変数もMovieClipインスタンスごとに設定しなければなりません。

示されたスクリプトの変数n_xは、画像の例でいえば複数のJPEGファイルを開いて、加工しては同じPNG/PSDファイル名で繰返し上書き保存しているようなものです。加工する過程で単に拡張子が変わっているだけで、元画像の品質は保持されません。
引用:
ニューライスさんは書きました:
配列やMCごとに変数を持たせるなどするのでしょうか?


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

ニューライス
Åê¹ÆNo.34364
投稿日時: 2007-7-25 18:39
常連
居住地:
投稿: 81
使用環境:
MacOSX(10.4.2)
Flash8
Re: 無限ループ時のずれ
野中さん
自己解決しました。すみません。

attachした時点で各MCに変数n_xを持たせ_x座標を代入。
以降はforの処理でn_xに処理をかけ、最後に
MovieClip._xに値を代入したところできました!

やはり長時間スクロールさせていると若干の誤差は生じるものの
これまでとは雲泥の差です。

毎度お騒がせして申し訳ありません‥。

ニューライス
野中文雄
Åê¹ÆNo.34367
投稿日時: 2007-7-25 21:00
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 無限ループ時のずれ
変数にも約16桁という有効桁数があります。したがって、その範囲内での誤差は、当然生じます。しかし、その誤差が小数点以下第3位にまで達するには、気の遠くなる時間がかかり、結果として第2位までの目に見える誤差にはならないということです。
引用:
ニューライスさんは書きました:
やはり長時間スクロールさせていると若干の誤差は生じるものの
これまでとは雲泥の差です。


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

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

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