- ベストアンサー
MOUSE_DOWNとMOUSE_MOVEの併用
- flash初心者なのですが、マウスが押され且つ、ドラッグされている場合にだけ音が出るというフラッシュを作りたいのですが
- さらにMouseEvent.MOUSE_DOWNをMouseEvent.MOUSE_MOVEに書き換えると1ピクセル動く毎にダダダダっと何度も連続して音が鳴ってしまいます
- どこでどう定義すればいいのかわかりません。片方なら出来るのですが・・・
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こういうこと↓でしょうか? //------------------ var my_sound:My_Sound = new My_Sound(); var my_channel:SoundChannel; //500ミリ秒後に実行する Timer を作成 var my_timer:Timer = new Timer(500,1); //過去のマウス座標を記録する変数 var old_mouseX:Number; var old_mouseY:Number; //★再生箇所を記録する変数 var play_position:int; stage.addEventListener(MouseEvent.MOUSE_DOWN, MouseLDownFunc); function MouseLDownFunc(event:Event):void { //過去のマウス座標を記録 old_mouseX = stage.mouseX; old_mouseY = stage.mouseY; //★再生箇所を0に戻す play_position = 0; //関数 EnterFrameFunc を毎フレーム実行 addEventListener(Event.ENTER_FRAME,EnterFrameFunc); } //関数 EnterFrameFunc の定義 function EnterFrameFunc(e:Event):void { //マウスの座標が過去のマウス座標と違っていれば if (old_mouseX != stage.mouseX || old_mouseY != stage.mouseY) { //そして my_channel が null であれば if (my_channel == null) { //再生開始 (★過去の再生箇所から) my_channel = my_sound.play(play_position); my_channel.addEventListener(Event.SOUND_COMPLETE,my_chan_comp); } //マウスの座標が過去のマウス座標と同じであれば } else { //そして my_channel が null でなければ if (my_channel != null) { //★再生箇所を記録 play_position = my_channel.position; my_channel.stop(); my_channel.removeEventListener(Event.SOUND_COMPLETE,my_chan_comp); my_channel = null; } } //過去のマウス座標を記録 old_mouseX = stage.mouseX; old_mouseY = stage.mouseY; } function my_chan_comp(e:Event) { trace("再生終了"); my_channel = my_sound.play(); my_channel.addEventListener(Event.SOUND_COMPLETE,my_chan_comp); } stage.addEventListener(MouseEvent.MOUSE_UP, MouseLUpFunc); function MouseLUpFunc(event:Event):void { //my_channel が null でなければ if (my_channel != null) { my_channel.stop(); my_channel.removeEventListener(Event.SOUND_COMPLETE,my_chan_comp); my_channel = null; } //関数 EnterFrameFunc の毎フレーム実行を削除 removeEventListener(Event.ENTER_FRAME,EnterFrameFunc); } //------------------ 4箇所ある「★」を付けた部分は マウスが一度止まってから再び動きだしたときに 再生再開箇所を連続させるために勝手に入れてみたもので ご質問の本題とは全く関係のない箇所です。 上のままで行くとマウスの動きを少しでも止めるとすぐに音が鳴り止んでしまうと思います。 この感度はフレームレートに依存しますが結構敏感だと思います。 フレームレート変えずにもっと鈍感にしたい場合は Timer クラスを使うなどして マウスが動いたか動いていないかを判断する時間間隔を もっと大きくとるようにすれば良いと思います↓。 //------------------ var my_sound:My_Sound = new My_Sound(); var my_channel:SoundChannel; //過去のマウス座標を記録する変数 var old_mouseX:Number; var old_mouseY:Number; //★再生箇所を記録する変数 var play_position:int; //◆500ミリ秒毎に実行する Timer を作成 var my_timer:Timer = new Timer(500); //◆指定ミリ秒毎に関数 TimerFunc を実行する設定 my_timer.addEventListener(TimerEvent.TIMER,TimerFunc); //◆関数 TimerFunc の定義 function TimerFunc(e:TimerEvent):void { //マウスの座標が過去のマウス座標と違っていれば if (old_mouseX != stage.mouseX || old_mouseY != stage.mouseY) { //そして my_channel が null であれば if (my_channel == null) { //再生開始 (★過去の再生箇所から) my_channel = my_sound.play(play_position); my_channel.addEventListener(Event.SOUND_COMPLETE,my_chan_comp); } //マウスの座標が過去のマウス座標と同じであれば } else { //そして my_channel が null でなければ if (my_channel != null) { //★再生箇所を記録 play_position = my_channel.position; my_channel.stop(); my_channel.removeEventListener(Event.SOUND_COMPLETE,my_chan_comp); my_channel = null; } } //過去のマウス座標を記録 old_mouseX = stage.mouseX; old_mouseY = stage.mouseY; } stage.addEventListener(MouseEvent.MOUSE_DOWN, MouseLDownFunc); function MouseLDownFunc(event:Event):void { //過去のマウス座標を記録 old_mouseX = stage.mouseX; old_mouseY = stage.mouseY; //★再生箇所を0に戻す play_position = 0; //◆タイマースタート my_timer.start(); } function my_chan_comp(e:Event) { trace("再生終了"); my_channel = my_sound.play(); my_channel.addEventListener(Event.SOUND_COMPLETE,my_chan_comp); } stage.addEventListener(MouseEvent.MOUSE_UP, MouseLUpFunc); function MouseLUpFunc(event:Event):void { //my_channel が null でなければ if (my_channel != null) { my_channel.stop(); my_channel.removeEventListener(Event.SOUND_COMPLETE,my_chan_comp); my_channel = null; } //◆タイマーストップ my_timer.stop(); } //------------------ 「◆」を付けた部分が変更箇所です。
お礼
回答ありがとうございます 上のスクリプトで何とか思った風にする事が出来ました! 本当にありがとうございます!