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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     入れ子構造、内側のfunctionから外側のfunctionを呼び出したい
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
mamarock
Åê¹ÆNo.19988
投稿日時: 2005-9-3 13:43
新米
居住地:
投稿: 6
使用環境:
flash 2004 pro(7.2) windows xp pro sp2
入れ子構造、内側のfunctionから外側のfunctionを呼び出したい
質問させて頂きます
現在flash2004pro(ver7.2) windows xpで制作を行っております

function test(){
			
			var mcLoader : MovieClipLoader = new MovieClipLoader ();
			var loaderListener : Object = new Object;
			//ロード正常終了時
			loaderListener.onLoadInit = function ()
			{
				//ここでfunction testを再帰的に呼び出したい
test();
			}
			//ロード失敗
			loaderListener.onLoadError = function ()
			{
				trace ("___loadClip___error___");
			}
			mcLoader.addListener (loaderListener);
			mcLoader.loadClip (imgArray [seqNo ] , i)
}

上記のように入れ子構造にしたfunction内で内側のfunctionから外側のfunctionを呼び出したいのですがうまくいきませんどなたか可能な方法をご存じの方、ご教授いただけますでしょうか
野中文雄
Åê¹ÆNo.19989
投稿日時: 2005-9-3 15:34
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 入れ子構造、内側のfunctionから外側のfunctionを呼び出したい
ご使用の環境は、プロフィールに記入されると便利です。
引用:
mamarockさんは書きました:
現在flash2004pro(ver7.2) windows xpで制作を行っております

具体的に、おやりになりたいことのイメージがつかめません。MovieClipLoaderクラスは、「複数のファイルを指定して、順次読込むことも可能です」(「MovieClipLoaderクラスについて」)。

取りあえず、呼出し自体は問題なくできるようです。
引用:
[出力]パネルの表示:
0,[type Function],[object Object]
1,[type Function],[object Object]
2,[type Function],[object Object]
3,[type Function],[object Object]

// フレームアクション
var i:MovieClip = this.createEmptyMovieClip("my_mc", 1);
var imgArray:Array = ["P1.jpg", "P2.jpg", "P3.jpg"];
var n:Number = imgArray.length;
var seqNo:Number = 0;
function test() {
	var mcLoader:MovieClipLoader = new MovieClipLoader();
	var loaderListener:Object = new Object();
	//ロード正常終了時
	loaderListener.onLoadInit = function() {
		//ここでfunction testを再帰的に呼び出したい
		if (seqNo<n) {
			test();
		}
		trace([seqNo, test, loaderListener]);
		++seqNo;
	};
	//ロード失敗
	loaderListener.onLoadError = function() {
		trace("___loadClip___error___");
	};
	mcLoader.addListener(loaderListener);
	mcLoader.loadClip(imgArray[seqNo], i);
}
test();

うまくいきません」は、NGワードです。たとえば、上記functionをメソッドとして、ActionScript 2.0クラス中に定義しているといった追加情報はありませんか?「第三者がその内容を手元で再現できる程度」の情報を提供してください。→【第三者から見てわからない
引用:
上記のように入れ子構造にしたfunction内で内側のfunctionから外側のfunctionを呼び出したいのですがうまくいきませんどなたか可能な方法をご存じの方、ご教授いただけますでしょうか


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

mamarock
Åê¹ÆNo.19990
投稿日時: 2005-9-3 17:27
新米
居住地:
投稿: 6
使用環境:
flash 2004 pro(7.2) windows xp pro sp2
Re: 入れ子構造、内側のfunctionから外側のfunctionを呼び出したい
>野中様
ご回答ありがとうございます!
仰られるとおり、上記functionをメソッドとして、ActionScript 2.0クラス中に定義していました。
具体的にやろうとしている事は複数ある外部swfファイルを外部ファイルと同数にattachMovieで生成したムービークリップに読み込み
読み込み終了時にそれぞれのheightプロパティ、widthプロパティを
指定した値に変化させたいと考えています。
そこでMovieClipLoaderのonLoadInitを利用し、ムービー読み込み
が終了したら処理を行おうと考えてみました。
そのようなことは可能でしょうか
野中文雄
Åê¹ÆNo.19991
投稿日時: 2005-9-3 18:09
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 入れ子構造、内側のfunctionから外側のfunctionを呼び出したい
クラスのメソッド内では、自動的にthis参照が補われます。コールバック関数の中のthisは、メソッドが設定されたリスナーオブジェクトを参照します。

