GetHitKeyStateAll_2のKeyBuf

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
trx

GetHitKeyStateAll_2のKeyBuf

#1

投稿記事 by trx » 16年前

http://dixq.net/g/#40fでの使い方にする場合どこを変えれば良いのかを教えてください。
DxLibをBorlandをWindowsXPで使っています。
添付してあるのは、今あるプログラムの一部です。

Dixq (管理人)

Re:GetHitKeyStateAll_2のKeyBuf

#2

投稿記事 by Dixq (管理人) » 16年前

質問の意図がよくわからないですが・・。
このプログラムはどのように自分の期待通りにならないのでしょうか?

trx

Re:GetHitKeyStateAll_2のKeyBuf

#3

投稿記事 by trx » 16年前

http://dixq.net/g/#40で紹介されているのは、

#include "DxLib.h"
 
int GetHitKeyStateAll_2(int KeyStateBuf[/url]){
        char GetHitKeyStateAll_Key[256];
        GetHitKeyStateAll( GetHitKeyStateAll_Key );
        for(int i=0;i<256;i++){
                if(GetHitKeyStateAll_Key==1) KeyStateBuf++;
                else                            KeyStateBuf=0;
        }
        return 0;
}
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
    int Key[256];
    
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
 
    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
          //↑メッセージ処理         ↑画面をクリア            ↑入力状態を保存       ↑ESCが押されていない
 
        DrawFormatString(0,0,GetColor(255,255,255),"%d",Key[KEY_INPUT_RETURN]);//エンター入力カウント
 
        if(Key[KEY_INPUT_RETURN]==1)//今の瞬間押されたら
            DrawBox(0,0,640,480,GetColor(255,255,255),TRUE);//画面全体を白い四角で表示
 
 
        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}
ですが、
if(Key[KEY_INPUT_RETURN]==1)
の部分を
if(Key[KEY_INPUT_RETURN]==1 && KeyBuf[ KEY_INPUT_SPACE ] == 1)
にするには、
int GetHitKeyStateAll_2(int KeyStateBuf[/url]){
        char GetHitKeyStateAll_Key[256];
        GetHitKeyStateAll( GetHitKeyStateAll_Key );
        for(int i=0;i<256;i++){
                if(GetHitKeyStateAll_Key==1) KeyStateBuf++;
                else                            KeyStateBuf=0;
        }
        return 0;
}
のどこを変えたら良いのでしょうか。
すなわちaudio.cppの
int GetHitKeyStateAll_2(int KeyStateBuf[/url]){
        char GetHitKeyStateAll_KeyBuf[256];
        GetHitKeyStateAll( GetHitKeyStateAll_KeyBuf );
        for(int i=0;i<256;i++){
                if(GetHitKeyStateAll_KeyBuf==1) KeyStateBuf++;
                else                            KeyStateBuf=0;
        }
        return 0;
}
どこを変えたら良いのでしょうか?(自分でKeyと書いてあった所をKeyBufに変えてみた)
それと、
int Key;
を、
int KeyBuf;
に変えています。
回答よろしくお願いします。

Kou

Re:GetHitKeyStateAll_2のKeyBuf

#4

投稿記事 by Kou » 16年前

えっと・・・もしかして、2種類のキー入力状態を調べる為に変数Keyと変数KeyBufを使おうとしてますか?

もしそうなら、変数は分ける必要はないんですが・・・
意図が違っていたらすみません。

仮にそうだと仮定して変数を分けるならば、
int Key;
int KeyBuf;
両方宣言が必要だし、各変数でGetHitKeyStateAll関数を呼び出せば良いだけです。
ポインタ使っても出来ると思います。

ちなみに、
if(KeyBuf[KEY_INPUT_RETURN]==1 && KeyBuf[ KEY_INPUT_SPACE ] == 1)
で2種類同時に調べれますよ。

trx

Re:GetHitKeyStateAll_2のKeyBuf

#5

投稿記事 by trx » 16年前

回答ありがとうございます。
2種類のキー入力状態を調べる為に変数Keyと変数KeyBufを使おうとは、していません。
KeyBufだけを使おうとしています。
2種類のキー入力状態を調べようとはしています。
それと、GetHitKeyStateAll関数では無く、GetHitKeyStateAll_2関数を使おうとしています。
それと、ポインタ使ってどうするのですか?
ポインタとは、文字列を、操作する際に使う関数なのでは?
回答よろしくお願いします。

kazuoni

