キーを押したときだけに
キーを押したときだけに
単純なことだと思いますが、if文で、キーを押した時の、一度だけ、if文内の文が、実行される用にするにはどうすればよいでしょうか?
今現在あるプログラムだとキーを押しっぱなしにすると何度も文が実行されてしまいます。
BorlandとDxLib、をWindows XP で使っています。
今現在あるプログラムだとキーを押しっぱなしにすると何度も文が実行されてしまいます。
BorlandとDxLib、をWindows XP で使っています。
Re:キーを押したときだけに
GetHitKeyStateAll関数を使ったときの、引数の配列の値は
キーが押されているとき1、押されてない時0が入ります
GetHitKeyStateAll_2関数をつかうとよいでしょう
ゲームプログラムの館の該当項目
http://dixq.net/g/#40
キーが押されているとき1、押されてない時0が入ります
GetHitKeyStateAll_2関数をつかうとよいでしょう
ゲームプログラムの館の該当項目
http://dixq.net/g/#40
Re:キーを押したときだけに
trxさんのソースの中にあるGetHitKeyStateAll関数を
GetHitKeyStateAll_2に書き換えるだけでよいはずです。
KeyBufの配列の値が連続でキーを押していた値になります。
実際の動作は試してください。
GetHitKeyStateAll_2に書き換えるだけでよいはずです。
KeyBufの配列の値が連続でキーを押していた値になります。
実際の動作は試してください。
Re:キーを押したときだけに
恐らくですけど、そのような仕様だからじゃないでしょうか?
例えば、
なので、完全に同じタイミングでないと、両要素とも1にできません。
大きく修正をしたくないならば、キー監査をGetHitKeyStateAll()に戻したほうがよいかと。
どれぐらいの間隔で音を鳴らしたいのか分からないですけど、
「音が鳴りやむまでは次の音を鳴らしたくない」
ならば、キー監査をCheckSoundMemの戻り値で実効するか否かを条件分岐してください。
ただこれだと、DrawGraphが一回しか通らないので、画像は一瞬で消えます。
なので自作再生関数を作成してください。音が鳴っている間は再生を行わないが目的です。
こんな感じで。
一番最後にアップしたコードは一つに統一されてますが・・・
if文では未だにKey[/url]が使用されています。
もっといってしまえば、ProcessMessage()も1ループに一回でいいと思いますが・・・。
例えば、
KeyBuf[ KEY_INPUT_X ] == 1 && KeyBuf[ KEY_INPUT_SPACE ] == 1ですが、キー監査では、押されていたらKeyBufの該当する要素をインクリメントします。
なので、完全に同じタイミングでないと、両要素とも1にできません。
大きく修正をしたくないならば、キー監査をGetHitKeyStateAll()に戻したほうがよいかと。
どれぐらいの間隔で音を鳴らしたいのか分からないですけど、
「音が鳴りやむまでは次の音を鳴らしたくない」
ならば、キー監査をCheckSoundMemの戻り値で実効するか否かを条件分岐してください。
ただこれだと、DrawGraphが一回しか通らないので、画像は一瞬で消えます。
なので自作再生関数を作成してください。音が鳴っている間は再生を行わないが目的です。
こんな感じで。
void MyPlaySoundMem(int SHandle) { if(!CheckSoundMem( SHandle )) PlaySoundMem( SHandle, DX_PLAYTYPE_BACK ); }#自分もnonさんと同じことを思っていました。。なんでキー監査用配列が二ついるのかと。
一番最後にアップしたコードは一つに統一されてますが・・・
if文では未だにKey[/url]が使用されています。
もっといってしまえば、ProcessMessage()も1ループに一回でいいと思いますが・・・。
Re:キーを押したときだけに
そ~ですか。Xとスペースを同時に押したとき一度だけならこうすればいいのでは?
if( (KeyBuf[ KEY_INPUT_X ] == 1 && KeyBuf[ KEY_INPUT_SPACE ] > 0) || (KeyBuf[ KEY_INPUT_X ] > 0 && KeyBuf[ KEY_INPUT_SPACE ] == 1)){
if( (KeyBuf[ KEY_INPUT_X ] == 1 && KeyBuf[ KEY_INPUT_SPACE ] > 0) || (KeyBuf[ KEY_INPUT_X ] > 0 && KeyBuf[ KEY_INPUT_SPACE ] == 1)){
Re:キーを押したときだけに
あ、nonさんのほうが分かりやすいですね^^;
しかも、すべて毎ループ音なりの監査をすると、音ゲーではあってはならない
処理落ちが出る可能性もありますし・・・。
修正にかかる時間は・・・同じぐらいですかね。
#根本的に監査の方法を見直っ(ry
しかも、すべて毎ループ音なりの監査をすると、音ゲーではあってはならない
処理落ちが出る可能性もありますし・・・。
修正にかかる時間は・・・同じぐらいですかね。
#根本的に監査の方法を見直っ(ry
Re:キーを押したときだけに
nonさん、kazuoniさん、回答ありがとうございます。
まずは、nonさんの質問に答えたいと思います。
このプログラムは、電子ピアノプログラムです。
ですので、kazuoniさんが、仰ていた、
音が鳴っている間は再生を行わないが目的です。
と言うのの反対です。
それと、お二人の回答を元にして、試してみたのですが、nonさんのやり方だと一瞬しかDrawGraphが出てきませんし音は鳴りません。kazuoniさんのやり方だと音もDrawGraphすら出てきません。
まずは、nonさんの質問に答えたいと思います。
このプログラムは、電子ピアノプログラムです。
ですので、kazuoniさんが、仰ていた、
音が鳴っている間は再生を行わないが目的です。
と言うのの反対です。
それと、お二人の回答を元にして、試してみたのですが、nonさんのやり方だと一瞬しかDrawGraphが出てきませんし音は鳴りません。kazuoniさんのやり方だと音もDrawGraphすら出てきません。
Re:キーを押したときだけに
>それと、お二人の回答を元にして、試してみたのですが、nonさんのやり方だと一瞬しかDrawGraphが出てきませんし音は鳴りません。kazuoniさんのやり方だと音もDrawGraphすら出てきません。
キーを押した時の音を再生する処理と画像を出す処理を一緒にしているからだと思います。
音は一回再生されれば、止まるまでそのままですが、画像は押した瞬間1フレームしか描画されません。
描画部分と、キーの音の処理を関数で分けて別に処理した方がいいと思います。
自分であればこうします
・キーが押された時判定
・押されたキーに対応する音が鳴っているかを判定
音が鳴っていない→そのまま音再生
音が鳴っている→音を停止し、改めて音再生
・別にフラグ変数を用意し、音が鳴った瞬間にフラグを立て、
以降、音が止まるまで音が鳴っているか監査する
・上記フラグが立っているとき、画像を表示←鳴らした音に関してのみ音の監査を行う
工夫としては、○個以上音が鳴っているとき、それ以上鍵盤を押しても音が鳴らせない、
等をするとkazuoniさんの指摘した処理落ち対策にもなると思います。
キーを押した時の音を再生する処理と画像を出す処理を一緒にしているからだと思います。
音は一回再生されれば、止まるまでそのままですが、画像は押した瞬間1フレームしか描画されません。
描画部分と、キーの音の処理を関数で分けて別に処理した方がいいと思います。
自分であればこうします
・キーが押された時判定
・押されたキーに対応する音が鳴っているかを判定
音が鳴っていない→そのまま音再生
音が鳴っている→音を停止し、改めて音再生
・別にフラグ変数を用意し、音が鳴った瞬間にフラグを立て、
以降、音が止まるまで音が鳴っているか監査する
・上記フラグが立っているとき、画像を表示←鳴らした音に関してのみ音の監査を行う
工夫としては、○個以上音が鳴っているとき、それ以上鍵盤を押しても音が鳴らせない、
等をするとkazuoniさんの指摘した処理落ち対策にもなると思います。
Re:キーを押したときだけに
nonさんは、「なぜキー監査を二つの異なる配列によって監査しているのか?それぞれの用途は?」
が聞きたいことかと思いますが・・・^^;
>音が鳴っている間は再生を行わないが目的です。
>と言うのの反対です。
揚げ足取りになりそうなんですが・・・
反対ということは、(厳密には「裏」といいます。たぶん高校で習うor習ったと思いますが・・・)
「音が鳴っている間は再生を行う」
ならば、元のやつでいいのでは?となってしまいますが^^;
恐らく、ピアノのように、鍵盤は長押ししても、音は初めしかならないって話ですよね^^;
基本的にはLibraさんの提案しているように、
構造を見直したほうが一番かもしれないです。
ただ、電子ピアノは、鍵盤を指から離すまで音がなってるモードもあれば、
グランドピアノのように、デクレッシェンドがかかるモードもあり、
それによって再生方法が変わるので、どうすればいいかは、一概には言えないかと思いますが、
大まかにはLibraさんの方法で大丈夫かと思います。
が聞きたいことかと思いますが・・・^^;
>音が鳴っている間は再生を行わないが目的です。
>と言うのの反対です。
揚げ足取りになりそうなんですが・・・
反対ということは、(厳密には「裏」といいます。たぶん高校で習うor習ったと思いますが・・・)
「音が鳴っている間は再生を行う」
ならば、元のやつでいいのでは?となってしまいますが^^;
恐らく、ピアノのように、鍵盤は長押ししても、音は初めしかならないって話ですよね^^;
基本的にはLibraさんの提案しているように、
構造を見直したほうが一番かもしれないです。
ただ、電子ピアノは、鍵盤を指から離すまで音がなってるモードもあれば、
グランドピアノのように、デクレッシェンドがかかるモードもあり、
それによって再生方法が変わるので、どうすればいいかは、一概には言えないかと思いますが、
大まかにはLibraさんの方法で大丈夫かと思います。