GetHitKeyStateAll_2関数の拡張

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

GetHitKeyStateAll_2関数の拡張

#1

投稿記事 by 匿名 » 16年前

キーがどのくらい押されているかを調べるGetHitKeyStateAll_2関数ですがこれを拡張してジョイパッドのボタンがどのくらい押されているかを調べるにはどうすればいいでしょうか?

kazuoni

Re:GetHitKeyStateAll_2関数の拡張

#2

投稿記事 by kazuoni » 16年前

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関数の拡張

#3

投稿記事 by 匿名 » 16年前

えーと・・値を見る時はどう書けば呼べるんですか?

kazuoni

Re:GetHitKeyStateAll_2関数の拡張

#4

投稿記事 by kazuoni » 16年前

自分でキー用の配列を用意してますよね?

http://dixq.net/g/#41

プログラミングの館ではKey[256]ですが,
これを先ほどのコードに合わせるにはKey[257]に変えて
Key[256]を呼び出せばいいです。
おそらく押され続けている場合にはインクリメントを続けているはずですが。。

Dixq (管理人)

Re:GetHitKeyStateAll_2関数の拡張

#5

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

龍神録の館にその実装が書いてあります。
参考になればどうぞ。
http://dixq.net/rp/8.html

kazuoni

Re:GetHitKeyStateAll_2関数の拡張

#6

投稿記事 by kazuoni » 16年前

申し訳ないです。
やはり独立させたほうがよかったですね。。

Dixq (管理人)

Re:GetHitKeyStateAll_2関数の拡張

#7

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

いえいえ、色んな意見があった方がいいと思いますし、
お気軽にご回答下さい^^
私も普段答えている内容が適切かどうかはわかりませんよ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関数の拡張

#8

投稿記事 by 匿名 » 16年前

たしかによく見てみれば簡単に見えてきますね。
ところで見たところ知りたいボタンの数だけpad.keyを増やせばいい見たいですが
四本のパッドのボタンがどのくらい押されているか知りたい場合はpad.key[p]とでも
宣言すればいいのでしょうか?

Dixq (管理人)

Re:GetHitKeyStateAll_2関数の拡張

#9

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

宣言は
pad.key[p]
とするわけにはいきませんが、感じとしてはそんな感じでも出来ると思います。

匿名

Re:GetHitKeyStateAll_2関数の拡張

#10

投稿記事 by 匿名 » 16年前

えーと最後の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個いるんでしょうか?十字ボタンなどもこれで調べられるんでしょうか?
それから処理の前にパッドが刺さっているか調べる必要もありますね。
そういう処理はどう書けば・・
すいません私にはこれが限界です。

Dixq (管理人)

Re:GetHitKeyStateAll_2関数の拡張

#11

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

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回も書かなくて済むと思います。

匿名

Re:GetHitKeyStateAll_2関数の拡張

#12

投稿記事 by 匿名 » 16年前

配列とは何の配列でしょうか?
仮に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関数の拡張

#13

投稿記事 by 匿名 » 16年前

ちなみに
if(PadInput & mul)
の「&」はどういう意味があるんですか?

Dixq (管理人)

Re:GetHitKeyStateAll_2関数の拡張

#14

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

0が入るんじゃないですかね。
やってみてはどうでしょう?
不安でしたら本家で聞いてみては。

お書きになったプログラムは色々問題があります。
記載ミスだと考えるとまぁまぁループの仕方はいいと思いますが、
mulは初期化してくださいね。
後加算もして下さい。
そのままだとうまくいかないのは試したら解ると思います。
とりあえず良いかどうかは聞く前に試してみる方が効率的です。

&は論理積です。
「論理積、論理和、否定、排他的論理和」
は是非知っておくべきことなので、この辺ググって確認してください。
このキーワードに「C言語」を付け加えたらC言語についてのプログラムコードも出てくるでしょう。

御津凪

Re:GetHitKeyStateAll_2関数の拡張

#15

投稿記事 by 御津凪 » 16年前

> ちなみに
> if(PadInput & mul)
> の「&」はどういう意味があるんですか?

こちらに簡単な説明が載っていますよ。→http://www.play21.jp/board/formz.cgi?ac ... 9612#19592

あと、パッドが接続されている数を調べるなら GetJoypadNum を使えばいいと思いますよ。

Dixq (管理人)

Re:GetHitKeyStateAll_2関数の拡張

#16

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

>パッドが接続されている数を調べるなら GetJoypadNum を使えばいいと思いますよ。

1,2,3,4
のコントローラーがささっていて、例えば途中で3が抜けたとき
1,2,4
になるときとかの話かなと思ったんですが、どうなんでしょう?

御津凪

Re:GetHitKeyStateAll_2関数の拡張

#17

投稿記事 by 御津凪 » 16年前

> >パッドが接続されている数を調べるなら GetJoypadNum を使えばいいと思いますよ。
>
> 1,2,3,4
> のコントローラーがささっていて、例えば途中で3が抜けたとき
> 1,2,4
> になるときとかの話かなと思ったんですが、どうなんでしょう?

DXライブラリのソースコードの方を軽く確認したところ、

DirectInput を使用した場合で、上記の状況になった時、
抜いた直前の状態のまま値が残る(0で埋まらない)ようです。

DirectInput を使わない設定では正しく0で埋めるようです。

匿名

Re:GetHitKeyStateAll_2関数の拡張

#18

投稿記事 by 匿名 » 16年前

なるほど&&と同じですね。
ところで配列とは何の配列なのでしょう?
わからないのでまた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型配列はまずいですよね。

Dixq (管理人)

Re:GetHitKeyStateAll_2関数の拡張

#19

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

&&と論理積は違います。
&一つか&二つかで意味は違います。
&&は「かつ」です。「両方とも」を意味します。

配列というのは、お書きになっているとおり、
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関数の拡張

#20

投稿記事 by 匿名 » 16年前

えーとつまり&はAND回路のようなもの・・・ですかね?
まあとにかくchar型をint型に変えればOKですかね?
とりあえず組み込んで試してみるので少々お待ちください

Dixq (管理人)

Re:GetHitKeyStateAll_2関数の拡張

#21

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

>えーとつまり&はAND回路のようなもの・・・ですかね?

そうです。
真理値表をみたらどういう関係になっているか解ると思います。
関数に渡す引数はint型ですね。

匿名

Re:GetHitKeyStateAll_2関数の拡張

#22

投稿記事 by 匿名 » 16年前

うまくいきました。見た感じ問題ないです。
pad.keyの「.」をうけつけなっかたので「_」に変えました。
長々と付き合っていただいてありがとうございます。

Dixq (管理人)

Re:GetHitKeyStateAll_2関数の拡張

#23

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

それは使い方が違う気がしますが・・;

匿名

Re:GetHitKeyStateAll_2関数の拡張

#24

投稿記事 by 匿名 » 16年前

えっ何か変わるんですか?

Dixq (管理人)

Re:GetHitKeyStateAll_2関数の拡張

#25

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

.は構造体のメンバーを表しますが、
_は単に続きの変数名などの文字列になります。

上では小さくてよく見えませんでしたが

int pad.key[4][16];

これはまずいです。
padが持つ要素がkeyだけなのならただの配列で大丈夫です。
  

匿名

Re:GetHitKeyStateAll_2関数の拡張

#26

投稿記事 by 匿名 » 16年前

うーん、ただの配列と解釈して組み込みましたし、特に問題もおきてませんから大丈夫だと思います。

閉鎖

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