- ベストアンサー
ボタンインスタンスの_nameプロパティが参照できない
アクションスクリプトの初心者です。 on (release) { trace("name:"+_name); } としてボタンインスタンスのインスタンス名を参照しようとすると、何も表示されませんでした。 name: オブジェクトのタイプをMCにするとまったく同じ命令でインスタンス名が表示されます。 name:aaa ※インスタンス名「aaa」 これはなぜなのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
#1です。 たびたび失礼します。 > (アクションスクリプトで制御しようと思ったら > ボタンインスタンスはあまり使わないのかな?) この点, 説明すると色々な事例を出さざるを得なくなって, とてもここでは回答しきれないのですが, ボタンシンボルのインスタンスに on (release) {} を使うから問題なわけで, 例えば, aaa0 という言うインスタンス名のボタンと, aaa1 という言うインスタンス名のボタンと, aaa2 という言うインスタンス名のボタンがあった場合, いちいち, on (release) { trace("name:"+_name); } を書くのは面倒なわけです。 もし,このスクリプトの示す _name がボタンに使えたらの場合ですよ。 実際には使えないので,書いても意味がないですが。 とにかく,使えたらの場合,書くのは面倒ですし, また,たくさんあった場合,間違える可能性もあるのです。 だから,そういう場合は, フレームに, ------------------------------------ for (var i = 0; i<=2; i++) { _root["aaa"+i].onRelease = function() { trace("name:"+this._name); }; } ------------------------------------- と書くのです。 すると仮に,aaa1000 まで,1001個のボタンが _root にあったとしても, ------------------------------------ for (var i = 0; i<=1000; i++) { _root["aaa"+i].onRelease = function() { trace("name:"+this._name); }; } ------------------------------------- と書くだけで良くなるのです。 ただし,そのフレームには aaa0 ~ aaa1000 までのボタンが同時に存在している必要がありますけどね。 というわけで, trace("name:"+this._name); を使うという前提においては, 「アクションスクリプトで制御しようと思ったら ボタンインスタンスはあまり使わない」 ということにはなりません。 あくまでもこれはこの場合の話です。 場合によって変わります。 ======================= 場合によっては変わりますが, 実際問題として, 「アクションスクリプトで制御しようと思ったら ボタンインスタンスはあまり使わない」 という現象は進んでいます。 特に, // ライブラリからムービークリップを呼び出す Movieclip..attachMovie(); // ムービークリップの複製 Movieclip..duplicateMovieClip(); // ムービークリップの深度を変える Movieclip..swapDepths(); というムービークリップクラスのメソッドは,ボタンには使えません。 その他色々,ボタンには制約があるので, ボタンはムービークリップで自作するという向きもあります。 ムービークリップのボタン化 http://homepage3.nifty.com/ginga-b/MX/btnmc.html Flash に置いては,ムービークリップがインスタンスの長ですね。 グラフィックシンボルのインスタンスとしても使えますし, ボタンシンボルのインスタンスとしても使えます。 結局,ムービークリップさえあれば,グラフィックシンボルもボタンシンボルも不要だということになります。 これで, だいたい,#1のお礼に書いてくださっていることの回答にはなると思います。 以下は,単なる私的な蘊蓄ですから, 適当に無視してやってください。 =========================== なぜ,このように, ムービークリップさえあれば何でもできるのに, ボタンシンボルやグラフィックシンボルがあるのかというと, 先にボタンシンボルやグラフィックシンボルが誕生したからです。 一度,世に出したものは, よっぽどでないかぎりアップグレードで削除できません。 今まであったものがなくなったり,今までより使い勝手が悪くなると,クレームが殺到します 私は Macromedia とは無縁ですが,全然別会社で別のソフトの開発にたずさわっているものなのでこの点はよくわかります。 とにかく,今ある機能を充実させるのは良いのですが, 今ある機能を削除したり,簡素化するとクレームの嵐がおそって来ます。 Flash の簡易的な歴史は, 私がココにまとめています↓。 「質問:flashの解説したHpをおせえてください」 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1942095 ↑教えて!goo ↓OKWave (同じです) http://okwave.jp/kotaeru.php3?q=1942095 …と思って見直しましたが, その点についてはまとめていませんね,すみません。 まとめていませんが, ムービークリップの誕生は Flash 3 (1998年)なのです。 グラフィックシンボルとボタンシンボルは Flash 2 より前から存在していて, Flash 3 になって初めてムービークリップシンボルが誕生したのです。 誕生の理由は名前が示していますが, Flashというムービーの中に,さらにムービーを入れるためです。 この Flash 3 でムービークリップが登場すると同時に,「階層」という概念が登場しました。 だから, グラフィックシンボルのインスタンスにも,ボタンシンボルのインスタンスにも階層がないのです。 もし,ムービークリップが先に誕生していて, その後に構造を自作しなくて済むボタンが誕生したのでしたら, きっとボタンにも階層があったと思いますから, on (release) { trace("name:"+_name); } は使えていたと思います。 これが使えない原因は,Flash の歴史にあるのです。 しかし,ボタンは使い勝手が良いですね。 勝手に アップ,オーバー ,ダウン,ヒット というフレームが用意されていますし, 階層を持たないので, --------------------------- on (release) { gotoAndPlay(10); } --------------------------- みたいなので,階層を何にも考えなくても, 自分の存在する階層のタイムラインの再生ヘッドを フレーム10 に進めることができます。 個人的には, ボタンシンボルのインスタンスは制約があったり応用が効きませんが, 簡単ですごく好きなシンボルです! と自分で書いていて何ですが, こんな「ボタンは簡単ですごく好きなシンボルです!」というような sassakunみたいなヤツがたくさんいるから, on (release) { trace("name:"+_name); } が使えないわけです~ぅ。 というわけでした。
その他の回答 (1)
書かれているスクリプト on (release) { trace("name:"+_name); } のターゲットを略さずに書くと on (release) { trace("name:"+this._name); } になります。 この this の示す物はボタンではなくボタンの存在する階層になるため, trace の結果は 「name:」 だけになってしまします。 階層については次のページを参考にしてみたください。 WEBMOV06 ≫ 第7回:ムービーの階層化 http://yoppa.org/webmov06.php?itemid=327 ターゲットパス http://homepage3.nifty.com/ginga-b/MX/targetpath.html 簡単に言うと, ムービークリップは1つの階層ですが(フォルダのような物), ボタンは階層を持ちません(ファイルのような物)。 this._name に関しては, 次のページを参考にしてください。 Flash ActionScript入門ノート 「3.1 シンタックスの基本要素」 http://oshige.com/flash/note/archives/3_actionscript/31_/ --- 下から10%くらいの行から引用 --- > ■this(ボタンのインスタンスの場合) > ボタンのインスタンスに設定したオブジェクトアクション > については注意が必要です。 > ボタンに設定してある onハンドラ の中で > this が指すものはボタンのインスタンス自身ではありません。 > thisはボタンが置いてあるインスタンスを指します。 > ~中略~ > ボタンもインスタンス名をつければ > フレームアクションからイベントハンドラを設定できます。 > この中で指すthisはボタンのインスタンスになります。 > たとえば、ボタンのインスタンス名が my_btn であるとき、 > ボタンが置いてあるタイムラインのフレームアクションに > 次のスクリプトを書きます。 > この場合にはthisが指すものはボタンのインスタンスなので、 > ボタンをクリックするとボタン自身が回転します。 > > //ボタンをクリックするとボタン自身が回転する > my_btn.onPress = function(){ > this._rotation += 5; > } というわけで, 書かれているスクリプトの場合は, ボタンのインスタンス名が aaa だとすると, _root の フレームに, -------------------------- aaa.onRelease = function() { trace("name:"+this._name); }; -------------------------- と書けば解決します。 って,全然解決してないような…, これでは本末転倒していますね。 ボタンのインスタンス名が aaa と わかっているから, aaa.onRelease = function() {} が書けるわけで, ボタンのインスタンス名が aaa だとわかっていないから, trace("name:"+_name); をしたいのに……。 ですね。 困った物だ。 別案では,こういう使い方なら使えるます↓。 Flashドキュメンテーション http://livedocs.macromedia.com/flash/8_jp/main/00001995.html これに従うとこんな感じ↓? -------------------------- on (release) { for (i in this) { if (this[i] instanceof Button) { trace("name:"+this[i]._name); } } } -------------------------- ボタンが1つであれば,大丈夫です。 って,やっぱりぜんぜん大丈夫ではありませんね。 困った物ですが,そういうものだと思って諦めてください。 どうしても on (release) { trace("name:"+_name); } を使いたい場合は, ご質問で書かれているようにムービークリップに使うようにしてください。
お礼
うわー(・o・) こんな初心者にこんなにも一生懸命回答頂きありがとうございます! フォルダとファイルの解釈がすごくわかりやすかったです。勉強になりました。 aaa.onRelease = function() { trace("name:"+this._name); }; これについてはおっしゃる通りです。 プログラム中に「aaa」というインスタンス名を利用したくないんですよ。(^_^;) ムービークリップを利用するしかないのなら今後そのようにします。 (アクションスクリプトで制御しようと思ったらボタンインスタンスはあまり使わないのかな?) ありがとうございました。
お礼
sassakunさん度々ありがとうございます。 ボタンインスタンスについてFlashの歴史との関連、すごく勉強になりました。 階層を持たないメリットも理解できました。 Flashもやはり機能が充実していって値段が上がっているんですねー。(^_^;) ありがとうございました。