• 締切済み

Flash ビルトインオブジェクトにメソッド追加?

function abc(){ //処理 } という関数を_rootの1フレ目に定義します。 例えばこれを呼び出す時_root.abc();や_parent.abc();等という風に 呼び出す事が可能ですが、これをビルトインオブジェクト (例えばMathオブジェクト)に追加する事で、 どこからでも呼び出せると書いてあり、その場合は Math.abc=function(){ //処理 } と定義し、Math.abc();で呼び出す。とありました。 試してみたところ、上記スクリプトはAS1.0では動作しましたが AS2.0ではエラーが出ました。 上記同様の内容をAS2.0あるいはAS3.0で再現するには どうすればよいのでしょうか?(※2.0優先)

みんなの回答

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.3

#2です。書き忘れです。 #2で作成した MyMath クラスは Math クラスを拡張したのですから, FLA の方で, -------------------------------------- var my_sin:Number = MyMath.sin(5); trace(my_sin); var my_cos:Number = MyMath.cos(5); trace(my_cos); var my_pi:Number = MyMath.PI; trace(my_pi); -------------------------------------- というような使い方もできます。

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.2

Mathクラスを拡張したクラスを作れば良いのではないでしょうか? 【例】 任意のFLAファイル(AS2設定)を任意のフォルダに保存します。 このFLAファイルと同じフォルダに, 次の AS ファイルを「MyMath.as」というファイル名で保存します。 ----------------------------------------- // ---クラス定義ファイル「MyMath.as」--- // Mathクラスを拡張 class MyMath extends Math { //コンストラクタ(注意:private) private function MyMath() { } // 円の半径から面積を求める(注意:static) static function abc(r:Number) { var ans:Number = r*r*Math.PI; return ans; } } ----------------------------------------- そして例えば, 任意のFLAファイルの_rootのフレーム1に次のように書きます。 ----------------------------------------- var en_menseki:Number = MyMath.abc(2); trace(en_menseki); ----------------------------------------- そして「制御」→「ムービープレビュー」すると動作確認ができます。 「Flash ActionScript2.0入門ノート 4.3 継承」 http://oshige.com/flash/note/43/

pory_bekk
質問者

お礼

>BlurFiltanさん 回答ありがとうございます。 AS2.0のクラスに関しても知らないことばかり(というか、使うような場面に遭遇した事が無く今まで一度も実践で使用した事が無い)なので勉強してみたいと思います。

  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

ActionScript 2.0 からは”クラス”という概念が導入され、クラスの性質上、そのような無茶がまかり通らなくなりました。 クラスには、自分で作成した変数や関数などを追加できるものと、最初からクラスが持っているものの他には何も追加できないものの2種類があります。 変数などを自由に追加できる性質を持つクラスを、”ダイナミッククラス”といいます。 Math クラスはダイナミッククラスではないので、変数などは一切追加できません。 ダイナミッククラスの例で分かりやすいのは、MovieClip クラスでしょうか。 仮に clip というインスタンス名を付けたムービークリップがあるとすると、ActionScript では MovieClip クラスの clip というオブジェクトが作成されます。 MovieClip クラスはダイナミッククラスですから、そのオブジェクトである clip もダイナミッククラスと同じ性質を持ちます。従って、clip には独自の変数や関数などを追加することができます。 例えば clip のタイムラインかインスタンスにオブジェクトアクションとして  function abc()  {   /*処理*/  } と書くと、関数 abc は clip に追加されて  clipのターゲットパス.abc(); で呼び出すことができます。 ダイナミッククラスは、クラス定義の部分に” dynamic ”というキーワードが付いているのが特徴です。 これは、実際にクラスの定義部分を見ていただいた方が早いでしょう。 「ファイル」メニュー→「開く」を選び、Flash をインストールしたフォルダ→言語(日本語版の場合は” ja ”)→ First Run → Classes → FP8 と開けていってみてください。 Array.as や Button.as など、見覚えのあるクラスの名前が付いた as ファイルが並んでいるかと思います。 このうちの MovieClip.as と Math.as を開き、” class ”というキーワードが付いている行に注目してください。 MovieClip クラスには先頭に” dynamic ”が付いていますが、Math クラスには付いていません。 つまり、MovieClip はダイナミッククラスで変数などを自由に追加できるのですが、dynamic キーワードが付いていない Math クラスはダイナミッククラスではないため、何も追加することはできないということです。 -------------------------------------------------------------- あえて Math 等のクラスに何かを追加したい理由は、ターゲットパスの問題でしょうか? ActionScript 2.0 まででしたら、_global という万能のターゲットパスが使えます。 例えば、メインのタイムラインのフレーム1に次のようなスクリプトを記述したとしますと。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください) /********************************************/  function abc()  {   trace( "Call" );  };  _global.ref_abc = abc; /********************************************/ 関数 abc はメインのタイムライン(通常は _root )のものです。 しかし、この関数の参照という情報を _global.ref_abc に入れていますから、  _global.ref_abc(); と書けば、ムービークリップの構成に関係なくどの階層からでも関数 abc を呼び出すことができるようになります。 同じ要領で、変数を各階層間で共用することもできます。 _global を使うと、変数の名前に” _global ”とさえ付ければどの階層からでも参照可能(同名の変数がなければ _global を省略できます)になります。 ターゲットパスを深く考えなくても済む反面、うっかり同じ名前の変数を作成して _global のものと混同するなど、思わぬ不具合の原因になる危険性も高まります。 _global として共用するものは必要最低限に留め、ターゲットパスが面倒だからというだけの理由なら使用を避けるべきだと思います。

pory_bekk
質問者

お礼

>DPEさん 丁寧な回答ありがとうございます。 >あえて Math 等のクラスに何かを追加したい理由は、ターゲットパスの問題でしょうか? 特に理由はありません^^; 今、参考にしてる書籍(大分昔の物)にたまたまMathにメソッドを追加できるという記載があり、試してみたところエラーが出て、結局これはAS1.0での話だなと思ったのでAS2.0以降ではどうするのだろう?と疑問に思ったのです。 当方、開発環境はCS3でAS2.0なのですが、未だにAS1.0/2.0の違いがちゃんと解っておらず曖昧だったり、AS2.0でも知らない事が多々あったりという感じで日々精進しています。 そんな状況でありながらも、AS3.0も少しずつ勉強していっている次第です。 スクリプト中~上級者の方からすれば、基本中の基本みたいな事も自分にとっては結構知らない事があるのでこれからも色々と質問させていただくと思いますがよろしくお願いします。

関連するQ&A