• ベストアンサー

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

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

  • Flash
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
  • 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

  • 【action script】複数のMCを・・・

    環境:Flash8 actionscript2.0 10こ程度のムービークリップをそれぞれクリックした時に同じ動きをさせる文を1つにまとめることは可能でしょうか? ムービークリップそれぞれに mc1 mc2 mc3 …mc10 とインスタンス名をつけています。 さらにその下位層に mc1  └kai_mc mc2 └kai_mc ・ ・ ・ mc10 └kai_mc と置いています。 このそれぞれのムービークリップをクリックした際、その下位層のムービークリップを次のフレームに移動させたいと考えています。 それぞれ個別に書くと _root.mc1.onRelease=function(){ _root.mc1.kai_mc.nextFrame() } と書いていたのですが、ムービークリップの数を増やすかも知れずムービークリップの数分書くのは大変なので1つにまとめたいと考えています。 自分で以下のように書いてみました。 i=0 for(i=1; i>10; i++){ _root["mc"+i].onRelease.function(){ _root["mc"+i].kai_mc.nextFrame() } } うまくいかないので試行錯誤したりtraceで調べたりしたのですがどうもよくわかりません。 i=0 for(i=1; i>10; i++){ _root["mc"+i].onRelease.function(){ trace(i) } } で出力すると 11と表示されるのでpassが違うとは思うのですが・・・ iを1~10で指定しているのになぜ11となるのでしょうか? どうすればpass指定できるのでしょうか? そもそものやり方、考え方が違うかどうかも含め、教えて頂きたく質問しました。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • MovieClip.propertyで設定したメソッドが消えてしまう

    お世話になっております。 ステージ上のMovieClip my_mc があるとします。 ActionScriptは以下になります。 MovieClip.property.hogehoge = function(){  trace("hogehogehoge"); } my_mc.onPress = function(){  this.hogehoge(); } 1回目にmy_mcをクリックすると正常に『hogehogehoge』と表示されます。 しかし、クリックを何回かしているうちに何も表示されなくなります。2回目以降の時もあれば、5回目以降の時もあります。 一度表示されなくなると、それ以降は表示されません。 試しに以下のようにトレースしました。 my_mc.onPress = function(){  trace(this.hogehoge);  this.hogehoge(); } 正常に表示される時は『[type Function]』と表示され、表示されなくなると『undefined』になります。 なぜ、undefined になるかがわかりません ご教授のほど宜しくお願い致します。

  • MCのクリックした部分をゆっくり中央に移動させたい。

    back_mcをサイズ(600,400)のシーン上に配置し、 シーンに下記フレームスクリプトを記入し、 MCのクリックした部分を中央に移動させましたが、 これを緩やかに移動させるにはどのようにすればよいでしょうか? back_mc.onRelease = function () { _root.back_mc._x = _root.back_mc._x +(300 - _root._xmouse); _root.back_mc._y = _root.back_mc._y +(200 - _root._ymouse); }

    • ベストアンサー
    • Flash
  • マウス位置によって画像を切り替える

    ステージ上のマウス位置を読み取り、その座標によって画像を切り替えるFlashを作成中なのですが、上手くいきません。 流れとしては 画像のファイルを読み込む ↓ 画像のファイル分だけムービークリップを作成 ↓ マウスの座標に応じて画像(ムービークリップを切り替える) というものです。 下記のようにかいています。 ●1フレーム目 //各画像の変数読み込み jpg1 = "test1.jpg"; jpg2 = "test2.jpg"; jpg3 = "test3.jpg"; jpg4 = "test4.jpg"; //初期配置 //空のMCを作成し、その中に画像変数を読み込ませる。 _root.createEmptyMovieClip("image_mc0",4); _root.createEmptyMovieClip("image_mc1",3); _root.createEmptyMovieClip("image_mc2",2); _root.createEmptyMovieClip("image_mc3",1); _root.image_mc0.loadMovie(_root.jpg1); _root.image_mc1.loadMovie(_root.jpg2); _root.image_mc2.loadMovie(_root.jpg3); _root.image_mc3.loadMovie(_root.jpg4); //マウスが押されたときに変数MCclickをオンにする _root.mouse_mc.onPress = function() { MCclick = true; trace( "押された時の変数 " +_root.MCclick); } //マウスが離れた時に変数MCclickをオフにする _root.mouse_mc.onRelease = function() { MCclick = false; trace( "離れた時の変数 " +_root.MCclick); nowpoint = (_root._xmouse); trace( "今の位置" + nowpoint); } //マウスがボタン領域外にいった時に変数MCclickをオフにする _root.mouse_mc.dragOut = function() { MCclick = false; trace( "どっかいった時の変数 " +_root.MCclick); } stop(); ●ステージ上にかぶせている透明なMC(mouse_mc) //MCclickがオンの時変数mc_xの値をとり続ける onClipEvent (mouseMove) { if (_root.MCclick) { _root.mc_x = (_root._xmouse); trace( "押された時の変数mc_xの位置 " + _root.mc_x); trace( "マウスを押したままの変数 " + _root.MCclick); //100以下の時に画像1を表示 if((_root.mc_x >= 0) || (_root.mc_x <= 100)){ _root.image_mc0._visible = true; _root.image_mc1._visible = false; _root.image_mc2._visible = false; } else if((_root.mc_x >= 100) || (_root.mc_x <= 200)){ _root.image_mc0._visible = false; _root.image_mc1._visible = true; _root.image_mc2._visible = false; } else if((_root.mc_x >= 200) || (_root.mc_x <= 300)){ _root.image_mc0._visible = false; _root.image_mc1._visible = false; _root.image_mc2._visible = true; } } } この書き方で一応動作はするのですが、1枚目と2枚目の画像の切り返しか動作が行われなくて困っています。 画像のサイズ、ステージのサイズは両方とも 400*400です。

    • ベストアンサー
    • Flash
  • onPressに関する質問

    稚拙な質問で恐縮ですが、 1フレームに、image_mcと言うムービークリップを配置、image_mc自体は実体の無いものです。 そこに外部のJPEGを読込んで表示するだけの簡単なScriptなんですが、読込んだJPEG(ムービー)上にマウスを移動させてもマウスの形状が変わらない=「onPress」が活きていないということです。 何が良くないのでしょうか?。 loadMovie("../data/xxx"+"111.jpg", "image_mc") ; image_mc.onPress = function() { trace("on Press") ; }

    • ベストアンサー
    • Flash
  • Keyを押している時間によって・・・

    ゴルフゲームでKeyを押している時間によって、飛距離が変わるゲームがあります。 同じような操作機能を作りたいと思い、質問させて頂きました。 どうぞよろしく御願いします。 途中まで書いてみたのですが・・・getTimerとか使うんでしょうか? _root.startFlag = false; start_btn.onPress = function(){ if(_root.startFlag == false){ _root.startFlag = true; _root.startTime = getTimer(); } _root.start_btn.onRelease = function() { _root.startFlag = false; } } this.onEnterFrame = function(){ if(_root.startFlag == true){ if(ms<3000){ ms =getTimer() - _root.startTime; _root.dispTime = ms / 1000; this.createEmptyMovieClip("view_mc",0); view_mc.lineStyle(5,0xFF0000,100) view_mc.moveTo(0,100) view_mc.lineTo(ms/25,100) } if(ms>3000){ms=3000} }; }

    • ベストアンサー
    • Flash
  • mcにリンクを順番に張りたい

    for(i=0; i<5; i++){ creatEmptyMovieClip(["mc"+i],i); _root["mc"+i]._x = i*10 _root["mc"+i].onRelease=function{ getURL(["test"+i],"_blank"); } } として、 mc1にはtest1 mc2にはtest2 mc3にはtest3 mc4にはtest4 mc5にはtest5 のリンクを設定したいのですが、 なぜかすべてのmcにtest5へのリンクがついてしまいます。 上記のように順番にリンクをつけるには どのようにしたらいいのでしょうか。 _root["mc"+i].onRelease=function{ trace(i); } でiの値を確かめてみると iが5というのがわかります。 このiをカウントするようにすれば解決しそうなんですが、、、。

    • ベストアンサー
    • Flash
  • FlashでXMLを読み込んだ際の関数について

    XMLでデータを読み込んで表示させているボタンがあり、 そちらを制御するための関数を作りたいのですがうまくいきません。 btn0.onRelease = function() { _root.sound_mc.songStarter(songfile[0], songname[0]); }; btn1.onRelease = function() { _root.sound_mc.songStarter(songfile[1], songname[1]); }; btn2.onRelease = function() { _root.sound_mc.songStarter(songfile[2], songname[2]); }; とある中身を簡単に書きたくて、 for(var i=0; i<=2; i++) { var btn = this["btn" + i ]; btn.onRelease = function() { _root.sound_mc.songStarter(songfile[i], songname[i]); }; } と記述してみましたが、動きません。 正しい書き方をどなたかご教授ください。 よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • 始点からクリックした位置にゆっくり線を引きたい

    Flash8を使用しています。 _root上にステージと同じサイズの四角stage.mcがあります。その上に始点(90,380)からクリックした位置まで直線を描きたいと思っていますがうまくいきません。 レイヤーは2つあり、下がstage.mc、上に以下のスクリプトを書いています。 _root.stage_mc.onPress = function() { x1 = _root._xmouse; y1 = _root._ymouse; _root.stage_mc.lineStyle(5, 0x000000, 100); //太さ5、黒、アルファ値100に設定 _root.stage_mc.moveTo(90, 380); //始点を90,380に設定 _root.stage_mc.lineTo(x1, y1); //始点からx1,y1へ直線を引く }; でも、うまくいきません。 できればゆっくりと描きたいと思っているのですが速度を調整することも可能でしょか? どうぞ宜しくお願い致します。

    • ベストアンサー
    • Flash
  • ActionScript2.0のイベントについて

    親ムービークリップに配置した子ムービークリップのイベントが実行されなくて困っています。 親ムービークリップ自体には下記のイベントを設定しています。親ムービークリップはattachMovieで動的に配置しています。 onRollOver・・・onEnterFrameを設定 onRollOut・・・onEnterFrameを削除 子ムービークリップを配置して子ムービークリックにイベントを設定しました。onEnterFrameをは実行されますが、onReleaseが実行されず困っています。 function Parent() { this.onRollOver = function() { this.onEnterFrame = function(){・・・} } this.onRollOut = function(){ delete this.onEnterFrame; } this["child_mc"].onRelease = function() { trace('a') // 実行されない } this["child_mc"].onEnterFrame = function() { trace('b') // 実行される } } ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ _root.attachMovie("Parent", "parent_mc", _root.getNextHighestDepth(), new Parent()); 子ムービークリップはオーサリングで静的にParentに配置し、プロパティでchild_mcと設定しています。 onReleaseは実行できず、そこで止まっています。 なんでも良いので教えてください。

    • ベストアンサー
    • Flash

専門家に質問してみよう