ボタンやキーを押した最初のフレームかどうかを判定するようにすれば大丈夫です
載せていただいたプログラムを手元でも動くように少し変更させていただいて、且つ
ステージセレクト画面が飛ばされないようにしてみましたので、よろしければご覧ください
GetJoypadInputState や CheckHitKey の戻り値を直接使用せずに、一旦変数に入れた後
一つ前のフレームの入力情報を元に「今回のフレームで押されたボタン・キー」だけを
抽出しているのがポイントです
#include "DxLib.h"
// パッドの入力情報
int edgePadInput[ 2 ];
int oldPadInput[ 2 ];
int padInput[ 2 ];
// キーの入力情報
char edgeKeyInput[ 256 ];
int oldKeyInput[ 256 ];
char keyInput[ 256 ];
int p1Flag,p2Flag; //プレイヤー決定
int charaFlag=0; //メッセージボックス確認用フラグ
int staFlag=0; //ステージセレクト決定
int p1Circle,p2Circle;
int prog = 0;
void Init(void)
{
p1Flag=0; //プレイヤー決定
p2Flag=0; //プレイヤー決定
staFlag=0;//ステージセレクト決定
charaFlag=0;
p1Circle=0;
p2Circle=0;
}
void selectKeyInput(void)
{
if(p1Circle==0) //●ボタンが押されてないとき
{
if ((edgePadInput[0] & PAD_INPUT_2) != 0||edgeKeyInput[KEY_INPUT_C])//「C」が押された時(大文字も反応する)
{
p1Flag=1; // player1のキャラが決まったことにする
p1Circle=1; // player1の●ボタンが押された設定
}
}
if(p2Flag==0) // player2のキャラが決定してないとき
{
if ((edgePadInput[1] & PAD_INPUT_2) != 0||edgeKeyInput[KEY_INPUT_N])//「N」が押された時(大文字も反応する)
{
p2Flag=1; // player2のキャラが決定したことにする
p2Circle=1; // // player2の●ボタンが押された設定
}
}
if (charaFlag==1&&staFlag==0&&p1Circle==1&&p2Circle==1) //charaFlagが1でなおかつstageFlagが0の場合
{
if((edgePadInput[1] & PAD_INPUT_2) != 0||(edgePadInput[0] & PAD_INPUT_2) != 0||edgeKeyInput[KEY_INPUT_C] != 0||edgeKeyInput[KEY_INPUT_N] != 0) //「space」が押されたとき
{
staFlag=1; //ステージが決定されたことにする
}
}
if(p1Flag==1&&p2Flag==1&&p1Circle==1&&p2Circle==1)
{
charaFlag=1; //player1とplayer2がキャラを決定したらcharaFlagを1にする
}
if(staFlag==1)
{
prog=1; //次の画面に移行
}
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// ウインドウモードで起動
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1 ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// 初期化
Init();
// メインループ
while( ProcessMessage() == 0 )
{
// 画面のクリア
ClearDrawScreen() ;
// パッドの入力を更新
// 一つ前のフレームのパッド入力を oldPadInput に移す
oldPadInput[ 0 ] = padInput[ 0 ];
oldPadInput[ 1 ] = padInput[ 1 ];
// 現在のフレームのパッド入力を padInput に代入する
padInput[ 0 ] = GetJoypadInputState( DX_INPUT_PAD1 );
padInput[ 1 ] = GetJoypadInputState( DX_INPUT_PAD2 );
// 一つ前のフレームで押されていなくて今回のフレームで押されたボタンを抽出する
edgePadInput[ 0 ] = padInput[ 0 ] & ~oldPadInput[ 0 ];
edgePadInput[ 1 ] = padInput[ 1 ] & ~oldPadInput[ 1 ];
// キーボードの入力を更新
// 一つ前のフレームのキー入力を oldKeyInput に移す
for( int i = 0; i < 256; i++ )
{
oldKeyInput[ i ] = keyInput[ i ];
}
// 現在のフレームのキー入力を keyInput に代入する
GetHitKeyStateAll( keyInput );
// 一つ前のフレームで押されていなくて今回のフレームで押されたキーを抽出する
for( int i = 0; i < 256; i++ )
{
edgeKeyInput[ i ] = keyInput[ i ] & ~oldKeyInput[ i ];
}
// prog が 0 なら selectKeyInput を呼ぶ
if( prog == 0 )
{
selectKeyInput();
}
// 変数の状態を表示
DrawFormatString( 0, 16 * 0, GetColor( 255,255,255 ), "p1Flag = %d", p1Flag );
DrawFormatString( 0, 16 * 1, GetColor( 255,255,255 ), "p2Flag = %d", p2Flag );
DrawFormatString( 0, 16 * 2, GetColor( 255,255,255 ), "charaFlag = %d", charaFlag );
DrawFormatString( 0, 16 * 3, GetColor( 255,255,255 ), "staFlag = %d", staFlag );
DrawFormatString( 0, 16 * 4, GetColor( 255,255,255 ), "p1Circle = %d", p1Circle );
DrawFormatString( 0, 16 * 5, GetColor( 255,255,255 ), "p2Circle = %d", p2Circle );
DrawFormatString( 0, 16 * 6, GetColor( 255,255,255 ), "prog = %d", prog );
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
因みに charaFlag に 1 を代入する処理と、staFlag に 1 を代入する処理は順番を逆にしています
そうしないと( あまりないと思いますが )プレイヤー1とプレイヤー2が同時に決定した場合、
やっぱりステージセレクト画面が飛ばされてしまうことになるので…