参考:「インスタンスのプロパティでないのに宣言を求められる
引用:
mamarockさんは書きました:
仰られるとおり、上記functionをメソッドとして、ActionScript 2.0クラス中に定義していました。

読込み順を厳密にコントロールしようというのでなければ、MovieClipLoaderクラスが処理や進捗状況に応じたイベントの管理をしてくれますけど。それではまずいのですか
引用:
具体的にやろうとしている事は複数ある外部swfファイルを外部ファイルと同数にattachMovieで生成したムービークリップに読み込み
読み込み終了時にそれぞれのheightプロパティ、widthプロパティを
指定した値に変化させたいと考えています。
そこでMovieClipLoaderのonLoadInitを利用し、ムービー読み込み
が終了したら処理を行おうと考えてみました。

var imgArray:Array = ["P1.jpg", "P2.jpg", "P3.jpg", "nonExisting.jpg"];
var n:Number = imgArray.length;
var seqNo:Number = 0;
var mc_array:Array = new Array();
for (var j:Number = 0; j<n; j++) {
	var _mc:MovieClip = this.createEmptyMovieClip("my"+j+"_mc", j);
	mc_array.push(_mc);
	_mc._x = _mc._y=20*j;
}
var mcLoader:MovieClipLoader = new MovieClipLoader();
var loaderListener:Object = new Object();
//ロード開始時
loaderListener.onLoadStart = function(target_mc:MovieClip):Void  {
	trace(target_mc+" is loading...");
};
//ロード正常終了時
loaderListener.onLoadInit = function(target_mc:MovieClip):Void  {
	trace(target_mc+" is loaded");
};
//ロード失敗
loaderListener.onLoadError = function(target_mc:MovieClip, error_str:String):Void  {
	trace(target_mc+" is not loaded because of "+error_str);
};
mcLoader.addListener(loaderListener);
for (var i:Number = 0; i<n; i++) {
	mcLoader.loadClip(imgArray[i], mc_array[i]);
}

引用:
[出力]パネルの表示:
_level0.my3_mc is not loaded because of URLNotFound
Error opening URL "file:///xxx/nonExisting.jpg"
_level0.my0_mc is loading...
_level0.my1_mc is loading...
_level0.my2_mc is loading...
_level0.my2_mc is loaded
_level0.my1_mc is loaded
_level0.my0_mc is loaded


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

mamarock
Åê¹ÆNo.19992
投稿日時: 2005-9-3 20:03
新米
居住地:
投稿: 6
使用環境:
flash 2004 pro(7.2) windows xp pro sp2
Re: 入れ子構造、内側のfunctionから外側のfunctionを呼び出したい
>野中様
大変ご丁寧なご回答ありがとうございます!
確かに野中様のご呈示して頂いたコードを参考に元のコードを修正したのですがどうもうまくいきません
下記にコードを書かせて頂きます
main.fla
ライブラリにムービークリップseedを配置し、リンケージ識別子
seedでactionscriptに書き出し、最初のフレームに書き出しに
チェックをいれてあります
rootのタイムライン最初のフレームにフレームアクションで以下のコードを記述してあります

#include "main.as"


main.asに下記のコードを書きました

var baseImg:Array=["./img/img1.jpg","./img/img2.jpg","./img/img3.jpg"];
var  tmMaker=new MakeThumbnail(baseImg,this);


MakeThumbnail.asに下記のコードを書きました

