Platform: All
Version: 2.0 and above
シンタックス[*1]
on (mouseEvent) {
// ステートメント
}
パラメータ
mouseEvent[*1] mouseEventはトリガーで、「イベント」と呼ばれます。イベントが発生すると、続く中括弧({})内のステートメントが実行されます。以下の値が、mouseEventパラメータとして指定できます。
-
press ポインタがボタン上で、マウスボタンを押したとき。
-
release ポインタがボタン上で、マウスボタンを放したとき[*2]。
-
releaseOutside ポインタがボタン上でマウスボタンを押し、そのままボタン領域外に出てからマウスボタンを放したとき。pressとdragOutイベントのふたつが、つねに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日