Re:GetHitKeyStateAll_2のKeyBuf

#6

投稿記事 by kazuoni » 16年前

KeyとKeyBufの違いをもっと明白にしないと、回答しようがないかと・・・

>if(Key[KEY_INPUT_RETURN]==1)
>の部分を
>if(Key[KEY_INPUT_RETURN]==1 && KeyBuf[ KEY_INPUT_SPACE ] == 1)

なぜ分けているのですか?
現在のコードでは、すべてのキー入力の状態はKeyに格納されています。

>KeyBufだけを使おうとしています。

KeyBufにキー入力の情報を格納したければ、
int KeyBuf[256];
...
while( ... && GetHitKeyStateAll_2(KeyBuf)==0 && ...)
とすれば、OKです。
GetHitKeyStateAll_2関数の中身は変える必要ありません。

>すなわちaudio.cppの

main関数でキー監査(GetHitKeyStateAll_2)をしているが、
audio.cppでもこの情報を使いたいって時は、
各場所にキー監査の関数を書くのではなく、
キー監査用配列をグローバル変数にすればよいです。


#余談
>ポインタとは、文字列を、操作する際に使う関数なのでは?
ではないです。

trx

Re:GetHitKeyStateAll_2のKeyBuf

#7

投稿記事 by trx » 16年前

kazuoniさん、回答ありがとうございました。
前回は、インターネットの調子が悪くて投稿できなくてすみませんでした。(いつの間にか、アーカイブになっていました)
>if(Key[KEY_INPUT_RETURN]==1)
>の部分を
>if(Key[KEY_INPUT_RETURN]==1 && KeyBuf[ KEY_INPUT_SPACE ] == 1)
は、
if(Key[KEY_INPUT_RETURN]==1)
の部分を
if(KeyBuf[KEY_INPUT_RETURN]==1 && KeyBuf[ KEY_INPUT_SPACE ] == 1)
の書き間違えでした。

>>すなわちaudio.cppの

>main関数でキー監査(GetHitKeyStateAll_2)をしているが、
>audio.cppでもこの情報を使いたいって時は、
>各場所にキー監査の関数を書くのではなく、
>キー監査用配列をグローバル変数にすればよいです。

と、言うのは、
if(KeyBuf[KEY_INPUT_RETURN]==1 && KeyBuf[ KEY_INPUT_SPACE ] == 1)
と毎回書かない方が、良いと言うことですか?

添付してあるのは、書き直したaudio.cppです。
まだ、プログラムから音が出ません。
色々と足してあるのでごちゃごちゃしててすみません。
何度もすみませんが、
回答よろしくお願いします。

Mist

Re:GetHitKeyStateAll_2のKeyBuf

#8

投稿記事 by Mist » 16年前

> まだ、プログラムから音が出ません。

音が出ないの関係あるか判りませんがChangeVolumeSoundMemのところがいろいろ間違っています。

vol[0]=vol[0]+((double)0.01);

と書いていますが、volはint型で宣言されているのでdoubleの0.01を足しても永久に0ですね。
なぜ0.01を加算しようとしたのでしょうか。
if( KeyBuf[ KEY_INPUT_UP ]  == 1){
    if (vol[0] < 100) vol[0]++;
}
でいいと思いますが。(引くほうは負にならないようにしてください)

あと、変数vに一度も値がセットされていませんのでken[v]がどんな値をChangeVolumeSoundMemに渡しているかも謎ですね。
最悪の場合、いろいろ破壊することになるかもしれません。

trx

Re:GetHitKeyStateAll_2のKeyBuf

#9

投稿記事 by trx » 16年前

回答ありがとうございます。
ChangeVolumeSoundMemを消したのですがまだ音が出ません。
0.01ずつなのは、Graphic.cppで0.01ずつ値を増やしているのに合わせている為です。
graphic.cpp
...
                if( KeyBuf[ KEY_INPUT_UP ] == 1){
		vol[4]=vol[4]+((double)0.01);
		}
		if( KeyBuf[ KEY_INPUT_DOWN ] == 1){
		vol[4]=vol[4]-((double)0.01);
		}
		ScreenFlip();
		if( KeyBuf[ KEY_INPUT_ESCAPE ]  == 1 )
			break;
		if( ProcessMessage() == -1 ) 
			break ;
		}
...

kazuoni

Re:GetHitKeyStateAll_2のKeyBuf

#10

投稿記事 by kazuoni » 16年前

