ページ 1 / 1
キーを押したときだけに
Posted: 2009年8月17日(月) 05:36
by trx
単純なことだと思いますが、if文で、キーを押した時の、一度だけ、if文内の文が、実行される用にするにはどうすればよいでしょうか?
今現在あるプログラムだとキーを押しっぱなしにすると何度も文が実行されてしまいます。
BorlandとDxLib、をWindows XP で使っています。
Re:キーを押したときだけに
Posted: 2009年8月17日(月) 05:50
by 初級者
今現在あるプログラムというものを見せてください。
Re:キーを押したときだけに
Posted: 2009年8月17日(月) 06:07
by Libra
GetHitKeyStateAll関数を使ったときの、引数の配列の値は
キーが押されているとき1、押されてない時0が入ります
GetHitKeyStateAll_2関数をつかうとよいでしょう
ゲームプログラムの館の該当項目
http://dixq.net/g/#40
Re:キーを押したときだけに
Posted: 2009年8月18日(火) 04:54
by trx
GetHitKeyStateAll_2関数を使いながらもKeyBufを使う方法は在りますか?
Re:キーを押したときだけに
Posted: 2009年8月18日(火) 05:33
by Libra
trxさんのソースの中にあるGetHitKeyStateAll関数を
GetHitKeyStateAll_2に書き換えるだけでよいはずです。
KeyBufの配列の値が連続でキーを押していた値になります。
実際の動作は試してください。
Re:キーを押したときだけに
Posted: 2009年8月18日(火) 06:29
by trx
KeyBufをKeyに変えたのしか動きませんでした。
Re:キーを押したときだけに
Posted: 2009年8月18日(火) 09:15
by kazuoni
× GetHitKeyStateAll_2( Key )
〇 GetHitKeyStateAll_2( KeyBuf )
Re:キーを押したときだけに
Posted: 2009年8月18日(火) 12:45
by trx
131行目の事ですか?
直しても動きません
Re:キーを押したときだけに
Posted: 2009年8月18日(火) 17:06
by non
int KeyBuf[ 256 ] ;とint Key[256];がありますが、
おのおのの使用目的は何ですか?
Re:キーを押したときだけに
Posted: 2009年8月18日(火) 17:28
by kazuoni
恐らくですけど、そのような仕様だからじゃないでしょうか?
例えば、
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:キーを押したときだけに
Posted: 2009年8月18日(火) 17:58
by non
そ~ですか。Xとスペースを同時に押したとき一度だけならこうすればいいのでは?
if( (KeyBuf[ KEY_INPUT_X ] == 1 && KeyBuf[ KEY_INPUT_SPACE ] > 0) || (KeyBuf[ KEY_INPUT_X ] > 0 && KeyBuf[ KEY_INPUT_SPACE ] == 1)){
Re:キーを押したときだけに
Posted: 2009年8月18日(火) 19:53
by kazuoni
あ、nonさんのほうが分かりやすいですね^^;
しかも、すべて毎ループ音なりの監査をすると、音ゲーではあってはならない
処理落ちが出る可能性もありますし・・・。
修正にかかる時間は・・・同じぐらいですかね。
#根本的に監査の方法を見直っ(ry
Re:キーを押したときだけに
Posted: 2009年8月19日(水) 03:12
by trx
nonさん、kazuoniさん、回答ありがとうございます。
まずは、nonさんの質問に答えたいと思います。
このプログラムは、電子ピアノプログラムです。
ですので、kazuoniさんが、仰ていた、
音が鳴っている間は再生を行わないが目的です。
と言うのの反対です。
それと、お二人の回答を元にして、試してみたのですが、nonさんのやり方だと一瞬しかDrawGraphが出てきませんし音は鳴りません。kazuoniさんのやり方だと音もDrawGraphすら出てきません。
Re:キーを押したときだけに
Posted: 2009年8月19日(水) 04:06
by Libra
>それと、お二人の回答を元にして、試してみたのですが、nonさんのやり方だと一瞬しかDrawGraphが出てきませんし音は鳴りません。kazuoniさんのやり方だと音もDrawGraphすら出てきません。
キーを押した時の音を再生する処理と画像を出す処理を一緒にしているからだと思います。
音は一回再生されれば、止まるまでそのままですが、画像は押した瞬間1フレームしか描画されません。
描画部分と、キーの音の処理を関数で分けて別に処理した方がいいと思います。
自分であればこうします
・キーが押された時判定
・押されたキーに対応する音が鳴っているかを判定
音が鳴っていない→そのまま音再生
音が鳴っている→音を停止し、改めて音再生
・別にフラグ変数を用意し、音が鳴った瞬間にフラグを立て、
以降、音が止まるまで音が鳴っているか監査する
・上記フラグが立っているとき、画像を表示←鳴らした音に関してのみ音の監査を行う
工夫としては、○個以上音が鳴っているとき、それ以上鍵盤を押しても音が鳴らせない、
等をするとkazuoniさんの指摘した処理落ち対策にもなると思います。
Re:キーを押したときだけに
Posted: 2009年8月19日(水) 09:45
by kazuoni
nonさんは、「なぜキー監査を二つの異なる配列によって監査しているのか?それぞれの用途は?」
が聞きたいことかと思いますが・・・^^;
>音が鳴っている間は再生を行わないが目的です。
>と言うのの反対です。
揚げ足取りになりそうなんですが・・・
反対ということは、(厳密には「裏」といいます。たぶん高校で習うor習ったと思いますが・・・)
「音が鳴っている間は再生を行う」
ならば、元のやつでいいのでは?となってしまいますが^^;
恐らく、ピアノのように、鍵盤は長押ししても、音は初めしかならないって話ですよね^^;
基本的にはLibraさんの提案しているように、
構造を見直したほうが一番かもしれないです。
ただ、電子ピアノは、鍵盤を指から離すまで音がなってるモードもあれば、
グランドピアノのように、デクレッシェンドがかかるモードもあり、
それによって再生方法が変わるので、どうすればいいかは、一概には言えないかと思いますが、
大まかにはLibraさんの方法で大丈夫かと思います。