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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   ActionScript 3.0 特設会議室
     リンゲージしたMCのタイムライン上にあるMCの制御
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
undisco
Åê¹ÆNo.36644
投稿日時: 2007-12-5 22:54
新米
居住地:
投稿: 7
使用環境:
Mac OSX 10.4.10
Flash CS3
リンゲージしたMCのタイムライン上にあるMCの制御
初めての投稿なので上手く伝えられるか心配ですが、宜しくお願いします。

親ムービークリップのフレームをコントロールし、
そのフレームにある子ムービークリップのもつフレームの画像を任意に表示できるような物を作ろうと思っています。

インスタンス名「mc1」~「mc5」のムービークリップをタイムラインの1~5フレームに配置した、親となる「MainMC」があり、
「mc1」~「mc5」もそれぞれ5フレームずつのタイムラインを持ち、各フレームに違う画像が入っています。
MainMCをリンゲージし、ドキュメントクラスに設定したクラスが下記です。

package {

import flash.display.Sprite;
import flash.events.MouseEvent;

public class ChildMC extends Sprite{

private var mc:MainMC;
private var mcNum:uint;

public function ChildMC(){
mc = new MainMC();
this.addChild(mc);
mc.x = stage.stageWidth/2;
mc.y = stage.stageHeight/2;
mc.gotoAndStop(1);
mc.mc1.gotoAndStop(1);
mc.addEventListener(MouseEvent.MOUSE_DOWN,mDown);
}

private function mDown(Event:MouseEvent):void {
mc.gotoAndStop(2);
mc.mc2.gotoAndStop(2);
}
}
}

これを実行し、MOUSE_DOWNすると、親のmcは2フレームに移動しますが、
mc.mc2.gotoAndStop(2);は効かず、下記のようにエラーが出力されます。

TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。
at ChildMC/::mDown()

この様な場合はどのような解決策があるのでしょうか?


制作環境は、MacOS 10.4 FlashCS3 です。
初心者すぎてそもそも分かっていない事が多いのですがアプローチなどご教授いただければと思います。
宜しくお願いします。
ニノミヤ カズノリ
Åê¹ÆNo.36645
投稿日時: 2007-12-5 23:36
職人
居住地: 東京
投稿: 430
使用環境:
CS4
.4.11, .5.7
XP Pro(sp3)
Flash Player 10,0,22,87,
AIR 1.5.1,
IE 5.5 & 6 & 7 & 8,
Firefox 2.0.0.20 & 3.0.11 & 3.5,
Opera 9.64,
Safari 4,
Google Chrome 2.0.172.31,
Netscape 7.1
Re: リンゲージしたMCのタイムライン上にあるMCの制御
詳しく書いている時間が無い為、エラーの原因だけ。
引用:
undiscoさんは書きました:
private function mDown(Event:MouseEvent):void {
	mc.gotoAndStop(2);
	mc.mc2.gotoAndStop(2);
}

mc.mc2.gotoAndStopメソッドを実行するとエラーが起きてしまう原因は、mc.gotoAndStopメソッドが実行しきらない内にmc2オブジェクトを参照してしまっているからだと思います。

マウスダウン2回目以降はフレームの移動が完了している為、エラーが生じないのではないでしょうか。

問題と関係ないお話ですが、
ドキュメントクラスにSpriteクラスを継承した物をあてるのは、
Flashにおいてはお勧めしません。
なぜなら、フレームにスクリプトの記述が出来なくなってしまうからです。
野中文雄
Åê¹ÆNo.36646
投稿日時: 2007-12-6 0:23
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: リンゲージしたMCのタイムライン上にあるMCの制御
以下のご説明は、「『mc1』~『mc5』のムービークリップをタイムラインの」それぞれ「1~5フレームに配置した」、つまりmc1を第1フレーム、mc2を第2フレームに置いたということですね。
引用:
undiscoさんは書きました:
インスタンス名「mc1」~「mc5」のムービークリップをタイムラインの1~5フレームに配置した、親となる「MainMC」があり、
「mc1」~「mc5」もそれぞれ5フレームずつのタイムラインを持ち、各フレームに違う画像が入っています。

まず、問題を単純化しましょう。引用のスクリプトの問題を再現するためには、mc3?mc5は不要だと思われます。スクリプトを整理すれば、mc1も要らないでしょう。

MovieClip.gotoAndStop()メソッドを実行した直後では、まだ移動先フレームのインスタンスは初期化されていないことが原因と考えられます。
引用:
これを実行し、MOUSE_DOWNすると、親のmcは2フレームに移動しますが、
mc.mc2.gotoAndStop(2);は効かず、下記のようにエラーが出力されます。

TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。
at ChildMC/::mDown()

スクリプティングのデザインとして、タイムラインを利用されるのなら、以下のスクリプトをインスタンスmc(クラスMainMC)の第2フレームに直接記述されればよいように思われます。
// MovieClip: クラスMainMC
// 第2フレームアクション
mc2.gotoAndStop(2);

