サイトトップ

Director Flash 書籍 業務内容 プロフィール

Adobe Flash非公式テクニカルノート

シンボルにクラスを定めるときのヒント

ID: FN1112001 Product: Flash CS4 and above Platform: All Version: 10 and above/ActionScript 3.0

[ライブラリ]から[シンボルプロパティ]ダイアログボックスを開くと(パネルメニューより[プロパティ]を選択)、シンボルに[クラス]が入力できます(図001)。クラスを定めたシンボルは、スクリプトで動的に扱えるようになります。本稿では、シンボルに[クラス]を設定するとき注意する点や知っておくと便利なことを4つほどご紹介します。なお、シンボルへのクラスの設定について詳しくは、「ActionScript 3.0で始めるオブジェクト指向スクリプティング」第22回「MovieClipシンボルにクラスを定義する」をお読みください。

図001■[シンボルプロパティ]の[ActionScriptリンケージ]で[クラス]が設定できる


01 クラスは定義しなくともよい
シンボルに[クラス]を定めると、まずインスタンスがスクリプトから動的につくれます。それだけが目的で、とくにプロパティやメソッドを加えるつもりがないときは、クラス定義のASファイルはなくても構いません。

[シンボルプロパティ]ダイアログボックスの[クラス]フィールドには、一意の識別子を書入れます。そのクラスがなければ、下図002のような警告ダイアログボックスが示されます。そこで、[OK]ボタンをクリックすると、[クラス]に入力した名前で空のクラスが自動的につくられます。

図002■クラス定義がないとき自動生成される旨の警告ダイアログボックス
図002

MovieClipシンボルならその空のクラスはMovieClipクラスを継承し、引数なしのコンストラクタメソッドが定められます。したがって、設定したクラスのコンストラクタメソッドを呼出すことにより、インスタンスが動的につくれます。なお、シンボルに設定した[クラス]が継承するクラスは、[シンボルプロパティ]ダイアログボックスの[基本クラス]に示されます(前掲図001参照)。


02 パッケージを定めたクラスは完全修飾名で記述する
クラスにはパッケージが定められます。パッケージに納めたクラスも、もちろんシンボルに設定できます。ただし、[ヘルプ]の[ActionScriptに対するライブラリシンボルの書き出し]には、[シンボルプロパティ]ダイアログボックスの[クラス]の指定についてつぎのように説明されています。

シンボルの動作でカスタムクラスを使用するよう指定するには、パッケージも含むクラスのフルネームをこのフィールドに入力します。

つまり、パッケージのクラスは、パッケージまで含めた「完全修飾クラス名」で書かなければならないのです。たとえば、クラスPenをantarcticというパッケージに定めたとします。

package antarctic {
  import flash.display.Sprite;
  public class Pen extends Sprite {
    public function Pen() {}
  }
}

この場合、[シンボルプロパティ]ダイアログボックスの[クラス]にPenというクラス名だけを書いたのでは足りません。パッケージ名も含めた完全修飾名でクラスを指定しなければならないのです。

antarctic.Pen

実際、[シンボルプロパティ]ダイアログボックスの[基本クラス]も完全修飾クラス名が示されています(前掲図001参照)。


03 MovieClipシンボルにSpriteクラスを直接継承させる
Spriteクラスは、MovieClipのスーパークラスです。MovieClipクラスと異なり、タイムラインをもちません。逆にタイムラインが要らないときは、インスタンスはSpriteの方がMovieClipより軽く済みます(F-site「DisplayObjectインスタンスの種類と使用メモリ」参照)。

1フレームだけで、フレームアクションもないMovieClipシンボルには、Spriteのサブクラスが設定できます。また、クラス定義がないときも、[シンボルプロパティ]ダイアログボックスの[基本クラス]をSpriteクラスに書替えれば、スーパークラス(基本クラス)がSpriteになります(図003)。

図003■MovieClipシンボルの[基本クラス]にSpriteを設定する
図003

気をつけなければならないのは、シンボルのフレームアクションです[*1]。[アクション]パネルでコメントはもちろん半角スペースひとつ入力しただけでも、コンパイルエラー#1180が示されます[*2]。したがって、MovieClipシンボルに定めた[クラス]にSpriteクラスを直接継承させたときは、フレームアクションとして有効かどうかを問わず、[アクション]パネルに一切入力があってはいけません。

図004■フレームアクションにひと文字でも入力があるとコンパイルエラーになる
図004

[*1] これに対して、シンボルにフレームが複数あるときは、第2フレーム以降が無視されるだけでとくにエラーは起こりません。

[*2] MovieClip.addFrameScript()は、MovieClipシンボルにフレームアクションが書かれていると内部的に呼出される非ドキュメントのメソッドです。詳しくは、プログラマ気分「【AS3.0】ドキュメントに載らないメソッド(addFrameScript)」やapeirophobia「MovieClip.addFrameScript」などをご参照ください。


04 ひとつのクラスを複数のシンボルに設定する
ひとつのクラスを、複数のシンボルに設定して使いたいことがあります。しかし、シンボルに定めるクラスは一意というのが決まりです。したがって、[シンボルプロパティ]ダイアログボックスの[クラス]には、他のシンボルに設定したクラスは使えません。

けれど、あるクラスのプロパティやメソッドを複数のクラスで使い回したいのでしたら、そのクラスを継承すれば済みます。つまり、設定したいシンボルの数だけ一意のクラスを用意し、使い回したいクラスをそれらのスーパークラスに定めればよいのです。

もっとも、そのために空のサブクラスを、いちいち定義する必要はありません。使い回したいクラスは、シンボルの[基本クラス]に設定します(図005)。そのうえで、[クラス]には一意の識別子を定めれば、[基本クラス]を継承する[クラス]が自動的につくられます。

図005■複数のシンボルで使い回したいクラスは[基本クラス]に設定する
図005


作成者: 野中文雄
作成日: 2011年12月23日


Copyright © 2001-2011 Fumio Nonaka.  All rights reserved.