ActionScript 3.0では、イベントを取得するには、イベントリスナーへの登録が必要になりました。また、マウスイベントには、doubleClickが加わりました。ところが、普通のクリックは受取れるのに、同じ処理でダブルクリックを検出することができません。
スクリプト001■インスタンスのクリックを検出する
// タイムライン: _level0
// 第1フレームアクション
// [0]クラスのインポート
import flash.display.Sprite;
import flash.events.MouseEvent;
// [1]インスタンスの生成
var mySprite:Sprite = new Sprite();
mySprite.graphics.beginFill(0x0000FF);
mySprite.graphics.drawRect(0, 0, 50, 50);
this.addChild(mySprite);
mySprite.x = 20;
mySprite.y = 20;
// [2]イベントリスナーへの登録
mySprite.addEventListener(MouseEvent.CLICK, click);
// [3]イベントハンドラメソッド(コールバック関数)の定義
function click(eventObject:MouseEvent):void {
trace(eventObject.type); // 出力: click
}
[0]使用するクラスは、インスタンスを生成するSpriteとマウスイベントを管理するその名もMouseEventです。これらのクラスを、フルパスの名前(完全修飾クラス名)でimportします。完全修飾クラス名およびimportステートメントについては、「スクリプトでフィルタを使う − BlurFilter」をお読みください。
[1]インスタンスは、Spriteクラスで生成します。Spriteクラスを使ったインスタンスの動的な生成については、「new演算子でビジュアルオブジェクトをつくる」をご参照ください。
[2]イベントを受取るには、イベントリスナーに登録する必要があります。使うメソッドは、EventDispatcher.addEventListener()です。イベントリスナーの設定については、「ActionScript 3.0書き方教室」「3. ActionScript 3.0イベントリスナー」をご参照ください。
ターゲットは、[1]で生成したインスタンス。第1引数にはイベントのクリックを、MouseEvent.CLICKで指定します。さらに、イベントが発生したとき呼出す(コールバック)関数(function)を、第2引数として渡します。
[3]そのうえで、イベントリスナーに指定した(コールバック)関数(function)を定義します。上記スクリプト001では、テスト用として引数で受取ったMouseEventオブジェクトのtypeプロパティをtrace()関数で出力します。typeプロパティの値は発生したイベントの文字列ですので、[出力]パネルには"click"が表示されます(図001)。
図001■インスタンスをクリックすると関数が呼出される
(コールバック)関数はイベント名を文字列で[出力]する
スクリプト002■インスタンスのダブルクリックが検出できない
// タイムライン: _level0
// 第1フレームアクション
import flash.display.Sprite;
import flash.events.MouseEvent;
var mySprite:Sprite = new Sprite();
mySprite.graphics.beginFill(0x0000FF);
mySprite.graphics.drawRect(0, 0, 50, 50);
this.addChild(mySprite);
mySprite.x = 20;
mySprite.y = 20;
mySprite.addEventListener(MouseEvent.DOUBLE_CLICK, doubleClick);
function doubleClick(eventObject:MouseEvent):void {
trace(eventObject.type);
}
上記スクリプト002で、001から変更した部分は青字にしてあります。スクリプトの内容からして、この部分を変えればよさそうに思えます。しかし、実際にはダブルクリックしても、イベントが発生しません。
実はダブルクリックをイベントとして受取るかどうかは、設定ができるようになっているのです。そして、デフォルトでは、ダブルクリックを受取らない設定になっています。その設定のプロパティが、InteractiveObject.doubleClickEnabledです。ダブルクリックを受取るには、このプロパティの値をtrueに設定する必要があります。
上記スクリプト002に、InteractiveObject.doubleClickEnabledプロパティをtrueに設定するステートメントを追加すれば、インスタンスのダブルクリックが受取られるようになります(スクリプト003)。
スクリプト003■インスタンスのダブルクリックを検出する
// タイムライン: _level0
// 第1フレームアクション
import flash.display.Sprite;
import flash.events.MouseEvent;
var mySprite:Sprite = new Sprite();
mySprite.graphics.beginFill(0x0000FF);
mySprite.graphics.drawRect(0, 0, 50, 50);
this.addChild(mySprite);
mySprite.x = 20;
mySprite.y = 20;
mySprite.doubleClickEnabled = true;
mySprite.addEventListener(MouseEvent.DOUBLE_CLICK, doubleClick);
function doubleClick(eventObject:MouseEvent):void {
trace(eventObject.type); // 出力: doubleClick
}