サイトトップ

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

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

onイベントハンドラアクション

ID: FN0512004 Product: Flash

Platform: All
Version: 2.0 and above

シンタックス[*1]
on (mouseEvent) {
   // ステートメント
}

パラメータ
mouseEvent[*1]    mouseEventはトリガーで、「イベント」と呼ばれます。イベントが発生すると、続く中括弧({})内のステートメントが実行されます。以下の値が、mouseEventパラメータとして指定できます。

  • press    ポインタがボタン上で、マウスボタンを押したとき。

  • release    ポインタがボタン上で、マウスボタンを放したとき[*2]。

  • releaseOutside    ポインタがボタン上でマウスボタンを押し、そのままボタン領域外に出てからマウスボタンを放したとき。pressdragOutイベントのふたつが、つねにreleaseOutsideイベントに先行します。

  • rollOut    ポインタがボタン領域外に出たとき。

  • rollOver    ポインタがボタン上に重なったとき。

  • dragOut    ポインタがボタン上でマウスボタンを押し、そのままボタン領域外に出たとき。

  • dragOver    ポインタがボタン上でマウスボタンを押し、そのままボタン領域外に出たうえで、改めてボタン上に戻って重なったとき。

  • keyPress "<key>"    指定したキーボードのキーが押されたとき。key>パラメータの箇所には、[アクション]パネルのコードヒントで表示されるキー定数を指定します[*3]。このパラメータを使ってキーの押下操作を先取りし、指定したキーの組込み動作を書替えることができます。ボタンは、アプリケーション上のどこに配置してもよく、ステージ上でもステージ外でも構いません。[制御] > [ムービープレビュー]でアプリケーションの動作確認をするとき、[制御] > [キーボードショートカットを無効]を選択しないと、特定のキーの組込み動作(訳者注: ショートカットキー)は書替わりません。

説明
マウスイベントやキーの押下を指定して、アクションを実行します。

技術上の制限として、on ()ハンドラはランタイムで適用できないことが挙げられます。このハンドラの設定は、オーサリング時に行う必要があります[*4]。

訳者注[*1] 原文では、「on(mouseEvent:Object)」および「mouseEvent:Object」とされています。しかし、イベントmouseEventに、Objectインスタンスは指定できません。

訳者注[*2] そのインスタンスに対して、pressイベントが発生している必要があります。つまり、インスタンス上でマウスボタンを押した状態のまま、同一インスタンスの上でマウスボタンを放した場合です。

訳者注[*3] 原文は、キー定数についてKeyクラスの参照を求めています("For a list of key constants, see the Key class.")。しかし、Keyクラスの定数は、キーコードを返すプロパティで、on (keyPress)ハンドラに指定するキー定数とは異なります。

たとえば、以下の指定は、シンタックスエラーになります。

on (keyPress Key.SPACE) {} // エラー
// on (keyPress "<Space>") {} // OK
on (keyPress 65) {} // エラー *65は[A]キーのキーコード
// on (keyPress "A") {} // OK

文字キーは、単独の文字をストリングで指定します。また、"a"と"A"とは区別されますので、ご注意ください。

訳者注[*4] 原文では、この注意書きは、keyPressイベントの項に記載されています。しかし、イベントハンドラアクションが動的に設定できないことは、on ()だけでなくonClipEvent ()も含めた仕様です。


つぎのスクリプトは、startDrag()関数をマウスが押されたときに実行します。そして、release時のスクリプトが、マウスを放してインスタンスをドロップしたときに実行されます[*5][*6]。

on (press) {
   startDrag(this);
}

on (release) {
   trace("X:"+this._x);
   trace("Y:"+this._y);
   stopDrag();
}


[*5] インスタンスをドラッグする操作で、マウスを素早く動かすと、インスタンスの領域外でボタンを放す可能性があります。その場合に備えてreleaseOutsideイベントの処理を加えておくのが確実でしょう(上記の例では、インスタンス外でマウスボタンを放すと、stopDrag()関数が実行されず、インスタンスがポインタに追随し続けてしまいます)。

複数のイベントで同一の処理を行う場合には、イベントはひとつのon ()ハンドラの中に、カンマ区切りで指定することができます。ただし、keyPressイベントは、ひとつのon ()ハンドラに複数の指定はできないようです。つぎのスクリプトは、マウスクリックでインスタンスのドラッグを開始し、インスタンス外でうすボタンを放しても、ドラッグは終了します。

// MovieClip: ドラッグするインスタンス
// MovieClipアクション
on (press) {
  this.startDrag();
}
on (release, releaseOutside) {
  trace("X: "+this._x);
  trace("Y: "+this._y);
  this.stopDrag();
}

[*6] keyPressイベントは、on ()ハンドラにカンマ区切りで複数指定することができません。したがって、判定するキーの数だけハンドラが必要になります。上下左右の矢印キーで、インスタンスをその方向に1ピクセルずつ移動するスクリプトは、つぎのようになります。

// MovieClip: 矢印キーで移動するインスタンス
// MovieClipアクション
on (keyPress "<Up>") {
  _y -= 1;
}
on (keyPress "<Down>") {
  _y += 1;
}
on (keyPress "<Left>") {
  _x -= 1;
}
on (keyPress "<Right>") {
  _x += 1;
}

ハンドラがバラバラになると、スクリプトの柔軟性は失われます。たとえば、[shift]キーを同時に押すと移動ピクセル数が10に変わるという仕様を追加するには、ハンドラごとに条件判定の処理を加えなければなりません。このような場合には、onClipEvent (keyDown)イベントハンドラアクションを使うと、つぎのように処理をまとめることができます。

// MovieClip: 矢印キーで移動するインスタンス
// MovieClipアクション
onClipEvent (keyDown) {
  // 移動ピクセル数の決定
  var nStep:Number;
  if (Key.isDown(Key.SHIFT)) {
    nStep = 10;
  } else {
    nStep = 1;
  }
  // 操作したキーごとの処理
  switch (Key.getCode()) {
  case (Key.UP) :
    _y -= nStep;
    break;
  case (Key.DOWN) :
    _y += nStep;
    break;
  case (Key.LEFT) :
    _x -= nStep;
    break;
  case (Key.RIGHT) :
    _x += nStep;
    break;
  }
}

Player
ActionScript 1.0/Flash Player 2以降。ただし、Flash 2では、すべてのイベントはサポートされません。

出典
Flash 8 ActionScript 2.0 Language Reference > on handlerより邦訳。

_____

作成者: 野中文雄
作成日: 2005年12月30日


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