オブジェクトの操作

ActionScript は、オブジェクト指向のプログラミング言語として知られています。オブジェクト指向のプログラミングは、プログラミングアプローチの 1 つです。このアプローチでは、オブジェクトを使用してプログラムのコードを構成します。

このドキュメントの前半で、「コンピュータープログラム」という用語を、コンピューターが実行する一連の手順(命令)と定義しました。概念上は、コンピュータープログラムは、多数の命令が記述された 1 つの長いリストと想定できます。ただし、オブジェクト指向プログラミングでは、プログラム命令は異なるオブジェクト間で分割されます。コードは機能ごとにまとめられるため、機能に関連するデータ型または関連する情報は、1 つのコンテナにグループ化されます。

Adobe Flash Professional

Flash Professional でシンボルを使用したことのあるデザイナーは、実はオブジェクトの取り扱いを既に知っているといえます。例えば、矩形などのムービークリップシンボルを定義して、そのコピーをステージに配置したとします。そのムービークリップシンボルは、実際には ActionScript のオブジェクトでもあり、MovieClip クラスのインスタンスです。

ムービークリップには、変更可能な様々な特性があります。 ムービークリップが選択されている場合、そのムービークリップの x 座標や幅などの値をプロパティインスペクターで変更できます。さらに、アルファ(透明度)を変更したり、ドロップシャドウフィルターをムービークリップに適用することで、様々なカラー調整を行うこともできます。他の Flash Professional ツールを使用すると、自由変形ツールを使って矩形を回転するなど、さらに多くの変更が可能になります。Flash Professional でムービークリップシンボルを変更するこれらの方法はすべて、ActionScript でも使用できます。ActionScript では、MovieClip オブジェクトと呼ばれる 1 つのバンドルにまとめられたデータを変更することで、ムービークリップの変更を行います。

ActionScript のオブジェクト指向プログラミングでは、クラスに 3 種類の特性を指定できます。

  • プロパティ

  • メソッド

  • イベント

これらの要素は、プログラムで使用されるデータの管理と、どのアクションをどの順序で実行するかの決定に使用されます。

プロパティ

プロパティは、オブジェクト内でまとめてバンドルされるデータグループの 1 つを表します。 例えば、Song オブジェクトには、artisttitle という名前のプロパティを指定できます。MovieClip クラスには、rotationxwidthalpha などのプロパティを指定できます。プロパティは、個々の変数と同じように扱うことができます。つまり、プロパティは、オブジェクト内に格納された「子」変数と見なすことができます。

次に示すのは、プロパティを使用する ActionScript コードの例です。 次のコード行は、square という名前の MovieClip を x 座標で 100 ピクセル移動します。

square.x = 100;

次のコードでは、square MovieClip を triangle MovieClip の回転に合わせて回転するために、rotation プロパティが使用されています。

square.rotation = triangle.rotation;

次のコードは、square MovieClip の水平スケールを、従来の 1.5 倍の幅になるように変更します。

square.scaleX = 1.5;

共通の構造として、オブジェクト名に変数(squaretriangle)を使用し、ピリオド(.)、プロパティの名前(xrotationscaleX)が続きます。ドット演算子と呼ばれるピリオドは、オブジェクトの子要素のいずれかにアクセスしていることを表すために使用します。全体の構造「変数名-ドット-プロパティ名」は、コンピューターのメモリ内の単一の値の名前として、単一の変数と同様に使用されます。

メソッド

メソッドは、オブジェクトで実行可能なアクションです。例えば、Flash Professional で、タイムラインに複数のキーフレームとアニメーションが配置されたムービークリップシンボルを作成するとします。作成したムービークリップは再生、停止したり、特定のフレームに再生ヘッドを移動するように指示することもできます。

次のコードは、shortFilm という名前の MovieClip に再生を開始するよう指示します。

shortFilm.play();

次の行により、shortFilm という名前の MovieClip は再生を停止します(再生ヘッドは、ビデオの一時停止のように、所定の位置で停止します)。

shortFilm.stop();

次のコードは、shortFilm という MovieClip の再生ヘッドをフレーム 1 に移動し、再生を停止します(ビデオの巻き戻しと同じです)。

shortFilm.gotoAndStop(1);

プロパティと同様、メソッドにアクセスするには、オブジェクト名(変数)、ピリオド、メソッド名、括弧の順で記述します。括弧は、メソッドを呼び出している、つまり、アクションの実行をオブジェクトに指示していることを示します。値(または変数)が括弧内に記述されていることもありますが、このようにすると、アクションの実行に必要な追加情報を渡すことができます。これらの値はメソッドパラメーターと呼ばれます。例えば、gotoAndStop() メソッドには、移動先のフレームの情報が必要なので、括弧内にパラメーターが 1 つ必要です。play()stop() などのメソッドの処理内容は自明であり、他の情報は不要です。ただし、この場合も括弧を使って記述されます。