音を出す目的でこのスレを挙げたのですかね^^;

とりあえず、Mistさんの指摘してくださったところは
修正しましたか?
それに加えて、キー監査に関してですけど、
以前もどこかで言った記憶があるのですが・・・(人違いでしたらごめんなさい)
関数GetHitKeyStateAll_2はキーが押されている間、
キー監査の値はインクリメントされています。
なので、( Key[...]==1 )となるのは押された一瞬のみです。
なので、完全な同時押しをしないと音が鳴らないかと。
GetHitKeyStateAllにすれば動く・・・かもしれないです。

Mist

Re:GetHitKeyStateAll_2のKeyBuf

#11

投稿記事 by Mist » 16年前

ソースを全体的にきちんと見直されたほうが良いような。

単なる書き間違いだとは思いますが、やばい間違いがあります。

vol[6] = LoadSoundMem ("Media\\click.wav" );

vol[6]は存在しないのでメモリ破壊しています。
volはdoubleで宣言されているのでLoadSoundMemの戻り値を入れるのも間違っています。(ワーニングになっているのでは?)

次に
DrawGraph( 205, ken[61] , pn , FALSE ) ;
という行が複数ありますが、pnに画像をロードしているところがありませんね。
DrawGraphに不定値を渡した場合の動作は不明ですのでこれも危険な間違いです。


上記は修正してもらうとして、気になるのはLoadSoundMemでのロードの成功をチェックしていませんが失敗しているということはないんですよね?

trx

Re:GetHitKeyStateAll_2のKeyBuf

#12

投稿記事 by trx » 16年前

回答ありがとうございます!

>関数GetHitKeyStateAll_2はキーが押されている間、
>キー監査の値はインクリメントされています。
>なので、( Key[...]==1 )となるのは押された一瞬のみです。
>なので、完全な同時押しをしないと音が鳴らないかと。
>GetHitKeyStateAllにすれば動く・・・かもしれないです。
以前試しに、( KeyBuf[...]==1 )ではなく、( Key[...]==1 )で実行した際、
音は、鳴りました。
なので、GetHitKeyStateAll_2をKeyから、KeyBufに変えるさいに、おかしくなっているのだと思います。(間違えて解釈していたらすみません)

それと、
vol[6] = LoadSoundMem ("Media\\click.wav" );
単なる書き間違えですが何回か前に、
>色々と足してあるのでごちゃごちゃしててすみません。
と言いましたので他の問題は、気にしないで下さい。
DrawGraph( 205, ken[61] , pn , FALSE ) ;
も、同じでまだ消していないだけです。
一応書き直してみました。

回答よろしくお願いします!!

Mist

Re:GetHitKeyStateAll_2のKeyBuf

#13

投稿記事 by Mist » 16年前

