GetHitKeyStateAll_2関数の拡張
GetHitKeyStateAll_2関数の拡張
キーがどのくらい押されているかを調べるGetHitKeyStateAll_2関数ですがこれを拡張してジョイパッドのボタンがどのくらい押されているかを調べるにはどうすればいいでしょうか?
Re:GetHitKeyStateAll_2関数の拡張
int GetHitKeyStateAll_2(int KeyStateBuf[/url]) { char GetHitKeyStateAll_Key[257]; GetHitKeyStateAll( GetHitKeyStateAll_Key ); for(int i=0;i<257;i++) { if(GetHitKeyStateAll_Key==1) KeyStateBuf++; else if(i==256 && (GetJoypadInputState( DX_INPUT_PAD1 ) & PAD_INPUT_UP)!=0 ) KeyStateBuf[256]++; else KeyStateBuf=0; } return 0; }
こんな感じですかね?255に加えてジョイパッドのボタンを監査していく・・・
あってますかね^^;
ちょっと分からないですが。。
Re:GetHitKeyStateAll_2関数の拡張
自分でキー用の配列を用意してますよね?
http://dixq.net/g/#41
プログラミングの館ではKey[256]ですが,
これを先ほどのコードに合わせるにはKey[257]に変えて
Key[256]を呼び出せばいいです。
おそらく押され続けている場合にはインクリメントを続けているはずですが。。
http://dixq.net/g/#41
プログラミングの館ではKey[256]ですが,
これを先ほどのコードに合わせるにはKey[257]に変えて
Key[256]を呼び出せばいいです。
おそらく押され続けている場合にはインクリメントを続けているはずですが。。
Re:GetHitKeyStateAll_2関数の拡張
いえいえ、色んな意見があった方がいいと思いますし、
お気軽にご回答下さい^^
私も普段答えている内容が適切かどうかはわかりませんよw
リンク貼っただけじゃ不親切かもしれないので追記です。
実際にパッドについて見ている部分はこちらです。
まずはリファレンスでGetJoypadInputState関数についての記述を見て下さい。
仕組みを理解する必要があります。
各ビットがたっているかどうかしらべ、たっていたらインクリメントしているだけです。
mulは使わずに、iでビットシフトしてもOKです。
お気軽にご回答下さい^^
私も普段答えている内容が適切かどうかはわかりませんよw
リンク貼っただけじゃ不親切かもしれないので追記です。
実際にパッドについて見ている部分はこちらです。
int i,PadInput,mul=1; PadInput = GetJoypadInputState( DX_INPUT_PAD1 );//パッドの入力状態を取得 for(i=0;i<16;i++){ if(PadInput & mul) pad.key++; else pad.key=0; mul*=2; }
まずはリファレンスでGetJoypadInputState関数についての記述を見て下さい。
仕組みを理解する必要があります。
各ビットがたっているかどうかしらべ、たっていたらインクリメントしているだけです。
mulは使わずに、iでビットシフトしてもOKです。
Re:GetHitKeyStateAll_2関数の拡張
たしかによく見てみれば簡単に見えてきますね。
ところで見たところ知りたいボタンの数だけpad.keyを増やせばいい見たいですが
四本のパッドのボタンがどのくらい押されているか知りたい場合はpad.key[p]とでも
宣言すればいいのでしょうか?
ところで見たところ知りたいボタンの数だけpad.keyを増やせばいい見たいですが
四本のパッドのボタンがどのくらい押されているか知りたい場合はpad.key[p]とでも
宣言すればいいのでしょうか?
Re:GetHitKeyStateAll_2関数の拡張
えーと最後のmul*=2;はどういう意味でしょうか?
そもそもmulは何に使われているんですか?
あと感じとしては分かるんですが実際にまとめると
int i,PadInput,mul[4]={1,1,1,1};
int pad.key[4][16];
void Pad(void){
PadInput = GetJoypadInputState( DX_INPUT_PAD1 );//パッドの入力状態を取得
for(i=0;i<16;i++){
if(PadInput & mul[0])
else pad.key[0]=0;
mul[0]*=2;
}
PadInput = GetJoypadInputState( DX_INPUT_PAD2 );//パッドの入力状態を取得
for(i=0;i<16;i++){
if(PadInput & mul[1])
else pad.key[1]=0;
mul[1]*=2;
}
PadInput = GetJoypadInputState( DX_INPUT_PAD3 );//パッドの入力状態を取得
for(i=0;i<16;i++){
if(PadInput & mul[2])
else pad.key[2]=0;
mul[2]*=2;
}
PadInput = GetJoypadInputState( DX_INPUT_PAD4 );//パッドの入力状態を取得
for(i=0;i<16;i++){
if(PadInput & mul[3])
else pad.key[3]=0;
mul[3]*=2;
}
}
Pad();
if(pad.key[0][0]>0)
こんな感じですかね?どこか無駄なところありますか?
あとmulは4個いるんでしょうか?十字ボタンなどもこれで調べられるんでしょうか?
それから処理の前にパッドが刺さっているか調べる必要もありますね。
そういう処理はどう書けば・・
すいません私にはこれが限界です。
そもそもmulは何に使われているんですか?
あと感じとしては分かるんですが実際にまとめると
int i,PadInput,mul[4]={1,1,1,1};
int pad.key[4][16];
void Pad(void){
PadInput = GetJoypadInputState( DX_INPUT_PAD1 );//パッドの入力状態を取得
for(i=0;i<16;i++){
if(PadInput & mul[0])
else pad.key[0]=0;
mul[0]*=2;
}
PadInput = GetJoypadInputState( DX_INPUT_PAD2 );//パッドの入力状態を取得
for(i=0;i<16;i++){
if(PadInput & mul[1])
else pad.key[1]=0;
mul[1]*=2;
}
PadInput = GetJoypadInputState( DX_INPUT_PAD3 );//パッドの入力状態を取得
for(i=0;i<16;i++){
if(PadInput & mul[2])
else pad.key[2]=0;
mul[2]*=2;
}
PadInput = GetJoypadInputState( DX_INPUT_PAD4 );//パッドの入力状態を取得
for(i=0;i<16;i++){
if(PadInput & mul[3])
else pad.key[3]=0;
mul[3]*=2;
}
}
Pad();
if(pad.key[0][0]>0)
こんな感じですかね?どこか無駄なところありますか?
あとmulは4個いるんでしょうか?十字ボタンなどもこれで調べられるんでしょうか?
それから処理の前にパッドが刺さっているか調べる必要もありますね。
そういう処理はどう書けば・・
すいません私にはこれが限界です。
Re:GetHitKeyStateAll_2関数の拡張
GetJoypadInputStateの関数の説明を本家のリファレンスで確認していただければmulの意味は解ると思います。
mul *= 2;
じゃなくても、ビットシフトでもOKです。
各ビットがたっているかどうかを判断しているのです。
無駄な部分はまず
mul[4]
です。mulの計算は4種類分ける必要も、値を保持している必要もないので、
int mul;
で同じmulを使ってもいいと思います。
後、配列に
DX_INPUT_PAD1,DX_INPUT_PAD2,DX_INPUT_PAD3,DX_INPUT_PAD4
を格納してやり、ループで回してやれば
同じ事を4回も書かなくて済むと思います。
mul *= 2;
じゃなくても、ビットシフトでもOKです。
各ビットがたっているかどうかを判断しているのです。
無駄な部分はまず
mul[4]
です。mulの計算は4種類分ける必要も、値を保持している必要もないので、
int mul;
で同じmulを使ってもいいと思います。
後、配列に
DX_INPUT_PAD1,DX_INPUT_PAD2,DX_INPUT_PAD3,DX_INPUT_PAD4
を格納してやり、ループで回してやれば
同じ事を4回も書かなくて済むと思います。
Re:GetHitKeyStateAll_2関数の拡張
配列とは何の配列でしょうか?
仮にchar型として
char PAD[4]={DX_INPUT_PAD1,DX_INPUT_PAD2,DX_INPUT_PAD3,DX_INPUT_PAD4};
int i,j,PadInput,mul=1;
int pad.key[4][16];
void Pad(void){
for(j=0;j<4;i++){
PadInput = GetJoypadInputState( PAD[j] );//パッドの入力状態を取得
for(i=0;i<16;i++){
if(PadInput & mul)
else pad.key[j]=0;
mul*=2;
}
}
}
こんな感じですかね?
あとこれでコンフィグを作りたかったら
if(pad.key[P][K]>0)
のKの中身を変えればいいんですよね
心配なのはパッドが3本しか刺さってないのに
4本」めの処理をやるとどうなるかですね
全部0が入るなら特に問題はないんですけど
仮にchar型として
char PAD[4]={DX_INPUT_PAD1,DX_INPUT_PAD2,DX_INPUT_PAD3,DX_INPUT_PAD4};
int i,j,PadInput,mul=1;
int pad.key[4][16];
void Pad(void){
for(j=0;j<4;i++){
PadInput = GetJoypadInputState( PAD[j] );//パッドの入力状態を取得
for(i=0;i<16;i++){
if(PadInput & mul)
else pad.key[j]=0;
mul*=2;
}
}
}
こんな感じですかね?
あとこれでコンフィグを作りたかったら
if(pad.key[P][K]>0)
のKの中身を変えればいいんですよね
心配なのはパッドが3本しか刺さってないのに
4本」めの処理をやるとどうなるかですね
全部0が入るなら特に問題はないんですけど
Re:GetHitKeyStateAll_2関数の拡張
0が入るんじゃないですかね。
やってみてはどうでしょう?
不安でしたら本家で聞いてみては。
お書きになったプログラムは色々問題があります。
記載ミスだと考えるとまぁまぁループの仕方はいいと思いますが、
mulは初期化してくださいね。
後加算もして下さい。
そのままだとうまくいかないのは試したら解ると思います。
とりあえず良いかどうかは聞く前に試してみる方が効率的です。
&は論理積です。
「論理積、論理和、否定、排他的論理和」
は是非知っておくべきことなので、この辺ググって確認してください。
このキーワードに「C言語」を付け加えたらC言語についてのプログラムコードも出てくるでしょう。
やってみてはどうでしょう?
不安でしたら本家で聞いてみては。
お書きになったプログラムは色々問題があります。
記載ミスだと考えるとまぁまぁループの仕方はいいと思いますが、
mulは初期化してくださいね。
後加算もして下さい。
そのままだとうまくいかないのは試したら解ると思います。
とりあえず良いかどうかは聞く前に試してみる方が効率的です。
&は論理積です。
「論理積、論理和、否定、排他的論理和」
は是非知っておくべきことなので、この辺ググって確認してください。
このキーワードに「C言語」を付け加えたらC言語についてのプログラムコードも出てくるでしょう。
Re:GetHitKeyStateAll_2関数の拡張
> ちなみに
> if(PadInput & mul)
> の「&」はどういう意味があるんですか?
こちらに簡単な説明が載っていますよ。→http://www.play21.jp/board/formz.cgi?ac ... 9612#19592
あと、パッドが接続されている数を調べるなら GetJoypadNum を使えばいいと思いますよ。
> if(PadInput & mul)
> の「&」はどういう意味があるんですか?
こちらに簡単な説明が載っていますよ。→http://www.play21.jp/board/formz.cgi?ac ... 9612#19592
あと、パッドが接続されている数を調べるなら GetJoypadNum を使えばいいと思いますよ。
Re:GetHitKeyStateAll_2関数の拡張
>パッドが接続されている数を調べるなら GetJoypadNum を使えばいいと思いますよ。
1,2,3,4
のコントローラーがささっていて、例えば途中で3が抜けたとき
1,2,4
になるときとかの話かなと思ったんですが、どうなんでしょう?
1,2,3,4
のコントローラーがささっていて、例えば途中で3が抜けたとき
1,2,4
になるときとかの話かなと思ったんですが、どうなんでしょう?
Re:GetHitKeyStateAll_2関数の拡張
> >パッドが接続されている数を調べるなら GetJoypadNum を使えばいいと思いますよ。
>
> 1,2,3,4
> のコントローラーがささっていて、例えば途中で3が抜けたとき
> 1,2,4
> になるときとかの話かなと思ったんですが、どうなんでしょう?
DXライブラリのソースコードの方を軽く確認したところ、
DirectInput を使用した場合で、上記の状況になった時、
抜いた直前の状態のまま値が残る(0で埋まらない)ようです。
DirectInput を使わない設定では正しく0で埋めるようです。
>
> 1,2,3,4
> のコントローラーがささっていて、例えば途中で3が抜けたとき
> 1,2,4
> になるときとかの話かなと思ったんですが、どうなんでしょう?
DXライブラリのソースコードの方を軽く確認したところ、
DirectInput を使用した場合で、上記の状況になった時、
抜いた直前の状態のまま値が残る(0で埋まらない)ようです。
DirectInput を使わない設定では正しく0で埋めるようです。
Re:GetHitKeyStateAll_2関数の拡張
なるほど&&と同じですね。
ところで配列とは何の配列なのでしょう?
わからないのでまたchar型として
char PAD[4]={DX_INPUT_PAD1,DX_INPUT_PAD2,DX_INPUT_PAD3,DX_INPUT_PAD4};
int i,j,PadInput,mul=1;
int pad.key[4][16];
void Pad(void){
for(j=0;j<4;i++){
mul=1;
PadInput = GetJoypadInputState( PAD[j] );//パッドの入力状態を取得
for(i=0;i<16;i++){
if(PadInput & mul) pad.key[j]++;
else pad.key[j]=0;
mul*=2;
}
}
}
少しはマシになりましたか?
あとはどこに問題があるでしょうか?
とりあえず
「途中でパッドが抜けたら」は抜かないように注意する
「刺さっているパッドの数」はGetJoypadNum関数と何人対戦か選んでもらう
まあこんな感じで解決するとして
>後、配列に
>DX_INPUT_PAD1,DX_INPUT_PAD2,DX_INPUT_PAD3,DX_INPUT_PAD4
>を格納してやり、ループで回してやれば
>同じ事を4回も書かなくて済むと思います。
配列は結局何の配列でしょうか?
PadInput = GetJoypadInputState( PAD[j] );//
見たところマクロっぽいですね。
さすがにここにchar型配列はまずいですよね。
ところで配列とは何の配列なのでしょう?
わからないのでまたchar型として
char PAD[4]={DX_INPUT_PAD1,DX_INPUT_PAD2,DX_INPUT_PAD3,DX_INPUT_PAD4};
int i,j,PadInput,mul=1;
int pad.key[4][16];
void Pad(void){
for(j=0;j<4;i++){
mul=1;
PadInput = GetJoypadInputState( PAD[j] );//パッドの入力状態を取得
for(i=0;i<16;i++){
if(PadInput & mul) pad.key[j]++;
else pad.key[j]=0;
mul*=2;
}
}
}
少しはマシになりましたか?
あとはどこに問題があるでしょうか?
とりあえず
「途中でパッドが抜けたら」は抜かないように注意する
「刺さっているパッドの数」はGetJoypadNum関数と何人対戦か選んでもらう
まあこんな感じで解決するとして
>後、配列に
>DX_INPUT_PAD1,DX_INPUT_PAD2,DX_INPUT_PAD3,DX_INPUT_PAD4
>を格納してやり、ループで回してやれば
>同じ事を4回も書かなくて済むと思います。
配列は結局何の配列でしょうか?
PadInput = GetJoypadInputState( PAD[j] );//
見たところマクロっぽいですね。
さすがにここにchar型配列はまずいですよね。
Re:GetHitKeyStateAll_2関数の拡張
&&と論理積は違います。
&一つか&二つかで意味は違います。
&&は「かつ」です。「両方とも」を意味します。
配列というのは、お書きになっているとおり、
DX_INPUT_PAD1,DX_INPUT_PAD2,DX_INPUT_PAD3,DX_INPUT_PAD4
を入れるための配列です。
配列を使えばループできますしね。
これらの正体は恐らくint型だと思います。
定義名を右クリックして「定義へ移動」すると宣言されている項目が出ます。
中身はきっと1,2,3,4でしょうから、1バイトでも格納できていると思いますが正しくはintだと思います。
後、ソースコードはタグを使ってくださいね。
試していませんが、見た感じよさそうです。
GetJoypadInputStateの引数がおかしいんじゃないかと思われているようですが、
DXライブラリのリファレンスは確認されましたか?
リファレンスにこの関数はintを渡すように書かれていますから、intであることがわかりますね。
&一つか&二つかで意味は違います。
&&は「かつ」です。「両方とも」を意味します。
配列というのは、お書きになっているとおり、
DX_INPUT_PAD1,DX_INPUT_PAD2,DX_INPUT_PAD3,DX_INPUT_PAD4
を入れるための配列です。
配列を使えばループできますしね。
これらの正体は恐らくint型だと思います。
定義名を右クリックして「定義へ移動」すると宣言されている項目が出ます。
中身はきっと1,2,3,4でしょうから、1バイトでも格納できていると思いますが正しくはintだと思います。
後、ソースコードはタグを使ってくださいね。
試していませんが、見た感じよさそうです。
GetJoypadInputStateの引数がおかしいんじゃないかと思われているようですが、
DXライブラリのリファレンスは確認されましたか?
リファレンスにこの関数はintを渡すように書かれていますから、intであることがわかりますね。
Re:GetHitKeyStateAll_2関数の拡張
えーとつまり&はAND回路のようなもの・・・ですかね?
まあとにかくchar型をint型に変えればOKですかね?
とりあえず組み込んで試してみるので少々お待ちください
まあとにかくchar型をint型に変えればOKですかね?
とりあえず組み込んで試してみるので少々お待ちください
Re:GetHitKeyStateAll_2関数の拡張
>えーとつまり&はAND回路のようなもの・・・ですかね?
そうです。
真理値表をみたらどういう関係になっているか解ると思います。
関数に渡す引数はint型ですね。
そうです。
真理値表をみたらどういう関係になっているか解ると思います。
関数に渡す引数はint型ですね。
Re:GetHitKeyStateAll_2関数の拡張
うまくいきました。見た感じ問題ないです。
pad.keyの「.」をうけつけなっかたので「_」に変えました。
長々と付き合っていただいてありがとうございます。
pad.keyの「.」をうけつけなっかたので「_」に変えました。
長々と付き合っていただいてありがとうございます。
Re:GetHitKeyStateAll_2関数の拡張
.は構造体のメンバーを表しますが、 _は単に続きの変数名などの文字列になります。 上では小さくてよく見えませんでしたが int pad.key[4][16]; これはまずいです。 padが持つ要素がkeyだけなのならただの配列で大丈夫です。