class MakeThumbnail
{
	//呼び出しもとのムービークリップ
	var baseMc : MovieClip;
	var imgArray : Array;
	var seqNo = 0;
	function MakeThumbnail (targetObj : Array, targetBaseObj : MovieClip)
	{
		imgArray = targetObj;
		baseMc = targetBaseObj;
		createCard (imgArray);
	}
	function createCard (targetObj : Array)
	{
		if (seqNo < targetObj.length)
		{
			trace ("seqNo" + seqNo);
			baseMc.attachMovie ("seed", "card" + seqNo, seqNo);
			//MovieClipLoaderインスタンスの作成
			var mcLoader : MovieClipLoader = new MovieClipLoader ();
			//リスナーオブジェクト生成
			var loaderListener : Object = new Object;
			//ロード正常終了時
			loaderListener.onLoadInit = function ()
			{
				baseMc ["card" + seqNo]._x = 100 * seqNo;
				seqNo ++;
			}
			//ロード失敗
			loaderListener.onLoadError = function ()
			{
				trace ("___loadClip___error___");
			}
			mcLoader.addListener (loaderListener);
			mcLoader.loadClip (imgArray [seqNo ] , baseMc ["card" + seqNo ]);
		}
	}
}



私の想定ではseqNo0、seqNo1、seqNo2と出力されると考えたのですがseqNo0としか表示されません。
本当に申し訳ないですがご回答お願いいたします
野中文雄
Åê¹ÆNo.19993
投稿日時: 2005-9-3 20:55
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 入れ子構造、内側のfunctionから外側のfunctionを呼び出したい
先のご回答の内容は,よくお読みになり、理解されていますか?

スコープの問題が、解決されていないように思えます。
引用:
野中文雄は書きました:
クラスのメソッド内では、自動的にthis参照が補われます。コールバック関数の中のthisは、メソッドが設定されたリスナーオブジェクトを参照します。

参考:「インスタンスのプロパティでないのに宣言を求められる

また、外部JPEGファイルのロードは、MovieClipLoader任せにはできず、あくまでクラスからひとつずつ扱わなければならないということでしょうか?
引用:
読込み順を厳密にコントロールしようというのでなければ、MovieClipLoaderクラスが処理や進捗状況に応じたイベントの管理をしてくれますけど。それではまずいのですか

引用:
mamarockさんは書きました:
main.fla
ライブラリにムービークリップseedを配置し、リンケージ識別子
seedでactionscriptに書き出し、最初のフレームに書き出しに
チェックをいれてあります
rootのタイムライン最初のフレームにフレームアクションで以下のコードを記述してあります
#include "main.as"

main.asに下記のコードを書きました
var baseImg:Array=["./img/img1.jpg","./img/img2.jpg","./img/img3.jpg"];
var  tmMaker=new MakeThumbnail(baseImg,this);

MakeThumbnail.asに下記のコードを書きました
class MakeThumbnail
{
	//呼び出しもとのムービークリップ
	var baseMc : MovieClip;
	var imgArray : Array;
	var seqNo = 0;
	function MakeThumbnail (targetObj : Array, targetBaseObj : MovieClip)
	{
		imgArray = targetObj;
		baseMc = targetBaseObj;
		createCard (imgArray);
	}
	function createCard (targetObj : Array)
	{
		if (seqNo < targetObj.length)
		{
			trace ("seqNo" + seqNo);
			baseMc.attachMovie ("seed", "card" + seqNo, seqNo);
			//MovieClipLoaderインスタンスの作成
			var mcLoader : MovieClipLoader = new MovieClipLoader ();
			//リスナーオブジェクト生成
			var loaderListener : Object = new Object;
			//ロード正常終了時
			loaderListener.onLoadInit = function ()
			{
				// loaderListener. baseMcは存在しません
				baseMc ["card" + seqNo]._x = 100 * seqNo;
				seqNo ++;
			}
			//ロード失敗
			loaderListener.onLoadError = function ()
			{
				trace ("___loadClip___error___");
			}
			mcLoader.addListener (loaderListener);
			mcLoader.loadClip (imgArray [seqNo ] , baseMc ["card" + seqNo ]);
		}
	}
}

MakeThumbnail()コンストラクタによるインスタンスの生成が1個、インスタンス生成時のcreateCard()メソッドの呼出しが1回、メソッドからはMovieClipLoader.loadClip()メソッドを1回呼出しているだけですから、trace()ステートメントは1回しか実行されないと思います。
引用:
私の想定ではseqNo0、seqNo1、seqNo2と出力されると考えたのですがseqNo0としか表示されません。


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

