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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     BroadcasterMX
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
ゲスト
Åê¹ÆNo.10778
投稿日時: 2004-9-14 12:26
BroadcasterMX
いつもお世話になっております。

今回は、BroadcasterMXを使用したイベント配信機能の追加について質問させて頂きます。


といっても、凄く単純でゆえに曖昧な質問になってしまうのですが、
BroadcasterMX.initialize();
の引数に渡す値には、何か規定があるのですか?


BroadcasterMX.initialize(MovieClip);
として、リスナーをMovieClipに登録したらうまくいったのですが、

別asファイルでクラスAを定義して
BroadcasterMX.initialize(A);
としても、
クラスAにイベント配信用のプロパティやメソッドが設定されません。

根本的に、引数に渡す値を誤認しているのかと思い、
投稿させて頂きました。

情報が足りなければ後々説明させて頂きますが、
なにかお気づきの点があれば、アドバイスを頂きたいと思います。

宜しく御願いします。
野中文雄
Åê¹ÆNo.10780
投稿日時: 2004-9-14 13:06
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: BroadcasterMX
単純な腹痛でもお医者さんに行けば、気持ちが悪いのか疼痛がするのか、吐き気や悪寒など他の自覚症状はないのか、何か心当たりがあるかなど詳しく説明されるはずです。今回のご質問は、このようなご説明がないまま、「盲腸の兆候ではありませんか」と尋ねられているような印象です。

少なくとも、どういう操作や設定を行って、どのような処理をした結果、何が起こったのか、第三者が見てわかる程度の情報はお書きください。
引用:
ワタナベミツルさんは書きました:
といっても、凄く単純でゆえに曖昧な質問になってしまうのですが、

オブジェクトである必要があります。具体的な疑問点をご説明いただかないかぎり、これ以上のお答えができません。
引用:
BroadcasterMX.initialize();
の引数に渡す値には、何か規定があるのですか?

本当にプロパティやメソッドが「設定されない」のですか?「意図した以外の場所」に「設定されている」か、確認の方法を誤ったために「設定されている」ことが「わからなかった」ということはありませんか? 後者の可能性がある場合、今回のご質問には、その原因を探るための手がかりがほとんどありません。
引用:
別asファイルでクラスAを定義して
BroadcasterMX.initialize(A);
としても、
クラスAにイベント配信用のプロパティやメソッドが設定されません。

Aがクラスとして正しく定義されているのなら、引数に誤りはないと「推測」されます。
引用:
根本的に、引数に渡す値を誤認しているのかと思い、
投稿させて頂きました。

簡単なスクリプトで試したところ、問題なく動作します。
// ActionScript 2.0クラス定義ファイル: A.as
class A {
    static var addListener:Function;
    static var removeListener:Function;
    static var broadcastMessage:Function;
    static var _listeners:Array;
    static function eventInvoked(argument:Object) {
        broadcastMessage("eventCallback", argument);
    }
}

// Flash(SWF)ムービー
// フレームアクション
import mx.transitions.BroadcasterMX;
BroadcasterMX.initialize(A);
trace("=====[properties of class A]");
for (var i in A) {
    trace([i, A[i]]);
}
trace("=====");
var obj:Object = new Object();
obj.eventCallback = function(argument) {
    trace("my event is called with an argument: "+argument);
};
A.addListener(obj);
A.eventInvoked(100);

// [出力]パネルの結果
=====[properties of class A]
_listeners,
removeListener,[type Function]
addListener,[type Function]
eventInvoked,[type Function]
=====
my event is called with an argument: 100


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

ゲスト
Åê¹ÆNo.10785
投稿日時: 2004-9-14 15:43
Re: BroadcasterMX
野中様
ご回答有り難うございます。
説明不足の質問で、本当に申し訳ありませんでした。

出来る限り早く解決したい問題だったのですが、スクリプトを引用するためにまとめる時間がとれず、今回の質問に関係のない部分まで含めただらだらと長いスクリプトを全て載せるのもどうかと思い、とりあえず簡単な質問だけでも、なにかアドバイスが頂けるのではないかと、僕の自分勝手な判断で今回の質問文に至ってしまい、当フォーラムに対しご迷惑をおかけしてしまいましたこと、深くお詫び致します。

また、そんな質問に対して、このような丁寧なご回答をいただき、ほんとうに有り難うございました。

遅くなりましたがようやく時間がとれたので、先ほどスクリプトを整理し、改めて質問内容の説明をさせて頂こうとしたところでしたので、後付で申し訳ありませんが、状況説明をさせて頂きます。


今回は、クラス"A"を定義してあるムービークリップのインスタンスをステージ上に複数配置し、
そのいずれかにロールオーバーすると、すべてのインスタンスで同じスクリプト(下記では[trace("over")])を実行する
というものを、イベント配信機能を利用してできないかというものです。

引用:

//クラス定義ファイル A.as
class A{
var over:Function;

function A(){
//ロールオーバーで他ボタンにイベントメッセージ"over"配信
onRollOver=function(){
A.broadcastMessage("over");
}
//他ボタンから"over"が配信されたとき
over=function(){
trace("over");
}
//リスナーに登録
A.addListener(this);
}
}


>>Flashムービー側では、
フレームアクション
import mx.transitions.BroadcasterMX;
BroadcasterMX.initialize(A);