if( KeyBuf[ ... ] >= 1){

こうしないといけないんじゃないのかな。

ちなみに

> と言いましたので他の問題は、気にしないで下さい。

いやいや違いますよ(^^;
メモリ破壊は無視していい問題じゃありません。
破壊される場所によってはアプリにどんな不具合が出るか予測できませんよ。
無視していい程度の問題ないら最初から書いてないです。

trx

Re:GetHitKeyStateAll_2のKeyBuf

#14

投稿記事 by trx » 16年前

if( KeyBuf[ ... ] >= 1){
と言うのは、例えば、
if( KeyBuf[ KEY_INPUT_Z ] == 1 && KeyBuf[ KEY_INPUT_SPACE ] == 1){
を、
if( KeyBuf[ KEY_INPUT_Z ] >= 1 && KeyBuf[ KEY_INPUT_SPACE ] == 1){
とするか、
if( KeyBuf[ KEY_INPUT_Z ] >= 1 && KeyBuf[ KEY_INPUT_SPACE ] >= 1){
とするか、
if( KeyBuf[ KEY_INPUT_Z ] == 1 && KeyBuf[ KEY_INPUT_SPACE ] >= 1){
にするのですか?
どれにしても音が出ないのですが...
添付してあるのは、
if( KeyBuf[ KEY_INPUT_Z ] >= 1 && KeyBuf[ KEY_INPUT_SPACE ] == 1){
の一個だけ変えてあります
それと、メモリ破壊は重要な問題だとも知らないで適当な事言って、ごめんなさい。
まだ、ど初心者なので。

あまり関係ない質問ですが、前から気になっていて、
>2倍のポイントを手に入れた! 718ポイント を手に入れた。
と、2倍のポイントを手に入れるには、何をすればよいのでしょうか?

Mist

Re:GetHitKeyStateAll_2のKeyBuf

#15

投稿記事 by Mist » 16年前

> if( KeyBuf[ KEY_INPUT_Z ] >= 1 && KeyBuf[ KEY_INPUT_SPACE ] >= 1){

これで正解です。
GetHitKeyStateAll_2をよく読んだら

if( KeyBuf[ KEY_INPUT_Z ] != 0 && KeyBuf[ KEY_INPUT_SPACE ] != 0){

のほうがいいような気はしますが。
ソースを流用するだけじゃなく、何をしているのかを理解する力を付けられるのがよいと思います。
今回のGetHitKeyStateAll_2では

if(GetHitKeyStateAll_Key==1) KeyStateBuf++;
else KeyStateBuf=0;

としていますので、該当のキーが押されている間はKeyStateBufは増え続け、離されると0に戻ります。
つまり、KeyStateBuf[...] >= 1かKeyStateBuf[...] != 0がキーが押されている状態の判定方法だとわかります。
こういうのは忘れないようにソースにコメントで記述しておくとグッドです。

こちらで動作確認したソースはっておきます。
#include "DxLib.h"

int GetHitKeyStateAll_2(int KeyStateBuf[/url]){
        char GetHitKeyStateAll_Key[256];
        GetHitKeyStateAll( GetHitKeyStateAll_Key );
        for(int i=0;i<256;i++){
                if(GetHitKeyStateAll_Key==1) KeyStateBuf++;
                else                            KeyStateBuf=0;
        }
        return 0;
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                 LPSTR lpCmdLine, int nCmdShow )
{
    int KeyBuf[256];

    ChangeWindowMode(TRUE);

    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(KeyBuf)==0 && KeyBuf[KEY_INPUT_ESCAPE]==0){
        if( KeyBuf[ KEY_INPUT_Z ]  >= 1 && KeyBuf[ KEY_INPUT_SPACE ] >= 1){
            printfDx("Z + SPACE\n");  // 音ファイルがないので代用
        }

        ScreenFlip();
    }

    DxLib_End() ;               // DXライブラリ使用の終了処理

    return 0 ;                  // ソフトの終了
}



これでも音が鳴らないとすれば、その原因はGetHitKeyStateAll_2以外のところにあると思います。
で、気になったのは先にも書いたwavファイルのロードに失敗していないかどうか

if( KeyBuf[ KEY_INPUT_Z ] >= 1 && KeyBuf[ KEY_INPUT_SPACE ] == 1){
   PlaySoundMem( ken[0], DX_PLAYTYPE_BACK );
}
とすると、Zとスペースが押されている、何回もPlaySoundMemが実行されることになります。
音が再生された後、キーを離してもう一度押すまではキーを音を鳴らさないというふうにするべきではないでしょうか。
例えば
bool flag[61]; //FALSEで初期化済みとする

・
・
途中省略
・
・

if( KeyBuf[ KEY_INPUT_Z ]  >= 1 && KeyBuf[ KEY_INPUT_SPACE ] >= 1){
      if (flag[0] == FALSE) {  // 鍵盤離し済み
       PlaySoundMem( ken[0], DX_PLAYTYPE_BACK );
          flag[0] = TRUE;
      }
} else if ( !KeyBuf[ KEY_INPUT_Z ] && !KeyBuf[ KEY_INPUT_SPACE ]){
    flag[0] = FALSE;
}

とか。

Dixq (管理人)

Re:GetHitKeyStateAll_2のKeyBuf

#16

投稿記事 by Dixq (管理人) » 16年前

LoadSoundMem関数の返り値をチェックしてみて下さい。
ロードに失敗していたら-1が入るはずです。
ブレイクポイントを置くか、printfDxで出力するなどして返り値を確認して下さい。

また、2倍のポイントを手に入れたり、逆にポイントを落としてしまったりすることがありますが、
これは完全なランダムなので、何かをすれば2倍になったりと言う事はありません。

ただし、文字数が多いほどポイントが高くなるようになっています。

元々コメント沢山書いてくれた人には沢山ポイントを!と思って設定しましたが、
コードを大量にはっつけさえすればランクが上がると言うおかしなことに・・^^;

kazuoni

Re:GetHitKeyStateAll_2のKeyBuf

#17

投稿記事 by kazuoni » 16年前

か、管理人さんの超回答ww
おもわず吹きましたww

>コードを大量にはっつけさえすればランクが上がると言うおかしなことに・・^^;
まさに自分がそれに当てはまる気が・・・w
っというか、質問をすれば自然とランクアップ。。
なんか、成長してます感がでて、若干プレッシャーになってきますねw

#余談
最近シューティングの質問が極端に増えてきましたね。
それ専用に掲示板を立ててみてはどうですか?っと
管理人さんに手間をかける質問をあえてしてみます・・・。

trx

Re:GetHitKeyStateAll_2のKeyBuf

#18

投稿記事 by trx » 16年前

LoadSoundMem関数の返り値が-1の場合は、どのような時なのですか?

Dixq (管理人)

Re:GetHitKeyStateAll_2のKeyBuf

#19

投稿記事 by Dixq (管理人) » 16年前

>kazuoniさん

いえいえ、kazuoniさんはいつも回答してくださりお世話になっています^^
私は最近おろそかになってしまっているので、いつかJustyさんに抜かれそうな気が^^;

シューティングの質問増えてきましたね~。
多くの人が見てくださっているのにあの内容は・・。
色々見直したいですね~^^;

後、別掲示板の件、検討してみますね。

>trxさん

関数の仕様については、本家のリファレンスを確認してみるといいですよ。
http://homepage2.nifty.com/natupaji/DxLib/
リファレンスページから調べたい関数を調べて見て下さい。
どういう意味か解ると思います。

trx

Re:GetHitKeyStateAll_2のKeyBuf

#20

投稿記事 by trx » 16年前

管理人さん、ありがとうございます。
返り値をチェックして-1の場合どうすれば良いのでしょうか?
また返り値は、どの様にチェックすれば良いのでしょうか?
色々と調べてみたのですが、それらしき物が...
回答よろしくお願いします。

ねこ

Re:GetHitKeyStateAll_2のKeyBuf

#21

投稿記事 by ねこ » 16年前

int iRet = LoadSoundMem( "~~.wav" );
if( iRet == -1 )
{
	// 読み込めなかった場合
}
読みこめなかった場合の処理というのは単純にエラーメッセージを出して読めなかった事をどこかに出力するのが一般的ですが、
そもそも読めない状態自体を直す必要があるので、ファイルのパスやファイルの形式を確認して下さい。

<また返り値は、どの様にチェックすれば良いのでしょうか?
<色々と調べてみたのですが、それらしき物が...
この質問をされてる時点でCの基礎は勉強してないと思うのですが、
ちゃんとプログラムを作りたいなら最低限if、for、whileと関数の仕組み、変数の使い方程度はCの基礎サイト見るなりして勉強したほうがいいですよ。
このままだと何かやりたいたびに質問しなきゃいけなくてとても非効率になってます。

trx

Re:GetHitKeyStateAll_2のKeyBuf

#22

投稿記事 by trx » 16年前

if( ken[0] == -1 )
{
break;
}
と入れてみたのですが、プログラムは、止まりませんでした。
それとGetHitKeyStateAll関数を使っていた頃は、音は出ていましたので、ファイルは正常だと思いますが。
回答よろしくお願いします。

Mist

Re:GetHitKeyStateAll_2のKeyBuf

#23

投稿記事 by Mist » 16年前

breakはforやswitchから抜けるための命令であって、プログラムを止めるものではありません。
添付のプログラムにも反映されていませんし、その質問内容から回答はできないです。

No:39022で私が提示したサンプルのように音を鳴らすのではなく、画面表示でキー押下がキチンと認識できていないのか、それともキー押下は認識できているけど音を鳴らすことに失敗しているのか、問題の切り分けをしましょう。

trx

Re:GetHitKeyStateAll_2のKeyBuf

#24

投稿記事 by trx » 16年前

音が出ました!
単純な間違えをしていました。
Buildではなく、Compileを押していたからでした。
ごめんなさい。
ですが、今度は、画像が出てこなくなりました。
audio.cppを音だけ出る用にするには、どのように修正すれば良いのでしょうか?
回答よろしくお願いします。

ねこ

Re:GetHitKeyStateAll_2のKeyBuf

#25

投稿記事 by ねこ » 16年前

画像ファイル読み込んでる処理が無いから。


trx

Re:GetHitKeyStateAll_2のKeyBuf

#27

投稿記事 by trx » 16年前

内容からずれたので解決にして新しく開きます。

閉鎖

“C言語何でも質問掲示板” へ戻る