音再生時の遅れを解消する方法はありますか?

このQ&Aのポイント
  • 音楽ゲームにおいて、キーボードを押してから音が出るまでの遅れが問題となっています。
  • 遅れを小さくする方法を探しています。具体的には、遅れを0.03秒以下にしたいです。
  • 既にFPSの設定や音声ファイルの圧縮など、いくつかの試みを行っていますが、効果はほとんどありませんでした。解決策をご存知の方がいらっしゃいましたら、教えていただきたいです。
回答を見る
  • ベストアンサー

音再生時の遅れはどうにかなりませんか?

今、音楽ゲームというリズムに合わせタイミングよくキーボードを押すというゲームを作ろうとしています。 キーボードをたたくと、音がでるような仕組みに作っているのですが、キーボードを押してから音がでるまでに0.1秒くらいのわずかな遅れがでます。 リズムに合わせるゲームですから0.1秒(100msec)の遅れは大問題で、この問題が解決しなければFLASH環境での開発をあきらめなければなりません。 そこで、この遅れを小さくする方法はないでしょうか? 具体的には、遅れを0.03秒(30msec)以下にしたいと考えています。 ちなみにプログラムは以下の通りです。 onClipEvent(enterFrame){ if (Key.isDown(70)) {//Fキーを押している間のこと if(f_ok){ sound01.start(0,1); f_ok = false; } }else{//Fキーを離している間 f_ok = true; _root.mc_enter._visible = false; } } FPSの設定は20~120いろいろ試してみましたが大差ありません。 またサウンドファイルの圧縮についても、「パブリッシュ設定」からいろいろ試しましたが、やはりほとんど変わりません。 採用しているサウンドファイルの形式は「WAV」ファイルです。これもサイズを変えてみても駄目でした。 なにか方法はないものでしょうか? 環境は以下の通りです。 FLASH8 WindowsXP メモリ:768MB

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

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

  • ベストアンサー
  • LACOMS
  • ベストアンサー率65% (15/23)
回答No.2

私も専門家でないので、自身はありませんが以下のようにされてはいかがですか onClipEvent(keyDown){ if (Key.isDown(70)) {//Fキーを押している間のこと if(f_ok){ sound01.start(0,1); f_ok = false; } } onClipEvent(KeyUp)}//Fキーを離している間 f_ok = true; _root.mc_enter._visible = false; } }

tenketu
質問者

お礼

やったー!!できました!! しかも再生の遅延が以前よりもウンとなくなりました。 これでFLASH環境での開発が可能です。 本当に協力してくださってありがとうございました。 以下、他の人のために一応まとめを書いておきます。 onClipEvent(keyDown){ if (Key.isDown(70)) {//Fキーを押している間のこと if(f_ok){ s01.start(0,1); f_ok = false; } } } onClipEvent(keyUp){//Fキーを離している間 f_ok = true; }

その他の回答 (1)

  • LACOMS
  • ベストアンサー率65% (15/23)
回答No.1

onClipEvent(enterFrame)は、フレームに入るたびに実行されます。 したがって、フレームレートによります。フレームレートは、再生環境に依存し正確なものではありません。 以下のようにされてはいかがでしょうか。 onClipEvent(enterFrame)     ↓ onClipEvent(keyDown) これだと、キーが押された瞬間にイベントが発生します。 ちなみに、 サウンドデータは重いので最初にロードしておくとよいでしょう。

tenketu
質問者

お礼

回答ありがとうございます。 onClipEvent(keyDown)にしようとしたら問題にぶちあたりました。 実はキーを押し続けた時に音の再生が連続実行されないようにするために、「キーを離したとき」の判定もしなければならないのですが、onClipEvent(keyDown)を使うとそのキーを押し続けた時の連続再生防止機能を実現できません。というか、どうやって実現すればいいのかがわかりません。 つまりこれまではif(Key.isDown(13)){}else{}でそれを実現できていたのですが、onClipEvent(keyDown)を使うようになると、「キーを離したとき」をどうやって判定するのかがわからないのです。初心者ですいません。もしよかったら教えてもらえないでしょうか。

関連するQ&A

  • Flashのキーボード操作で

    キーボードのテンキーでコマンドを選択するアクションスクリプトをくんでいるのですが・・・・・ onClipEvent (keyDown) { if (Key.isDown(Key.UP) or Key.isDown(Key.DOWN)) { this._y += 30; } else if (Key.isDown(Key.UP) or Key.isDown(Key.DOWN)) { this._y = -30; }else if (Key.isDown(Key.LEFT) or Key.isDown(Key.RIGHT)){ this._x = +50; }else if (Key.isDown(Key.LEFT) or Key.isDown(Key.RIGHT)){ this._x = -50; } if (Key.isDown(Key.SPACE)) { _root.flag = 1; } } というアクションスクリプトを組むと上下はうまく移動するのですが横移動がうまくいきません。いきなり予期しないところに移動してしまったりしてしまいます・・・・。

    • ベストアンサー
    • Flash
  • FLASH MXで質問です

    アクションスクリプト初心者ですが、無い知恵を振り絞って簡単なシューティングゲームを作ろうと思っています。 そこで質問なのですが、キーボードで自機となるMovieClipオブジェクトを自由に動かしたいのですが、斜めに移動させるにはどの様にしたら良いのでしょうか? 今の所、4方向への移動は onClipEvent(enterframe) { if (Key.isDown(Key.LEFT)) { _x += -10; }else if (Key.isDown(Key.RIGHT)) { _x += 10; //以下上下移動をUP,DOWNキーに割り当て } } としています。 ifの後を&&のAND処理で2つのキーが押された場合をtrueとすれば良いとは思うのですが、書き方が悪いようで機能してくれませんでした。 ぜひアドバイスをお願いします。

  • キーボードのキーを3つたて続けてに押すと反応しないバグはどうにかなりませんか?

    タイトルの通りです。3つの種類のキーを立て続けに押すと(Ctrl+Alt+Deleteを押すようなカンジの押し方)、反応してくれないキーがあります。 次の例はそれを確かめるためのもので、一応実験をしました。 //_root.my_mc内のスクリプト onClipEvent (enterFrame) { if (Key.isDown(32)) {//spaceキー trace("space on") } if (Key.isDown(87)) { trace("W on") } if (Key.isDown(83)) { trace("S on") } if (Key.isDown(65)) { trace("A on") } if (Key.isDown(68)) { trace("D on") } } //////// 「A+W+スペース」と押した場合には3つとも反応してtraceの出力結果もそれを示したものとなります。 しかし「S+D+スペース」と押した場合にはなぜか最後に押したスペースが反応しません。 今ゲームを作っていて、この問題に非常に困っています。 どうすれば反応してくれるのでしょうか? ちなみに環境はFlash8pro AS2.0 WinXP。もちろん、ちゃんと「キーボードのショートカットを無効」のやつをオンにしてやっています。

    • ベストアンサー
    • Flash
  • AS2.0 キーを押して~秒後に実行

    AS2.0 キーを押して~秒後に実行 キーを押す度に、値(isVolume)が1ずつ増加し キーを押しっぱなしにして~秒経過すると増加を続ける、 というスクリプトを書きました。 しかし、この方法はあまりよろしくない気がします。 より短く簡潔に題名の機能を実現するにはどうすればよいか、 アドバイスをよろしくお願いいたします。 //1フレーム目 //初期値 var isVolume = 0; var key_check =0; var num = 36; onEnterFrame = function(){ //キーが押され、key_checkの値が0のとき if (Key.isDown(32) && key_check == 0) { //key_check、isVolumeの値の増加開始 key_check +=1; isVolume +=1; //キーが押され、key_checkの値が1以上のとき } else if(Key.isDown(32) && key_check >= 1) { //isVolumeの増加を停止しkey_checkの増加を続ける key_check +=1; //キーが押され、key_checkの値がnum以上になったとき if(Key.isDown(32) && key_check >= num) { //isVolumeの値の増加開始 isVolume +=1; } } else { //キーを押していないときkey_checkの値は0 key_check =0; } } こちらで動作が確認が出来ます。 http://okirakupage.warabuki.net/mainmenu1.swf

    • ベストアンサー
    • Flash
  • シューティングゲームの自機の当り判定

    以前の質問で、アクションスクリプトの記述がなかったので、詳しく説明します。http://oshiete1.goo.ne.jp/qa3535566.html 自機は、キーボードで操作します。 if(Key.isDown(87)){ gotoAndPlay(3) } if(Key.isDown(83)){ gotoAndPlay(5) } 3は上向きグラフィック、5は下向きグラフィックです。 246フレームには、 gotoandplay(1) と記述しています。 当たり判定は、別レイヤーにあります。 ステージ上の自機にmyshipというインスタンス名を付けています。 敵弾に当たると自機はbangjikiになります。 if(this.hitTest(_root.myship.hitarea)){ _root.myship.gotoAndPlay("bangjiki") _parent.removeMovieClip() }

  • ムービープレビューでないと動きません。

    ゲームを途中まで作ったのですが、ムービープレビューで出力したときにしか動きません。 (他のパブリッシュプレビューや実際にサーバーにUPして見ましたがコントロールがききません)問題があれば教えて頂きたく質問させて頂きました。 どうぞよろしく御願いします。 onClipEvent (load) { _root.target._x=100 speed = 0; rot = -90; dx = 0; dy = 0; } onClipEvent (enterFrame) { _root.target.honou.gotoAndStop(1); if(Key.isDown(Key.SPACE)) {speed +=0.8; _root.target.honou.gotoAndStop(2); } if(Key.isDown(Key.LEFT)){ rot -= 3 this._y +=2} if(Key.isDown(Key.RIGHT)) { rot += 3 this._y +=2} else{ this._y =this._y + 3 } dx = Math.cos(rot * Math.PI / 180) * speed; dy = Math.sin(rot * Math.PI / 180) * speed; speed *= 0.9; _x += dx; _y += dy; _rotation = rot; }

    • ベストアンサー
    • Flash
  • mp3等の再生ソフトを探しています。

    mp3等の再生ソフトを探しています。 テープ起こしという仕事をしています。 在宅でしており、会社から音声データを送ってもらい それを聞きながらWord等に聞こえたままに文章化する仕事です。 普段はテープ起こし用のフリーソフト okoshiyasu2を使っています。 これは、ダウンロードしたら okoshiyasu2を開いて、そこから音声ファイルを選ぶとその音声ファイルがokoshiyasu2で再生されます。 で、再生、早送り、巻き戻し等はキーボードで好きなものを選べるので Word等で文章を打っていて支障が出ないキー 私の場合は 再生/停止をF2 巻き戻しをCtrlとしていました。 ちなみに巻き戻しは秒数まで指定できます(大体2~3秒がちょうどいいのですが) で、大体音声ファイルは1時間とか長かったりするので Ctrlキーを多用しながら 入力をしていたのですが、 今請け負っている案件が特殊なもので 起こす時間は2時間ほどなのですが 総ファイル数が700近くほどあるものです。 1ファイルは長くても20秒ほど、 10秒弱のものが大半を占めるものです。 なのでokoshiyasu2でやるとなると 1ファイル、中には4秒ほどのも多数ありますので いちいち、ファイルを開いて、またすぐ次を開いてと大変です。 で、今はWMPを使って作業をしているのですが 複数ファイルを再生させれば、1つのファイルが終わったら次のファイルに行ってくれるので すごい助かっているのですが okoshiyasu2のようにテープ起こし用のソフトではないので 巻き戻しができません。 フリーソフト等で、 音声を複数再生する事ができ、 1つ再生し終わったら自動的に次のを再生してくれて なおかつ、巻き戻しにキーを割り当てられるソフトはないでしょうか? (巻き戻しに対応しているキーがもともと決まっているものでもかまいません) 聞き逃してしまったり入力が追いつかなくなった際に、いちいち、WMPの操作をすると、 アクティブウィンドウが切り替わってしまって結構面倒くさくて… ご存知の方いたら教えてください。

  • キーの長押し時に固まる

    PCゲーム等でキーの長押しをした場合、数秒後に固まって長押しを解除すると動き出します。 PCを変える前は長押ししても固まったりしなかったのですが、変えた途端こうなってしまいました。設定の問題でしょうか?教えてください 補足:キーボードは変えていません

  • AS2でキーによる複数の音楽制御について

    頻繁な質問で申し訳ありません。 AS2、CS5.5での環境で、キーによる複数の音楽の再生・停止の制御プログラムを作ろうとしています。 同時に複数の音楽が流れることが可能で、複数の音楽が流れている中で1つだけ止める等の音楽それぞれを個別に制御もできるものが希望です。 先日に //------------------------------------------- //この階層を変数化 var me:MovieClip = this; //変数 i を 0~7 の間で 1 ずつ加算しながらループ for (var i:Number = 0; i<=7; i++) { //Soundオブジェクト「sound_obj0」~「sound_obj7」を作成 me["sound_obj" + i] = new Sound(); //各Soundオブジェクトに各音を割り当てる me["sound_obj"+i].attachSound("sound"+i); //各音の再生フラグ「sound_flg0」~「sound_flg7」を用意 me["sound_flg"+i] = false; } //キーを監視させるオブジェクトを作成 var key_obj:Object = new Object(); //キーを押したときに実行する関数の定義 key_obj.onKeyDown = function():Void { // //押されたキーコードを保存 var key_num:Number = Key.getCode(); // //押されたキーコードが65~72(キーがA~H)の間であれば if (key_num>=65 && key_num<=72) { //さらにそのキーの音に対応するフラグが false であれば if (!me["sound_flg"+(key_num-65)]) { trace("sound_obj"+(key_num-65)); //そのキーに対応する音を再生 me["sound_obj"+(key_num-65)].start(0, 100); //その音に対応するフラグを true にする me["sound_flg"+(key_num-65)] = true; } //押されたキーコードが96~103(キーが1~7)の間であれば } else if (key_num>=96 && key_num<=103) { trace("sound_obj"+(key_num-96)); //そのキーに対応する音を停止 me["sound_obj"+(key_num-96)].stop("sound"+(key_num-96)); //その音に対応するフラグを false にする me["sound_flg"+(key_num-96)] = false; } }; //key_obj を Key のリスナーとして登録 Key.addListener(key_obj); //------------------------------------------- このようなスクリプトを教えていただきました。 これをさらに、Aキーを押せばsoundA(リンゲージ名を付けた音楽ファイル)が流れる、Bキーを押せばsoundBが流れ、1キーもしくは2キーのどちらか押されたらsoundAもsoundBも停止 というようにしたいのですが、可能でしょうか。 またこれを上記と同じ要領で、soundC、DはC、Dキーで再生し3、4キーで停止...EF、GHの8種類制御したいです。 説明が下手ですみませんが、どなたか教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • flashの音再生について

    main.swfにactionscript2.0で音のon/offしているのですが、 offになって欲しくない音までoffになってしまいます。 スクリプトで呼び出している音ならばまだわかるのですが、 flvで外部から読み込み再生しているファイルなので、 訳が分からず困っています。 ちなみに音再生スクリプトはフレーム上に以下 //BGM制御用のダミーのムービークリップを作る this.createEmptyMovieClip( "bgm_clip" , 0 ); //BGMの設定 sndbgm = new Sound( bgm_clip ); sndbgm.attachSound( "BGM01" ); sndbgm.setVolume( 100 ); sndbgm.onSoundComplete = function() { //無限ループ再生 sndbgm.start(); }; //BGMを再生 sndbgm.start(); //BGMのボリュームとフェードの速さを管理する変数 bgm_vol = 100; fade_spd = 5; //SE設定 allse = new Sound(); allse.setVolume( 100 ); S1 = new Sound(this); S1.attachSound("SE01"); S2 = new Sound(this); S2.attachSound("SE02"); S3 = new Sound(this); S3.attachSound("SE03"); on/offにはMCで以下の様にしています。 on (release) { if (this._parent.sndbgm.getVolume()>0) { this._parent.sndbgm.setVolume(0); this._parent.allse.setVolume(0); this._parent.v_on_off.gotoAndStop("soundOFF"); } else if (this._parent.sndbgm.getVolume()<=0) { this._parent.sndbgm.setVolume(100); this._parent.allse.setVolume(100); this._parent.v_on_off.gotoAndStop("soundON"); } } SE再生にはフレーム上に S1.start(); と入れています。 使用バージョンはCS4になります。 どなたか判る方、教えて下さい。

    • ベストアンサー
    • Flash