mamarock
Åê¹ÆNo.19996
投稿日時: 2005-9-3 21:49
新米
居住地:
投稿: 6
使用環境:
flash 2004 pro(7.2) windows xp pro sp2
Re: 入れ子構造、内側のfunctionから外側のfunctionを呼び出したい
>野中様
ご回答ありがとうございます!
ご教授頂いたサイトをもう一度よく読み色々やってみたのですが
どうしてもonLoadInitのfunctionからクラスのプロパティにアクセス
する方法がわかりません
本当に度々申し訳ございませんがご教授いただけますでしょうか


loaderListener.onLoadInit = function ()
            {
                // ここからvar baseMc 等のクラスで定義された
         プロパティにアクセスする方法がわかりません
            }
野中文雄
Åê¹ÆNo.19998
投稿日時: 2005-9-3 22:13
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 入れ子構造、内側のfunctionから外側のfunctionを呼び出したい
どうも今ご自分が作成されているスクリプトに、固執されているような印象を受けます。それは一旦脇において、その作成に必要なポイントや課題のひとつひとつについて、単純なサンプルで試し、理解されることが先決に思えます。

[1]サイトのLoadVarsのサンプルについては、試されましたか? その結果、正しく動作しましたか?
[2]その内容は、理解されましたか? 理解できなかったとすれば、それはどの部分ですか?
[3][1][2]がクリアできたことを前提として、ご自分の現在作成されているスクリプトにどのように応用されましたか? その結果、どこが動作しませんか? どこまでは理解でき、どこまで正常動作していることを確認されましたか? また、それはどのようにして、確認されていますか?
引用:
mamarockさんは書きました:
ご教授頂いたサイトをもう一度よく読み色々やってみたのですが
どうしてもonLoadInitのfunctionからクラスのプロパティにアクセス
する方法がわかりません


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

mamarock
Åê¹ÆNo.20015
投稿日時: 2005-9-4 20:37
新米
居住地:
投稿: 6
使用環境:
flash 2004 pro(7.2) windows xp pro sp2
Re: 入れ子構造、内側のfunctionから外側のfunctionを呼び出したい
>野中様
ご回答ありがとうございます!
あれから何度もご指示頂いたサイトを読み返し、テストしてみて
ようやく大体理解できました。そして何とか動くものに修正する事ができました。
仰られた問題解決の手法は自分を焦った状態から冷静にするとき非常に有効だと思います。
よいことを学びました。
ありがとうございます

class MakeThumbnail
{
	var imgArray : Array;
	var baseMc : MovieClip;
	var seqNo:Number=0;
	var myTarget:Object;
	function MakeThumbnail (targetArray : Array,targetBaseMc:MovieClip)
	{
		imgArray = targetArray;
		baseMc=targetBaseMc;
		trace("imgArray"+imgArray);
		trace("baseMc"+baseMc);
		for (var i = 0; i < imgArray.length; i ++)
		{
			baseMc.attachMovie ("seed", "card" + i, i);
		}
		//MovieClipLoaderインスタンスの作成
		var mcLoader : MovieClipLoader = new MovieClipLoader ();
		//リスナーオブジェクト生成
		var loaderListener : Object = new Object;
		loaderListener.myTarget=this;
		//ロード正常終了時
		loaderListener.onLoadInit = function ()
		{
			baseMc ["card" + seqNo]._x = 100 * seqNo;
			trace(loaderListener.myTarget.baseMc["card" + loaderListener.myTarget.seqNo]);
			trace(loaderListener.myTarget.seqNo);
			trace(loaderListener.myTarget.baseMc["card" + loaderListener.myTarget.seqNo]._height);
			loaderListener.myTarget.baseMc["card" + loaderListener.myTarget.seqNo]._x=100*loaderListener.myTarget.seqNo;
			loaderListener.myTarget.baseMc["card" + loaderListener.myTarget.seqNo]._height=(loaderListener.myTarget.baseMc["card" + loaderListener.myTarget.seqNo]._height)*0.5;
			loaderListener.myTarget.baseMc["card" + loaderListener.myTarget.seqNo]._width=(loaderListener.myTarget.baseMc["card" + loaderListener.myTarget.seqNo]._width)*0.5;
			loaderListener.myTarget.seqNo++;
		}
		//ロード失敗
		loaderListener.onLoadError = function ()
		{
			trace ("___loadClip___error___");
		}
		for(var j=0;j<imgArray.length;j++){
			mcLoader.addListener (loaderListener);
			mcLoader.loadClip (imgArray [j ] , baseMc ["card" + j ]);
		}
	}
}
野中文雄
Åê¹ÆNo.20018
投稿日時: 2005-9-4 23:00
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 入れ子構造、内側のfunctionから外側のfunctionを呼び出したい
まずは、動作して何よりです。
引用:
mamarockさんは書きました:
あれから何度もご指示頂いたサイトを読み返し、テストしてみて
ようやく大体理解できました。そして何とか動くものに修正する事ができました。

