トップページ > 過去ログ > 記事閲覧
3キー以上の入力判定
名前:XM3 日時: 2008/01/13 00:13

初めまして、 DXライブラリを使用して、とあるシューティングゲームを作成しようと思っているのですが 自機の操作をするプログラムを以下のように組んだところ、 十字キーを3キー以上入力した場合に正常に動作しなくなってしまいます どうかご教授お願いします Keyには押しているキーの分の数値が加算されて、 例えば↑と→を押してる場合は6 ←と↑と→を押している場合は9 という感じで判定をかけています 3キー押されている場合は、上下・左右で相殺して残りの一つに相当する処理を行うようにしています Moveは移動速度、SlashMoveは斜め移動時の移動速度です WindowX、Yは自機の移動可能範囲 Cha01_SizeX、Yは自機の画像サイズです for(;;){ //キー判定フラグの初期化 Key = 0 ; //キー押下情報取得 if( Buf[ KEY_INPUT_UP ] == 1 ){ Key = Key + 1 ; } if( Buf[ KEY_INPUT_DOWN ] == 1 ){ Key = Key + 7 ; } if( Buf[ KEY_INPUT_LEFT ] == 1 ){ Key = Key + 3 ; } if( Buf[ KEY_INPUT_RIGHT ] == 1 ){ Key = Key + 5 ; } //キー判定 if( Key == 1 || Key == 9 ){ Y = Y - Move ; } if(Key == 7 || Key == 15){ Y = Y + Move ; } if(Key == 3 || Key == 11){ X = X - Move ; } if(Key == 5 || Key == 13){ X = X + Move ; } if(Key == 4){ if(X == 0 || Y == 0){ X = X - Move ; Y = Y - Move ; } else{ X = X - SlashMove ; Y = Y - SlashMove ; } } if(Key == 6){ if(X == WindowX - Cha01_SizeX || Y == 0){ X = X + Move ; Y = Y - Move ; } else{ X = X + SlashMove ; Y = Y - SlashMove ; } } if(Key == 10){ if(X == 0 || Y == WindowY - Cha01_SizeY){ X = X - Move ; Y = Y + Move ; } else{ X = X - SlashMove ; Y = Y + SlashMove ; } } if(Key == 12){ if(X == WindowX - Cha01_SizeX || Y == WindowY - Cha01_SizeY){ X = X + Move ; Y = Y + Move ; } else{ X = X + SlashMove ; Y = Y + SlashMove ; } } //画面外にはみ出した時は修正 if(Y < 0){ Y = 0 ; } if(Y > WindowY - Cha01_SizeY){ Y = WindowY - Cha01_SizeY ; } if(X < 0){ X = 0 ; } if(X > WindowX - Cha01_SizeX){ X = WindowX - Cha01_SizeX ; } }

Page: 1 |

Re: 3キー以上の入力判定 ( No.1 )
名前:ZAP 日時:2008/01/13 01:20

キーボードのハード的な仕様で、組み合わせによっては 3つ以上のキーの入力を受け付けない場合があります。 下記のプログラムで試してみてください。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int Cr , PadInput ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // 白色の値を取得 Cr = GetColor( 255 , 255 , 255 ) ; SetDrawScreen(DX_SCREEN_BACK); PadInput = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ; while( ( PadInput & PAD_INPUT_START ) == 0 ) { // メッセージ処理 if( ProcessMessage() == -1 ) { break ; // エラーが発生したらループを抜ける } // 入力を取得 PadInput = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ; ClearDrawScreen(); DrawString( 0,0,"ESCで終了します",Cr); if( ( PadInput & PAD_INPUT_UP ) != 0 ) DrawString( 0,32,"上",Cr); if( ( PadInput & PAD_INPUT_DOWN ) != 0 ) DrawString(16,32,"下",Cr); if( ( PadInput & PAD_INPUT_LEFT ) != 0 ) DrawString(32,32,"左",Cr); if( ( PadInput & PAD_INPUT_RIGHT) != 0 ) DrawString(48,32,"右",Cr); ScreenFlip(); } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }

Page: 1 |