• ベストアンサー

クリック押下中にキーボードを押すとクリックを離したことになってしまう!

タイトルの通りです。 まずマウスでmc1をクリックと「クリックしている」と表示されるのですが、そのままクリックした状態でなにかのキーを押すと「クリックを離した」とでてしまうのです。 _root.mc1.onPress = function(){ trace("クリックをしている") } _root.mc1.onRelease = function(){ trace("クリックを離した") } クリックを押下し続けている間は「押し続けているのだ」という情報を得る方法はないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

その現象はムービープレビューの時だけ起こるのではないでしょうか? ムービープレビューで、「キーボードショートカットを無効」(プレビュー時の「制御」メニュー内にあります)にチェックを入れてプレビューしてみてください。 スタンドアロンプレイヤーやブラウザでは trace アクションが無効になるので、視覚的に分かりやすい例で実験してみるとしましょう。 ムービークリップシンボルを1つ、用意します。 シンボルのタイムラインのフレーム1に青い丸、フレーム2に赤い丸を描き、それぞれのフレームに stop(); を入れてください。 できたシンボルのインスタンスをステージに配置し、インスタンス名を付けます。ここでは仮に” mc1 ”とします。 下記のスクリプトをメインのタイムラインのフレームに書き、プレビューしてみてください。 mc1 をクリックすると、(ムービークリップの)フレーム2に描かれている赤い丸が表示され、そのマウスボタンを離すとフレーム1の絵である青い丸に戻り、←と→キーで左右に動く・・・という、単純な動作のスクリプトです。 (↓各行頭に全角のスペースが入っています。コピーする際はご注意ください)  /*クリックで絵を切り替え、離した時に元に戻す*/  mc1.onPress = function()  {   this.gotoAndStop( 2 );  };  mc1.onRelease = function()  {   this.gotoAndStop( 1 );  };  /*方向キーで移動*/  mc1.onEnterFrame = function()  {   var spd = 5;   //← →キーで左右に移動   if( Key.isDown( Key.LEFT ) )   {    this._x -= spd;   }   if( Key.isDown( Key.RIGHT ) )   {    this._x += spd;   }  }; 「キーボードショートカットを無効」にチェックを入れた時は、mc1 をクリックしながら←または→キーを押しても青(=フレーム1の絵)には戻らず、位置だけが変化します。 しかし、「キーボードショートカットを無効」のチェックが外れている時は、mc1 をクリックしている間に何かキーを押すと勝手に青に戻ってしまいます。 パブリッシュしてスタンドアロンプレイヤーかブラウザで見ると、ショートカットを無効にした時と同じ動作になります。 つまり、キーボード操作により release イベントが勝手に発生するのは、単にプレビュー時にキーボードショートカットが有効になっていることが原因と思われます。 上記の例はフレームを切り替える動作でしたが。 例えば、フラグを用意して、press イベント発生時に true 、release イベント発生時に false に書き換えるようにします。 あとはこのフラグの値を if 文で判別すれば、「マウスのボタンが押されている」という状態を検出できます。 --------------------------------------------------------------- press 等のボタンイベントを利用するムービークリップは、「選択できる、いわゆるボタン同様のオブジェクト」ということで、キーボードでも選択できるようになるなど様々な意味で特別な存在になります。 Flash で作るメニュー画面やリストなどでは、キーボードでもボタンを操作できた方が便利です。 しかし、ゲームのように操作方法を制限したい場合は、ムービークリップがボタンオブジェクトになっていると思わぬところで意図しないイベントが発生してしまい、妙な不具合の原因になることがあります。 単純にマウスボタンが押されているかどうかを判断したいだけなら、press と release よりも mouseDown と mouseUp イベントの方がオススメです。 mouseDown と mouseUp はボタンイベントではないので、これらを利用するムービークリップはボタンオブジェクト扱いにはなりません。 mouseDown と mouseUp はムービークリップのイベントですが、press とは違い、そのムービークリップの上でマウスのボタンが押されていなくても発生します。 Flash Player 6 以降であれば、_root.onMouseDown = function・・・という書き方で _root の mouseDown / Up イベントを借りることができますから、マウス操作を検出するためだけのムービークリップを隠しておく必要もなくなります。 他にも、マウス関連の処理を専門に担当する Mouse クラス( Flash MX ではオブジェクト)もあります。 ムービークリップと同様に onMouseDown や onMouseUp というイベントハンドラがあり、機能や使い方はよく似てます。 機会がありましたら研究してみてください。  ・ Flash ドキュメンテーション: Mouse クラス   http://livedocs.adobe.com/flash/8_jp/main/00002427.html

tenketu
質問者

お礼

おお!そうだったんですか! てっきりプログラムのエラーかと思っていたのですが、そういう仕様の問題だとは少しも考えていませんでした。 この回答をもらわなければ危うくあと何時間もこの問題に悩まされるところでした。 本当に感謝いたします。 ありがとうございました。

関連するQ&A