ページ 11

ゲームパッド入力で==1の場合が動かない

Posted: 2011年7月19日(火) 16:51
by chalaza
ゲーム制作とはあまり関係がないのですが、
ゲームパッドを使ってゲームが動くようにしたいと思い、
GetJoypadInputStateを使ってコントローラに対応するようにしたつもりなのですが、
入力で、if(( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_LEFT ) == 1 )
とした場合は動かなく、==2にしたりすると>=1の結果になってしまいます。>=1だとその通り動くのですが、
どこがおかしいのでしょうか…
void GameMain()という関数にint GetJoypadInputState( int InputType )の宣言を入れましたが、
グローバルにしても同じでした。

コード:

#include "DxLib.h"

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

#define SCREEN_WIDTH 560
#define SCREEN_HEIGHT 420
#define CHIP_SIZE 20
#define MAP_WIDTH (SCREEN_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (SCREEN_HEIGHT/CHIP_SIZE)
 
int MAP[21][28]=
{
    {0,0,8,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0, 0,0,0,0,0,0,0,0},
	{0,0,8,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0, 0,0,0,0,0,0,0,0},
	{0,0,8,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0, 0,0,0,0,0,0,0,0},
	{0,0,8,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0, 0,0,0,0,0,0,0,0},
	{0,0,8,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0, 0,0,0,0,0,0,0,0},
	{0,0,8,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0, 0,0,0,0,0,0,0,0},
	{0,0,8,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0, 0,0,0,0,0,0,0,0},
	{0,0,8,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0, 0,0,0,0,0,0,0,0},
	{0,0,8,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0, 0,0,0,0,0,0,0,0},
	{0,0,8,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0, 0,0,0,0,0,0,0,0},
	{0,0,8,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0, 0,0,0,0,0,0,0,0},
	{0,0,8,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0, 0,0,0,0,0,0,0,0},
	{0,0,8,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0, 0,0,0,0,0,0,0,0},
	{0,0,8,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0, 0,0,0,0,0,0,0,0},
	{0,0,8,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0, 0,0,0,0,0,0,0,0},
	{0,0,8,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0, 0,0,0,0,0,0,0,0},
	{0,0,8,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0, 0,0,0,0,0,0,0,0},
	{0,0,8,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0, 0,0,0,0,0,0,0,0},
	{0,0,8,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0, 0,0,0,0,0,0,0,0},
	{0,0,8,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0, 0,0,0,0,0,0,0,0},
	{0,0,8,8,8,8,8,8,8,8,8,8,8,8,0,0,0,0,0,0, 0,0,0,0,0,0,0,0},
};

int X=120, Y=0;
int time=0;

void GameMain(){

	int GetJoypadInputState( int InputType ) ;

	if(time<=60){
		time++;
	}else time=0;

	if(time==60)
		Y += 20;
    
    //入力
	if(( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_LEFT ) == 1 ){
		X -= 20;
	}

	if(( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_RIGHT ) == 1 ){
		X += 20;
	}

    if(( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_DOWN ) == 1 ){
		Y += 20;
	}
    
   
}

 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
        SetMainWindowText("テトリス");
    ChangeWindowMode(TRUE);
    SetGraphMode(560,420,32);
    if( DxLib_Init() == -1 ) return -1;
    SetDrawScreen( DX_SCREEN_BACK );

	int block[8] = {
	LoadGraph( "image/block1.png" ),//ブロック1~7+壁
	LoadGraph( "image/block2.png" ),
	LoadGraph( "image/block3.png" ),
	LoadGraph( "image/block4.png" ),
	LoadGraph( "image/block5.png" ),
	LoadGraph( "image/block6.png" ),
	LoadGraph( "image/block7.png" ),
	LoadGraph( "image/block0.png" )};
 
    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
          //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない
 
 
		GameMain();

 
		//とりあえずXとY座標にブロック1を表示してみる
		DrawGraph( X, Y, block[1], TRUE );
 
    //マップ描画
	for(int y=0;y<MAP_HEIGHT;y++){ 
		for(int x=0;x<MAP_WIDTH;x++){ 
			if(MAP[y][x] != 0)
			DrawGraph( x*20, y*20, block[MAP[y][x]-1], TRUE );
		}
	}
 
        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}


Re: ゲームパッド入力で==1の場合が動かない

Posted: 2011年7月19日(火) 17:21
by softya(ソフト屋)
ビット演算子である&演算子の意味を理解されていますか?
そこをちゃんと理解すれば、
if(( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_LEFT ) == 1 )
が成立しない理由も分かると思います。

Re: ゲームパッド入力で==1の場合が動かない

Posted: 2011年7月19日(火) 17:30
by non
DXLibは使っていないので、リファレンスを読んでみましたら、
こう書いてあります。

***以下DXLibリファレンスから

この関数には秘密があります。
 実はこの関数は返される値の各ビットが各ボタンに対応していて最大で 28個のボタンの状態を調べることが出来ます。
各ビットの構成は以下のようになっています。
 ビットが1になっていれば押されていることを示し、0の場合はおされて いないことを示しています。


(MSB)上位ビット          (LSB)下位ビット
BBBBBBBBBBBBBBBBBBBBBBBBBBBBURLD

D・L・R・U:それぞれ方向キー下・左・右・上  B:ボタン

***ここまで

これからするとPAD_INPUT_LEFT は0x02ですから、
if(( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_LEFT ) == 2 )
であることは明白です。

・・・かぶった。

Re: ゲームパッド入力で==1の場合が動かない

Posted: 2011年7月19日(火) 17:47
by naohiro19
「== 1」の部分を削除すれば動作すると思います。

Re: ゲームパッド入力で==1の場合が動かない

Posted: 2011年7月19日(火) 18:12
by chalaza
ありがとうございます。
間違えてGetHitKeyStateAll_2みたいに扱ってました。