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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     同一階層にあるインスタンスの参照
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
そうけ島 将史
Åê¹ÆNo.39744
投稿日時: 2008-8-1 4:57
新米
居住地:
投稿: 4
使用環境:
WinXP,Flash CS3
同一階層にあるインスタンスの参照
FlashCS3、ActionScript3.0環境です。

まずFlash上のタイムライン上にムービークリップを2つ設置してインスタンス名をそれぞれ
root_mc、test_mcとインスタンス名をつけました。
root_mcのほうはシンボルに変換する際にクラスを「Test」としました。
そしてTest.asとして下記のコードを書きました。

package
{
	import flash.display.MovieClip;
	
	public class Test extends MovieClip
	{
		var _mc:MovieClip;
		public function Test()
		{
			_mc = this.parent as MovieClip;
			trace(_mc.test_mc);
		}
	}
}


やりたいことは表題のとおり、同一階層にある一方のインスタンスからもう一方のインスタンスを参照したいのですが、上記コードではnullになってしまい、期待したものが返ってきません。
どのように書けば良いのでしょうか。


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

野中文雄
Åê¹ÆNo.39745
投稿日時: 2008-8-1 7:14
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 同一階層にあるインスタンスの参照
インスタンスの生成を待てばよいでしょう。
引用:
fumixさんは書きました:
まずFlash上のタイムライン上にムービークリップを2つ設置してインスタンス名をそれぞれ
root_mc、test_mcとインスタンス名をつけました。
root_mcのほうはシンボルに変換する際にクラスを「Test」としました。
そしてTest.asとして下記のコードを書きました。
package {
	import flash.display.MovieClip;
	import flash.events.Event;
	public class Test extends MovieClip {
		var _mc:MovieClip;
		public function Test() {
			_mc=this.parent as MovieClip;
			addEventListener(Event.ENTER_FRAME, getInstance);
		}
		function getInstance(eventObject:Event):void {
			var instance:MovieClip = _mc.test_mc;
			if (instance) {
				trace(instance);
				removeEventListener(Event.ENTER_FRAME, getInstance);
			}
		}
	}
}

やりたいことは表題のとおり、同一階層にある一方のインスタンスからもう一方のインスタンスを参照したいのですが、上記コードではnullになってしまい、期待したものが返ってきません。


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

永井勝則
Åê¹ÆNo.39775
投稿日時: 2008-8-3 23:58
職人
居住地: 白馬村
投稿: 796
使用環境:
Windows 7 :Flash CS4:
10.6.8 :Flash CS5.5
Re: 同一階層にあるインスタンスの参照
暑いので研究熱心な永井です。
野中さんの示されている方法にほとほと感心した次第です。
ほかのイベントでできるのではないかと苦心惨憺、試行錯誤した結果を書きます。
長文ですが、ご容赦ください。

実に面倒な、イベントが行き交う方法です。
なおここでは、ステージ上にmainとsubという順番で置いたムービークリップに、
MainとSubというクラスをリンクさせて、Main内からSubを参照する方法を探っています。

Sub.as

package {
	import flash.display.MovieClip;
	import flash.events.Event;

	public class Sub extends MovieClip {

		public function Sub() {
			trace("Sub");
			addEventListener(Event.ADDED_TO_STAGE, onAddedToStageListener);
			addEventListener(Event.ADDED,onAddedListener);
		}
		private function onAddedToStageListener(e:Event):void {
			trace("ADDED_TO_STAGE");
			var mainTimeline:MovieClip = MovieClip(this.parent);
			//trace(mainTimeline)
			//trace(mainTimeline.main)
			mainTimeline.main.dispatchEvent(new Event("onShow"));

		}
		private function onAddedListener(e:Event):void {
			trace("ADDED");
			var mainTimeline:MovieClip = MovieClip(this.parent);
			//trace(mainTimeline)
			//trace(mainTimeline.main)
			//mainTimeline.main.dispatchEvent(new Event("onShow"));
		}
	}
}


Main.as
package {
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.display.DisplayObject;

	public class Main extends MovieClip {

		var mainTimeline:MovieClip;

		public function Main() {
			trace("Main");
			addEventListener("onShow", onShowListener);
			addEventListener(Event.ENTER_FRAME, getInstance);
		}
		
		private function onShowListener(e:Event):void {
			trace("onShow");
			mainTimeline= MovieClip(this.parent);
			//trace(mainTimeline.numChildren)	// 子は2個
			// subはmainの後にステージに置いている。
			var mc1:DisplayObject = mainTimeline.getChildAt(1);
			trace(mc1);// [object Sub]
			mc1.x = 400;		// 移動する
			MovieClip(mc1).gotoAndStop(20);	// 動作する
			var mc2:DisplayObject = mainTimeline.getChildByName("sub");
			trace(mc2);// [object Sub]

			trace(mainTimeline.sub);// null
		}
		
		private function getInstance(eventObject:Event):void {
			var instance:MovieClip = mainTimeline.sub;
			if (instance) {
				trace("instance : " + instance);//  [object Sub]
				trace("mainTimeline.sub : " + mainTimeline.sub);//  [object Sub]
				removeEventListener(Event.ENTER_FRAME, getInstance);
			}
		}
	}
}

出力結果
Main
Sub
ADDED
ADDED_TO_STAGE
onShow
[object Sub]
[object Sub]
null
instance : [object Sub]
mainTimeline.sub : [object Sub]


onShowListener()関数で、getChildAt()やgetChildByName()でsubへの参照は取得できていて、
実際、この時点でsubの位置は変更でき、gotoAndStop()も動作します。
しかし、mainTimeline.subという方法で参照すると、nullが返されます。
その後、出力されているのは、getInstance()関数の結果で、
ここでは、mainTimeline.subという方法で参照できています。

つまりドットでつないで参照できるようになるには、enterFrameイベントを使うほど、
時間が少々かかるということかと、予想しました。


----------------
永井勝則:
himco.jp :

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

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