および、ムービークリップにシンボルプロパティで
AS2.0クラス:クラスA
を設定して、
そのインスタンスをステージ上に複数配置し、全てのインスタンスに
onClipEvent(load){
pre_set();
}
とスクリプトを記してあります。



実行時のエラーは
引用:
A.as:broadcastMessageという名前のメソッドはありません
A.as:addListenerという名前のメソッドはありません

というものでした。

野中さんのスクリプトと比較して、
イベント配信用のメソッドを宣言するのを忘れていたことに気づき、static宣言を追加したら動作はうまくいきました。

しかし、メッセージの配信から、リスナーの登録まですべてひとつのクラスでやろうとしたので、他にも問題点があるかもしれません。
現状、とりあえず動作はしていますが、
上記スクリプトで「これはやってはいけない」とか、なにか不足している部分、「普通はこういう書き方はしません」といった箇所など、
なにかありましたら、引き続きご指摘願いたいと思います。

重ね重ね、申し訳ありませんでした。
宜しく御願い致します。
野中文雄
Åê¹ÆNo.10787
投稿日時: 2004-9-14 17:01
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: BroadcasterMX
ご質問に当たっては、関係のない部分をできるだけ省き、ポイントを整理されることは重要です。適切な回答を得られるだけでなく、ご自身にとっても問題を正しく把握するための作業になります。

時間がないからと、このプロセスを省いても、山勘は大抵外れます。
引用:
ワタナベミツルさんは書きました:
出来る限り早く解決したい問題だったのですが、スクリプトを引用するためにまとめる時間がとれず、今回の質問に関係のない部分まで含めただらだらと長いスクリプトを全て載せるのもどうかと思い、とりあえず簡単な質問だけでも、なにかアドバイスが頂けるのではないかと、僕の自分勝手な判断で今回の質問文に至ってしまい、当フォーラムに対しご迷惑をおかけしてしまいましたこと、深くお詫び致します。

「エラーが発生した」ということは、最初にひとことお書きいただくと、よかったですね。前日に賞味期限切れの納豆を食べた、というのと同じくらい重要な情報でした。
引用:
遅くなりましたがようやく時間がとれたので、先ほどスクリプトを整理し、改めて質問内容の説明をさせて頂こうとしたところでしたので、後付で申し訳ありませんが、状況説明をさせて頂きます。

この段階では、修正をしてエラーが発生しなくなったスクリプトの方を、提示いただく方がよかったです。修正前のスクリプトでは、どこまで理解されたのか確認がしにくくなります。
引用:
//クラス定義ファイル A.as
class A{
    // ...[中略]...
}

>>Flashムービー側では、
フレームアクション
import mx.transitions.BroadcasterMX;
BroadcasterMX.initialize(A);

および、ムービークリップにシンボルプロパティで
AS2.0クラス:クラスA
を設定して、
そのインスタンスをステージ上に複数配置し、全てのインスタンスに
onClipEvent(load){
 pre_set();
}

とスクリプトを記してあります。

実行時のエラーは
引用:
A.as:broadcastMessageという名前のメソッドはありません
A.as:addListenerという名前のメソッドはありません

というものでした。

野中さんのスクリプトと比較して、
イベント配信用のメソッドを宣言するのを忘れていたことに気づき、static宣言を追加したら動作はうまくいきました。

上記スクリプトは正しく動作しないものですので、具体的な箇所を指摘してアドバイス差し上げることはできません。取りあえず、私なりに書き直したスクリプトは、つぎのとおりです。
// ActionScript 2.0クラス定義ファイル: A.as
import mx.transitions.BroadcasterMX;
class A extends MovieClip {
    static var _listeners:Array;
    static var addListener:Function;
    static var removeListener:Function;
    static var broadcastMessage:Function;
    var onRollOver:Function;
    var over:Function;
    function A() {
        init();
    }
    function init() {
        if (!_listeners) {
            // BroadcasterMX.initialize(A);  // <-でも可
            BroadcasterMX.initialize(arguments.caller);
        }
        pre_set();
    }
    function pre_set() {
        onRollOver = function () {
            broadcastMessage("over");
        };
        over = function () {
            trace(["over", this]);
        };
        addListener(this);
    }
}

引用:
上記スクリプトで「これはやってはいけない」とか、なにか不足している部分、「普通はこういう書き方はしません」といった箇所など、
なにかありましたら、引き続きご指摘願いたいと思います。


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

ゲスト
Åê¹ÆNo.10798
投稿日時: 2004-9-15 10:59
Re: BroadcasterMX
いろいろとご指導ありがとうございます!
スクリプトを学ぶ前に、まず、まだまだフォーラムのマナーを学ばなくてはと反省しております。

今回の件は野中さんの、書き直して頂いたサンプルのおかげで、無事に組み上げることができました!
本当に有り難うございます!

引用:
if (!_listeners) {
// BroadcasterMX.initialize(A); // <-でも可
BroadcasterMX.initialize(arguments.caller);
}

→initialize()までクラス内でやってしまうこともできるのですね!
今まで、いわゆるチカラワザで無理矢理組んでいて、まだクラスなどを使いはじめたばかりで、
どこまでをクラスにできて、どこまでタイムラインに書けば効率よいかなど、その振り分けがまだまだ迷ってしまうところです

これからもいろいろと勉強させて頂きたいと思いますので、
今後とも宜しく御願い致します!
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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