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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   ActionScript 3.0 特設会議室
     フレーム移動をしてすぐ、クラスを読み込むと
投稿するにはまず登録を

スレッド表示 | 古いものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
永井勝則
Åê¹ÆNo.41730
投稿日時: 2009-3-10 22:19
職人
居住地: 白馬村
投稿: 796
使用環境:
Windows 7 :Flash CS4:
10.6.8 :Flash CS5.5
Re: フレーム移動をしてすぐ、クラスを読み込むと
実験をしてみました。
Flash CS3のFLAファイルのメインのタイムラインのフレーム20に
someNameというムービークリップを置きます。
このFLAファイルのドキュメントクラスをMainに設定します。

Main.as
package {

	import flash.display.MovieClip;

	public class Main extends MovieClip {

		public function Main() {
			// フレームnextに移動
			gotoAndPlay("next");
			// そのフレーム番号を出力
			trace("Mainクラス");
			trace(currentFrame);
			// そのフレームのステージにに存在するムービークリップのインスタンス名を出力
			trace(someName)
			// Someクラスにそのムービークリップを渡してSomeインスタンスを作成
			var some:Some = new Some(someName);
			addChild(some)
		}
	}
}


Some.as
package {

	import flash.display.MovieClip;

	public class Some extends MovieClip {

		public function Some(mc:MovieClip) {
			trace("Someクラス");
			var _mc = mc;
			trace(_mc.name);
		}
	}
}

このFLAファイルをプレビューすると、

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

というエラーが発生しました。

次にこのFLAファイルをFlash CS4で開き、パブリッシュ設定をFlash Player 10に変えて
別名で保存し、プレビューしました。
するとエラーは発生せず、以下が出力されました。

Mainクラス
20
[object シンボル1]
Someクラス
someName

ちなみに[object シンボル1]の部分はMain.asの
trace(someName)をtrace(someName.name)に変えると、
someNameが出力されます。

以上の実験の設定が最初の質問と同じならば、行き先のフレームにあるムービークリップがnullになるのはFlash Player 9のの不出来のせいだろうと思います。

とはいえMainクラスが生まれ出ようとしている最中に別のフレームに飛ばしてそこで何かしようとするのは、やはりよくないと思います。

たとえがよくないですが、生まれる赤ん坊のへその緒を切らないうちに、抱き上げるようなものかと。


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

satokichi
Åê¹ÆNo.41712
投稿日時: 2009-3-9 20:08
新米
居住地:
投稿: 2
使用環境:
Re: フレーム移動をしてすぐ、クラスを読み込むと
ご回答ありがとうございました!

素直に、実行フレームで操作するのが一番なのですね。Flashに逆らわないように対処していこうと感じました。

対応して頂いてありがとうございました。
またよろしくお願いします。
野中文雄
Åê¹ÆNo.41709
投稿日時: 2009-3-9 18:16
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: フレーム移動をしてすぐ、クラスを読み込むと
Flash Playerはフレームを基本単位として処理します。そして、ドキュメントクラスの初期化は、メインタイムラインの第1フレーム(の直前)で行われます。その実行中に再生ヘッドを幽体離脱させて別フレームに送り、その別フレームのインスタンスを処理しようとすると、予期せぬ結果を招くおそれがあります。

したがって、スクリプトの実行フレームと操作対象のフレームは一致させることをお勧めします。つまり、スクリプトが実行されているフレームにインスタンスを配置もしくは生成するか、再生ヘッドが(通常の再生により)インスタンスの存在するフレームに移動するのを待って処理するかでしょう。
引用:
satokichiさんは書きました:
ドキュメントクラス内で、gotoAndStop("main");
でフレーム移動し、その"main"フレームで初めて登場するMovieClip「mc」を引数にインスタンスを作ると、そのMovieClipがnullになってしまい実行されないという現象が起こっています。
//mainラベルに飛ばす
gotoAndStop("main");
//そのフレームから登場するmcを引数にインスタンスをつくる。
var main:Main = new Main(mc);


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

satokichi
Åê¹ÆNo.41705
投稿日時: 2009-3-9 17:29
新米
居住地:
投稿: 2
使用環境:
フレーム移動をしてすぐ、クラスを読み込むと
初めて質問をさせて頂きます。
不慣れなAS3に悪戦苦闘しておりまして、行き詰まってしまいました。



ドキュメントクラス内で、gotoAndStop("main");
でフレーム移動し、その"main"フレームで初めて登場するMovieClip「mc」を引数にインスタンスを作ると、そのMovieClipがnullになってしまい実行されないという現象が起こっています。



//mainラベルに飛ばす
gotoAndStop("main");
//そのフレームから登場するmcを引数にインスタンスをつくる。
var main:Main = new Main(mc);



現状は、"main"フレームに直接インスタンスを作成するか、
gotoAndStop("main")を実行するフレームまでMovieClip「mc」をのばし、visible を消すなどして対応しています。
EnterFrameで"mc"を監視し、「nullではなかったら」インスタンスをつくるという方法もためしてみたのですが、スマートではないかなと。

何かよいイベントや方法があれば是非ご教示ください。
よろしくお願い致します。


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

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