スクリプトで集中的に制御する道をとるなら、mc1やmc2も動的に生成して、mcに追加したり削除したりする方が端的です。あるいは、すべてmcの第1フレームに配置したうえで、表示/非表示を切替えるという方法も考えられます。

今のムービー構成が変えられないということでしたら、一応対処方法はないではありません。ただ、汎用性・拡張性がある設計とはいえないでしょう。
package {

	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.events.Event;  // 追加

	public class ChildMC extends Sprite {

		private var mc:MainMC;
		private var mcNum:uint;

		public function ChildMC() {
			mc = new MainMC();
			this.addChild(mc);
			mc.x = stage.stageWidth/2;
			mc.y = stage.stageHeight/2;
			mc.gotoAndStop(1);
			// mc.mc1.gotoAndStop(1);
			mc.addEventListener(MouseEvent.MOUSE_DOWN,mDown);
		}

		// private function mDown(Event:MouseEvent):void {
		private function mDown(eventObject:MouseEvent):void {
			mc.gotoAndStop(2);
			trace(eventObject.type, mc.currentFrame, mc.mc2);
			mc.addEventListener(Event.ENTER_FRAME, xEnterFrame);
			// mc.mc2.gotoAndStop(2);
		}
		// 追加
		private function xEnterFrame(eventObject:Event):void {
			trace(eventObject.type, mc.currentFrame, mc.mc2);
			if (mc.mc2) {
				mc.mc2.gotoAndStop(2);
				mc.removeEventListener(Event.ENTER_FRAME, xEnterFrame);
			}
		}
	}
}

最後に、クラス名を変数名に使うのは、絶対にやめましょう。理由は、上記スクリプトで、メソッドmDown()の引数名を元に戻してみればおわかりになるばずです。


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

undisco
Åê¹ÆNo.36654
投稿日時: 2007-12-6 13:33
新米
居住地:
投稿: 7
使用環境:
Mac OSX 10.4.10
Flash CS3
Re: リンゲージしたMCのタイムライン上にあるMCの制御
ご教授有り難うございます。
MainMCの1フレーム目にmc1~5を配置し、表示/非表示にする事で一応の解決はしました。

package {

	import flash.display.MovieClip;
	import flash.display.DisplayObjectContainer;
	import flash.events.MouseEvent;

		public class ChildMC2 extends MovieClip {

			private var mc:MainMC;
			private var mcNum:uint;
			private var mmFrame:uint;

		public function ChildMC2() {
			mc = new MainMC();
			this.addChild(mc);
			mc.x = stage.stageWidth/2;
			mc.y = stage.stageHeight/2;
		
			mc.addEventListener(MouseEvent.MOUSE_DOWN,mDown);
			mmFrame = mc.numChildren-1;
			var mm:MovieClip = DisplayObjectContainer(mc.getChildAt(mmFrame)) as MovieClip;
			mm.gotoAndStop(mc.numChildren);
		}

		private function mDown(eventObject:MouseEvent):void {

			if(mmFrame > 0){
				mmFrame -= 1;
			}else{
				mmFrame = mc.numChildren-1;
			}
	
			var n:int = mc.numChildren;
			for( var i:int = 0; i < n; i++ ){
				var mm:MovieClip = DisplayObjectContainer(mc.getChildAt( i )) as MovieClip;
					
				if(mmFrame == i){
					mm.gotoAndStop(mmFrame+1);
					mm.visible = true;
					trace(eventObject.type, mc.currentFrame, mm.name);
				}else{
					mm.visible = false;
				}	
			}
		}
	}
}


引用:
野中文雄さんは書きました:
スクリプトで集中的に制御するる道をとるなら、mc1やmc2も動的に生成して、mcに追加したり削除したりする方が端的です。あるいは、すべてmcの第1フレームに配置したうえで、表示/非表示を切替えるという方法も考えられます。

ご指摘の通り、最終的にはmc1やmc2も動的に生成して制御をしたいと考えています。
AS3の勉強のためにAS2で制作した物を移植していたで、フレームに依存した形を取っていましたが、
今後改良して行きたいと思います。

引用:
ニノミヤ カズノリさんは書きました:
mc.mc2.gotoAndStopメソッドを実行するとエラーが起きてしまう原因は、mc.gotoAndStopメソッドが実行しきらない内にmc2オブジェクトを参照してしまっているからだと思います。

マウスダウン2回目以降はフレームの移動が完了している為、エラーが生じないのではないでしょうか。

ヒントありがとうございます。
下記の投稿が参考になりました。
子MovieClipのロードチェックについて

引用:
野中文雄さんは書きました:
最後に、クラス名を変数名に使うのは、絶対にやめましょう。理由は、上記スクリプトで、メソッドmDown()の引数名を元に戻してみればおわかりになるばずです。

private function mDown(Event:MouseEvent):void {
このように表記する物なのだと思ってました。
考えて見ればおかしいですね。どこで勘違いしてしまったんだか。
以後気をつけます。

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

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