ページ 11

GetHitKeyStateAll_2関数の拡張

Posted: 2008年10月29日(水) 12:53
by 匿名
キーがどのくらい押されているかを調べるGetHitKeyStateAll_2関数ですがこれを拡張してジョイパッドのボタンがどのくらい押されているかを調べるにはどうすればいいでしょうか?

Re:GetHitKeyStateAll_2関数の拡張

Posted: 2008年10月29日(水) 13:21
by kazuoni
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関数の拡張

Posted: 2008年10月29日(水) 13:37
by 匿名
えーと・・値を見る時はどう書けば呼べるんですか?

Re:GetHitKeyStateAll_2関数の拡張

Posted: 2008年10月29日(水) 13:44
by kazuoni
自分でキー用の配列を用意してますよね?

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

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

Re:GetHitKeyStateAll_2関数の拡張

Posted: 2008年10月29日(水) 14:56
by Dixq (管理人)
龍神録の館にその実装が書いてあります。
参考になればどうぞ。
http://dixq.net/rp/8.html

Re:GetHitKeyStateAll_2関数の拡張

Posted: 2008年10月29日(水) 15:28
by kazuoni
申し訳ないです。
やはり独立させたほうがよかったですね。。

Re:GetHitKeyStateAll_2関数の拡張

Posted: 2008年10月29日(水) 15:35
by Dixq (管理人)
いえいえ、色んな意見があった方がいいと思いますし、
お気軽にご回答下さい^^
私も普段答えている内容が適切かどうかはわかりませんよ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関数の拡張

Posted: 2008年10月31日(金) 16:08
by 匿名
たしかによく見てみれば簡単に見えてきますね。
ところで見たところ知りたいボタンの数だけpad.keyを増やせばいい見たいですが
四本のパッドのボタンがどのくらい押されているか知りたい場合はpad.key[p]とでも
宣言すればいいのでしょうか?

Re:GetHitKeyStateAll_2関数の拡張

Posted: 2008年11月01日(土) 01:49
by Dixq (管理人)
宣言は
pad.key[p]
とするわけにはいきませんが、感じとしてはそんな感じでも出来ると思います。

Re:GetHitKeyStateAll_2関数の拡張

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

Re:GetHitKeyStateAll_2関数の拡張

Posted: 2008年11月01日(土) 18:39
by Dixq (管理人)
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関数の拡張

Posted: 2008年11月04日(火) 16:00
by 匿名
配列とは何の配列でしょうか?
仮に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関数の拡張

Posted: 2008年11月06日(木) 16:27
by 匿名
ちなみに
if(PadInput & mul)
の「&」はどういう意味があるんですか?

Re:GetHitKeyStateAll_2関数の拡張

Posted: 2008年11月06日(木) 16:39
by Dixq (管理人)
0が入るんじゃないですかね。
やってみてはどうでしょう?
不安でしたら本家で聞いてみては。

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

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

Re:GetHitKeyStateAll_2関数の拡張

Posted: 2008年11月06日(木) 16:42
by 御津凪
> ちなみに
> if(PadInput & mul)
> の「&」はどういう意味があるんですか?

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

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

Re:GetHitKeyStateAll_2関数の拡張

Posted: 2008年11月06日(木) 16:45
by Dixq (管理人)
>パッドが接続されている数を調べるなら GetJoypadNum を使えばいいと思いますよ。

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

Re:GetHitKeyStateAll_2関数の拡張

Posted: 2008年11月06日(木) 16:56
by 御津凪
> >パッドが接続されている数を調べるなら GetJoypadNum を使えばいいと思いますよ。
>
> 1,2,3,4
> のコントローラーがささっていて、例えば途中で3が抜けたとき
> 1,2,4
> になるときとかの話かなと思ったんですが、どうなんでしょう?

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

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

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

Re:GetHitKeyStateAll_2関数の拡張

Posted: 2008年11月07日(金) 15:34
by 匿名
なるほど&&と同じですね。
ところで配列とは何の配列なのでしょう?
わからないのでまた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関数の拡張

Posted: 2008年11月08日(土) 04:46
by Dixq (管理人)
&&と論理積は違います。
&一つか&二つかで意味は違います。
&&は「かつ」です。「両方とも」を意味します。

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

Posted: 2008年11月10日(月) 16:20
by 匿名
えーとつまり&はAND回路のようなもの・・・ですかね?
まあとにかくchar型をint型に変えればOKですかね?
とりあえず組み込んで試してみるので少々お待ちください

Re:GetHitKeyStateAll_2関数の拡張

Posted: 2008年11月10日(月) 17:47
by Dixq (管理人)
>えーとつまり&はAND回路のようなもの・・・ですかね?

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

Re:GetHitKeyStateAll_2関数の拡張

Posted: 2008年11月14日(金) 15:57
by 匿名
うまくいきました。見た感じ問題ないです。
pad.keyの「.」をうけつけなっかたので「_」に変えました。
長々と付き合っていただいてありがとうございます。

Re:GetHitKeyStateAll_2関数の拡張

Posted: 2008年11月14日(金) 16:00
by Dixq (管理人)
それは使い方が違う気がしますが・・;

Re:GetHitKeyStateAll_2関数の拡張

Posted: 2008年11月17日(月) 16:13
by 匿名
えっ何か変わるんですか?

Re:GetHitKeyStateAll_2関数の拡張

Posted: 2008年11月17日(月) 16:22
by Dixq (管理人)
.は構造体のメンバーを表しますが、
_は単に続きの変数名などの文字列になります。

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

int pad.key[4][16];

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

Re:GetHitKeyStateAll_2関数の拡張

Posted: 2008年11月18日(火) 21:59
by 匿名
うーん、ただの配列と解釈して組み込みましたし、特に問題もおきてませんから大丈夫だと思います。