プロパティ(および変数)と異なり、メソッドは値のプレースホルダーとして使用されません。ただし、計算を実行し、変数と同様に使用できる結果を返すメソッドもあります。 例えば、Number クラスの toString() メソッドは、数値をそのテキスト表現に変換します。

var numericData:Number = 9; 
var textData:String = numericData.toString();

例えば、画面のテキストフィールドに Number 変数の値を表示する場合は、toString() メソッドを使用します。TextField クラスの text プロパティは、String として定義されているので、テキスト値のみ格納できます(property というテキストは、画面に表示される実際のテキストコンテンツを表します)。次のコード行は、変数 numericData の数値をテキストに変換します。次に、画面上の calculatorDisplayという TextField オブジェクトに値を表示します。

calculatorDisplay.text = numericData.toString();

イベント

コンピュータープログラムとは、コンピューターがステップバイステップ方式で実行する一連の命令です。単純なコンピュータープログラムの場合、コンピューターが実行するいくつかの手順のみで構成されることもあります。また手順を実行した時点でプログラムは終了します。ただし、ActionScript のプログラムはユーザー入力またはその他のイベントの発生を待機しながら、実行を継続するように設計されています。 イベントは、コンピューターがどの命令をいつ実行するかを判断するメカニズムです。

基本的には、イベントは ActionScript が認識し応答できる事象です。多くのイベントはボタンのクリックやキーボードからのキー入力など、ユーザー操作に関連しています。また、他の種類のイベントもあります。例えば、ActionScript から外部イメージを読み込む場合、イメージの読み込みの終了を知らせるイベントが発生します。概念上は、ActionScript プログラムを実行している間、ActionScript プログラムは特定の出来事が発生するのを待機していることになります。特定の出来事が発生すると、それらのイベント用に指定しておいた特定の ActionScript コードが実行されます。

基本的なイベント処理

特定のイベントに応答して実行される特定のアクションを指定する手段を「イベント処理」と呼びます。イベント処理を実行する ActionScript コードを作成する場合、特定する必要がある 3 つの重要な要素があります。

  • イベントソース:イベントはどのオブジェクトに対して発生するか。 例えば、どのボタンがクリックされたか、またはどの Loader オブジェクトがイメージを読み込んでいるかなどの要素です。イベントソースは、イベントターゲットとも呼ばれます。イベントソースは、コンピューターがイベントのターゲットとする(イベントが実際に発生する)オブジェクトです。

  • イベント:起ころうとしていること、すなわち応答が必要な出来事は何か。多くのオブジェクトが複数のイベントをトリガーするため、イベントの特定作業は重要です。

  • 応答:イベントが起こったときに、どの手順を実行するか。

イベントを処理する ActionScript コードを作成する場合は、常にコードにこれら 3 つの要素を指定する必要があります。コードは次の基本構造に従います(太字の要素は、固有の事例に応じて入力するプレースホルダーを示します)。

function eventResponse(eventObject:EventType):void 
{ 
    // Actions performed in response to the event go here. 
} 
  
eventSource.addEventListener(EventType.EVENT_NAME, eventResponse);

このコードは 2 つのことを行います。まず、関数を定義します。関数はイベントに対応して実行するアクションをユーザーが指定する方法です。 次に、ソースオブジェクトの addEventListener() メソッドを呼び出します。addEventListener() を呼び出すと、指定したイベントに対して関数が「サブスクライブ」されます。そのイベントが発生すると、機能のアクションが実行されます。ここで、各動作を詳細に検討します。

関数は、いくつかのアクションを 1 つの名前でグループ化する手段を提供します。これは、アクションを実行するためのショートカット名のようなものです。関数はメソッドに似ていますが、必ずしも特定のクラスに関連付けられているわけではありません(実際には、「メソッド」を特定のクラスに関連付けられた関数として定義することはできます)。イベント処理を行う関数を作成する場合は、関数の名前を選択する必要があります(この場合はeventResponse)。またパラメーターを 1 つ(この例では eventObject)指定する必要があります。関数パラメーターの指定は、変数の宣言に似ています。このため、パラメーターのデータ型を指定する必要があります。 この例ではパラメーターのデータ型は EventType です。

