問答収集 カテゴリ:Flashプログラミング
現在のスレッド一覧 / 新規に質問を投稿
レス数:4 / 状態:解決済み / No:102 / ATOM
1 名前:初心者 日付:2012/12/17(月)00:00:03 ID:o6dXkt8HOnB4
FlashCS6でFlashムービーを作っています。

まず、ルート上で
var flgAAA:int = 0;
と設定しました。

次にMC1という名前のムービークリップを作成しました。
MC1はフレーム10~と50~で同一キャラクターで異なるモーションを取らせていて、それぞれのモーションをgotoAndPlayでループするようにしています。
MC1の最初のフレームで先に定義したflgAAAの値が0か1かによってこの異なるモーションに分岐するようなスクリプトを書いています。

調べたところ_root.変数名というのはAS2までしか通用せず、AS3からは少しややこしいようです。
『var rootObj : MovieClip = this.root as MovieClip;』
ルート上で定義した関数の場合は上記みたいにルートをムービークリップとしてやって
『rootObj.関数名;』
でムービークリップ内でルート上の関数を呼び出せるらしいのですが、コレを参考に関数名を変数に変えてみたんですが、

『null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。』

とエラーが出てしまいます。
コレと同じ要領でムービークリップ上でルートの変数にアクセスして、変数の値を書き換えるっていうのはできる(?)みたいな事が書かれていたのですが・・・

ルート上の変数によってムービークリップを分岐させるよい方法はないでしょうか?
よろしくお願いします。

(ルート上にボタンを配置しておいて、それを押すとフラグが1と0に切り替わり、それによってムービークリップの動きが変わるようにしたいのです。)
2 日付:2012/12/17(月)16:27:01 ID:uqGvQ4UrzKin File:[ 0.zip ]
AS3.0では、タイムラインに宣言した変数は、そのインスタンスの「クラスとしてのプロパテイ」となります。
MovieClip クラスではなく、「MovieClip を継承している何らかのカスタムクラス」が自動的に生成されます。

試しに任意のタイムラインで、以下のスクリプトを書いてみて下さい。
「自動生成された何らかのカスタムクラス」の名称を知ることができます。

trace(this.constructor);

なお、ルートのタイムラインは、MainTimeline クラスとなります。

───────────────────────────────────────────────────

『null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。』
というエラーがでる理由ですが、MovieClip 型にキャストしているからです。

>var rootObj : MovieClip = this.root as MovieClip;

「自動生成された何らかのカスタムクラス」の型にキャストできれば、追加されたプロパティにアクセスできますが
「MovieClip クラス」の型にキャストしても、追加されたプロパティは存在しないため、コンパイル時にエラーとなります。

このエラーを回避するためには、明示的に自作のクラスを宣言し、そのクラスの型にキャストする必要があります。

───────────────────────────────────────────────────

「自動生成される、MainTimeline クラス」を、「明示的に作成した自作のクラス」に変更するには、
プロパティパネルの、「パブリッシュ」の項目にある「クラス」の設定を行います(ペンボタンをクリック)

「自動生成される、タイムラインに配置したシンボルのクラス」を、「明示的に作成した自作のクラス」に変更するには、
ライブラリパネルにある、「ムービークリップシンボル」を選択し、コンテキストメニューから「プロパティ」を選択し、
「シンボルプロパティダイアログ」の、「詳細」を展開し、「クラス」の設定を行います(ペンボタンをクリック)

「明示的に作成した自作のクラス」の型にキャストすれば、プロパティにアクセスできます。

───────────────────────────────────────────────────

いちいちクラスを定義するのが面倒であり、AS1.0 のようにアクセスしたいという場合は、
Object 型にキャストしてしまえば、コンパイル時のエラーチェックを回避できます。

その変わりに、コンパイルの時点では、型指定の間違いなどのエラーチェックができなくなります。
バグを捕まえる機会が減る事になります。

var rootObj : Object = this.root as Object;
trace(rootObj.flgAAA);
3 名前:状態変更 日付:2012/12/22(土)22:38:01 ID:o6dXkt8HOnB4
この質問の状態を『解決』に変更しました。
4 名前:ATOM 日付:2012/12/22(土)22:39:07 ID:o6dXkt8HOnB4
解決できました、ありがとうございました。
このスレッドについて
質問の状態 :
解決済み
投稿開始日 :
2012/12/17(月)00:00:03
投稿終了日 :
2012/12/29(土)22:39:12
投稿者 :
初心者
レス総数 :
4
スレッド番号 :
102
MondoCollectionSystem ver.0x00020000 by Hakuhin