気づいたことを、3点だけ申し上げます。

[1] 外部ファイルをロードするターゲットは、空のMovieClipで足ります。MovieClip.attachMovie()よりMovieClip.createMovieClip()メソッドを使われた方が、[ライブラリ]にシンボルを用意する必要がない分柔軟だと思います。

[2] MovieClipLoaderインスタンスは、ひとつで複数の外部ファイルのロードを管理することができます。したがって、MovieClipLoader.addListener()メソッドは1度実行するだけでよいです。

[3] MovieClipLoader.onLoadInitイベントハンドラは、ロードしたターゲットのインスタンスを引数に受取ります。変数seqNoをもとにした操作対象のMovieClipとロードされたMovieClipとは、一致しない場合があります。ロード前のMovieClipを操作すると、意図しない結果になることがあります(「MovieClip.loadMovieで外部ファイルを読込む」参照)。ロードされたインスタンスを対象とするよう、処理を変更した方がよいと思われます。
class MakeThumbnail {
	var imgArray:Array;
	var baseMc:MovieClip;
	var seqNo:Number = 0;
	var myTarget:Object;
	function MakeThumbnail(targetArray:Array, targetBaseMc:MovieClip) {
		imgArray = targetArray;
		baseMc = targetBaseMc;
		trace("imgArray"+imgArray);
		trace("baseMc"+baseMc);
		for (var i = 0; i<imgArray.length; i++) {
			// baseMc.attachMovie("seed", "card"+i, i);
			baseMc.createEmptyMovieClip("card"+i, i);  // [1]
		}
		//MovieClipLoaderインスタンスの作成
		var mcLoader:MovieClipLoader = new MovieClipLoader();
		//リスナーオブジェクト生成
		var loaderListener:Object = new Object();
		loaderListener.myTarget = this;
		//ロード正常終了時
		// loaderListener.onLoadInit = function() {
		loaderListener.onLoadInit = function(target_mc:MovieClip):Void  {
			// baseMc["card"+seqNo]._x = 100*seqNo;
			trace("baseMc = "+baseMc+", this.myTarget.baseMc = "+this.myTarget.baseMc);
			// trace(loaderListener.myTarget.baseMc["card"+loaderListener.myTarget.seqNo]);
			trace(this.myTarget.baseMc["card"+loaderListener.myTarget.seqNo]);
			// trace(loaderListener.myTarget.seqNo);
			trace(myTarget.seqNo);
			trace("loaded = "+target_mc+", operating = "
			+this.myTarget.baseMc["card"+loaderListener.myTarget.seqNo]);  // [3]
			trace(loaderListener.myTarget.baseMc["card"+loaderListener.myTarget.seqNo]._height);
			loaderListener.myTarget.baseMc["card"+loaderListener.myTarget.seqNo]._x 
			= 100*loaderListener.myTarget.seqNo;
			loaderListener.myTarget.baseMc["card"+loaderListener.myTarget.seqNo]._height 
			= (loaderListener.myTarget.baseMc["card"+loaderListener.myTarget.seqNo]._height)*0.5;
			loaderListener.myTarget.baseMc["card"+loaderListener.myTarget.seqNo]._width 
			= (loaderListener.myTarget.baseMc["card"+loaderListener.myTarget.seqNo]._width)*0.5;
			loaderListener.myTarget.seqNo++;
		};
		//ロード失敗
		loaderListener.onLoadError = function() {
			trace("___loadClip___error___");
		};
		mcLoader.addListener(loaderListener);  // [2]
		for (var j = 0; j<imgArray.length; j++) {
			// mcLoader.addListener(loaderListener);
			mcLoader.loadClip(imgArray[j], baseMc["card"+j]);
		}
	}
}


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

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

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