監視するイベントの各タイプには、ActionScript クラスが関連付けられています。関数パラメーターに指定するデータ型は常に、応答の必要な特定のイベントに関連付けられたクラスになります。例えば、click イベント(ユーザーがアイテムをマウスでクリックしたときにトリガーされる)は、MouseEvent クラスに関連付けられています。click イベントに対してリスナー関数を作成するには、MouseEvent データ型のパラメーターを使用してリスナー関数を定義します。最後に、左中括弧と右中括弧の間({ ... })に、イベントの発生時にコンピューターに実行を指示する命令を記述します。

以上で、イベント処理関数が作成されました。次に、イベントソースオブジェクト(ボタンなど、イベントの発生原因となるオブジェクト)に、イベントが発生したときにその関数を呼び出すように指示します。関数をイベントソースオブジェクトに登録するには、そのオブジェクトの addEventListener() メソッドを呼び出します(イベントに関連付けられたオブジェクトはすべて、addEventListener() メソッドにも関連付けられます)。addEventListener() メソッドは 2 つのパラメーターを受け取ります。

  • 1 つ目は、応答の必要な個々のイベントの名前です。 各イベントは特定のクラスに関連付けられています。すべてのクラスは、固有の値を持ちます。この値は、各イベント用に定義されている固有の名前のようなものです。この値は、最初のパラメーターに使用します。

  • 2 つ目は、イベント応答関数の名前です。 関数名をパラメーターとして渡す場合は、括弧なしで記述します。

イベント処理プロセス

次に、イベントリスナーを作成するときに発生するプロセスの詳しい手順を説明します。 この例では、myButton という名前のオブジェクトをクリックしたときに呼び出されるリスナー関数を作成します。

プログラマーが作成する実際のコードは次のとおりです。

function eventResponse(event:MouseEvent):void 
{ 
    // Actions performed in response to the event go here. 
} 
 
myButton.addEventListener(MouseEvent.CLICK, eventResponse);

実行時のこのコードの実際の機能を次に示します。

  1. SWF ファイルがロードされると、コンピューターは、eventResponse() という名前の関数があることを認識します。

  2. 次に、コンピューターはコード(具体的には、関数に含まれないコード行)を実行します。この場合は、1 行だけのコードです。イベントソースオブジェクト(myButton)で addEventListener() メソッドを呼び出し、eventResponse 関数をパラメーターとして渡します。

    myButton の内部には、その各イベントを監視する関数のリストがあります。そのaddEventListener() メソッドが呼び出されると、myButtoneventResponse() 関数をそのイベントリスナーのリストに保存します。

  3. ある時点で、ユーザーが myButton オブジェクトをクリックし、その click イベント(コードで MouseEvent.CLICK と識別される)をトリガーします。

    その時点で、以下の処理が行われます。

    1. 対象のイベントに関連付けられたクラスのインスタンスとなるオブジェクトが作成されます(この例では MouseEvent)。多くのイベントでは、このオブジェクトは Event クラスのインスタンスです。マウスイベントでは、MouseEvent インスタンスです。その他のイベントでは、そのイベントに関連付けられたクラスのインスタンスです。作成されるこのオブジェクトはイベントオブジェクトと呼ばれます。このオブジェクトには、イベントの種類、発生場所、その他のイベント固有の情報など、発生したイベントに関する固有の情報が含まれます。

    2. 次に、コンピューターは myButton に格納されているイベントリスナーのリストを参照します。この関数を 1 つずつ確認し、各関数を呼び出し、イベントオブジェクトをパラメーターとして関数に渡します。eventResponse() 関数は myButton のリスナーの 1 つなので、このプロセスの一環として、コンピューターは eventResponse() 関数を呼び出します。

    3. eventResponse() 関数が呼び出されると、その関数のコードが実行されるので、指定したアクションが実行されます。

イベント処理の例

ここでは、イベント処理コードの具体例をいくつか紹介します。これらの例は、イベント処理コードの作成に際し、共通のイベント要素とそのバリエーションを考えるときに参考になります。

  • ボタンをクリックして、現在のムービークリップの再生を開始。 次の例では、playButton はボタンのインスタンス名であり、this は「現在のオブジェクト」を意味する特別な名前です。

    this.stop(); 
     
    function playMovie(event:MouseEvent):void 
    { 
        this.play(); 
    } 
     
    playButton.addEventListener(MouseEvent.CLICK, playMovie);
  • テキストフィールドへの入力の検出。 この例では、entryText はテキスト入力フィールド、outputText はダイナミックテキストフィールドです。

    function updateOutput(event:TextEvent):void 
    { 
        var pressedKey:String = event.text; 
        outputText.text = "You typed: " + pressedKey; 
    } 
     
    entryText.addEventListener(TextEvent.TEXT_INPUT, updateOutput);
  • ボタンをクリックして URL に移動。 この場合、linkButton はボタンのインスタンス名です。

    function gotoAdobeSite(event:MouseEvent):void 
    { 
        var adobeURL:URLRequest = new URLRequest("http://www.adobe.com/"); 
        navigateToURL(adobeURL); 
    } 
     
    linkButton.addEventListener(MouseEvent.CLICK, gotoAdobeSite);

オブジェクトインスタンスの作成

ActionScript でオブジェクトを使用するには、あらかじめそのオブジェクトが存在している必要があります。オブジェクト作成の一環として、変数の宣言がありますが、変数の宣言により作成されるのは、コンピューターメモリ内の空き領域のみです。変数には、使用または操作する前に必ず実際の値を割り当てます。それには、オブジェクトを作成し、これを変数に格納します。オブジェクト作成のプロセスは、オブジェクトのインスタンス化と呼ばれます。要するに、オブジェクトの作成とは、特定のクラスのインスタンスを作成することです。

オブジェクトのインスタンスを作成する場合、ActionScript をまったく使用しない簡単な方法もあります。Flash Professional では、ムービークリップシンボル、ボタンシンボル、またはテキストフィールドをステージに配置し、インスタンス名を割り当てます。Flash Professional は自動的に変数をそのインスタンス名で宣言し、オブジェクトインスタンスを作成し、そのオブジェクトを変数に格納します。同様に、Flex では、MXML タグをコーディングするか、Flash Builder デザインモードのエディターにコンポーネントを配置することで、MXML コンポーネントを作成できます。そのコンポーネントに ID を割り当てた場合、その ID は、コンポーネントのインスタンスを格納する ActionScript の変数名になります。

ただし、オブジェクトを視認しながら作成する必要がない場合もあります。また、不可視のオブジェクトは、視認しながら作成することができません。ActionScript のみを使用して、オブジェクトインスタンスを作成する方法もいくつかあります。

まず、ActionScript のデータ型を何種類か使用する場合、文字式、すなわち ActionScript コードに直接記述される値を使用して、インスタンスを作成できます。次に例を示します。

  • Literal 数値(数字を直接入力):

    var someNumber:Number = 17.239; 
    var someNegativeInteger:int = -53; 
    var someUint:uint = 22;
  • Literal String 値(テキストを二重引用符で囲む):

    var firstName:String = "George"; 
    var soliloquy:String = "To be or not to be, that is the question...";
  • Literal Boolean 値(リテラル値 true または false を使用):

    var niceWeather:Boolean = true; 
    var playingOutside:Boolean = false;
  • Literal Array 値(値のコンマ区切りリストを角括弧で囲む):

    var seasons:Array = ["spring", "summer", "autumn", "winter"];
  • Literal XML 値(XML を直接入力):

    var employee:XML = <employee> 
            <firstName>Harold</firstName> 
            <lastName>Webster</lastName> 
        </employee>;

ActionScript では、Array、RegExp、Object、Function の各データ型についてもリテラル値を記述する方法が定義されています。

任意のデータ型のインスタンスを作成する最も一般的な方法では、次のように、new 演算子をクラス名と一緒に使用します。

var raceCar:MovieClip = new MovieClip(); 
var birthday:Date = new Date(2006, 7, 9);

new 演算子を使用したオブジェクトの作成は、多くの場合、「クラスのコンストラクターの呼び出し」と呼ばれます。コンストラクターは、クラスのインスタンスの作成プロセスの一環として呼び出される特別なメソッドです。インスタンスをこの方法で作成する場合、クラス名の後に括弧を配置します。括弧内にパラメーター値を指定することもあります。この 2 つの作業はメソッドを呼び出す場合にも行います。

なお、リテラル値を指定してインスタンスを作成できるデータ型についても、new 演算子を使用してオブジェクトインスタンスを作成することもできます。例えば、次の 2 行のコードは、完全に同じ操作を行います。

var someNumber:Number = 6.33; 
var someNumber:Number = new Number(6.33);

new ClassName() を使用したオブジェクトの作成方法に慣れておく必要があります。多くの ActionScript データ型には視覚表現がありません。したがって、それらのデータ型のインスタンスは、Flash Professional のステージや Flash Builder の MXML エディターのデザインモードにアイテムを配置することによっては作成できません。これらのデータ型のインスタンスを作成するには、ActionScript で new 演算子を使用するしかありません。

Adobe Flash Professional

Flash Professional では、ライブラリで定義されているが、ステージには配置されていないムービークリップシンボルのインスタンスの作成にも、new 演算子を使用できます。