おおかたゲームの基盤となるものは出来たのでポーズ画面を少し書き足してみたのですが、うまく機能しません。
ゲーム画面からスペースキーを押すとポーズ画面へ飛ぶようにしたのですが、ゲーム中にスペースキーを押しても
「ポーズ中です」の文字がチラッと表示されるだけで、ゲームの処理自体は勝手に進んでしまいます。(敵は落ちてくるし、自機も移動できます)
自分の理想は、ゲーム中にスペースキーを押すと、ポーズ画面へ移動して自機処理や敵処理は行わない
ポーズ中にもう一度スペースキーを押すと自機処理、敵処理を再開するというようにしたいです。
OSはwindows vista, コンパイラは VC++ 2008, ライブラリはDXライブラリを使用しています。
回答よろしくおねがいします。
コードの161~166, 181~190のところがポーズ画面の処理です。
#include "DxLib.h"
#include <stdlib.h>
int Key[256]; // キーが押されているフレーム数を格納する
// キーの入力状態を更新する
int gpUpdateKey(){
char tmpKey[256]; // 現在のキーの入力状態を格納する
GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
for( int i=0; i<256; i++ ){
if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
Key[i]++; // 加算
} else { // 押されていなければ
Key[i] = 0; // 0にする
}
}
return 0;
}
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
//=====================色取得=====================
int Cr;
Cr = GetColor(255,255,255);
//========================自機画像保存========================
int Handle;
//========================敵画像保存========================
int EHandle;
//========================自機弾画像保存========================
int BuHandle;
//========================自機初期座標&自機サイズ========================
int JikiX, JikiY, JikiW, JikiH;
JikiX = 300;
JikiY = 380;
JikiW = 100;
JikiH = 100;
//=====================自機弾初期座標&自機弾サイズ&自機弾フラグ=====================
int BuX, BuY, BuW, BuH, BuFlag;
BuW = 2;
BuH = 16;
BuX = (JikiW - BuW) / 2 + JikiX;//弾をセット
BuY = (JikiH - BuH) / 2 + JikiY;
BuFlag = 0;
//========================敵の初期座標&敵サイズ&敵再配置フラグ========================
int TekiX, TekiY, TekiW, TekiH, TekiFlag;
TekiX = rand() * (640 - 100) / RAND_MAX;;
TekiY = 0;
TekiW = 100;
TekiH = 100;
TekiFlag = 0;
//========================ゲーム画面のフラグ========================
int GameState;
GameState = 0;
//========================スコア初期化========================
int Score;
Score = 0;
if(GameState == 0 && TekiFlag == 0){
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey() == 0 )
{
//=====================自機関係画像読み込み=====================
Handle = LoadGraph("画像/自機.bmp");
BuHandle = LoadGraph("画像/弾.bmp");
//=====================敵画像読み込み=====================
EHandle = LoadGraph("画像/敵.bmp");
//=====================ゲーム本体画面=====================
if(GameState == 0)
{
//===========================自機操作===================================
//if(Key[KEY_INPUT_UP] == 1) JikiY -= 2;
//if(Key[KEY_INPUT_DOWN] == 1) JikiY += 2;
if(Key[KEY_INPUT_LEFT]) JikiX -= 5;
if(Key[KEY_INPUT_RIGHT]) JikiX += 5;
//===========================自機が画面外に出そうなら===========================
if(JikiX < 0) JikiX = 0;
if(JikiX > 640 - 100) JikiX = 640 - 100;
//=====================自機描画=====================
DrawGraph(JikiX,JikiY,Handle,FALSE);
//=====================敵の落下処理(落下スピードはここで調整)=====================
TekiY += 3;
//=====================敵描画=====================
DrawGraph(TekiX,TekiY,EHandle,FALSE);
DrawFormatString(0,100,Cr,"X座標 = %d, Y座標 = %d, 再配置フラグ = %d", TekiX, TekiY, TekiFlag);
//=====================自機ショット判定処理=====================
//Zキーを押して1フレーム後かつ弾フラグが0の場合
if(Key[KEY_INPUT_Z] >= 1 && BuFlag == 0)
{
BuX = (JikiW - BuW) / 2 + JikiX;//弾をセット
BuY = (JikiH - BuH) / 2 + JikiY;
BuFlag = 1;//フラグを1にする
}
//=====================自機ショット描画処理=====================
if(BuFlag == 1)//フラグが1なら
{
BuY -= 15;//弾スピード調整
if(BuY < 0) //弾が画面外に出たら
{
BuFlag = 0;//弾フラグを0に
}
DrawGraph(BuX,BuY,BuHandle,FALSE);//弾を描画
}
//=========================当たり判定(上段は弾と敵、下段は自機と敵)===================================
if( ( ( BuX > TekiX && BuX < TekiX + TekiW ) ||( TekiX > BuX && TekiX < BuX + BuW ) ) &&( ( BuY > BuY && BuY < TekiY + TekiH ) ||( TekiY > BuY && TekiY < BuY + BuH ) ) )
{
DrawString(0,140,"呼び出しました!(当たり判定)",Cr);
TekiFlag = 1;
Score = Score + 10;
}else
if( ( ( JikiX > TekiX && JikiX < TekiX + TekiW ) ||( TekiX > JikiX && TekiX < JikiX + JikiW ) ) &&( ( JikiY > TekiY && JikiY < TekiY + TekiH ) ||( TekiY > JikiY && TekiY < JikiY + JikiH ) ) )
{
DrawString(0,0,"敵と接触しています!",Cr);
Score--;
//GameState = 2;
}
//=====================敵の落下限界判定=====================
//敵が画面外(Y座標が480以上)に出たら初期座標に戻す(X座標はランダム)
if(TekiY > 480)
{
DrawString(0,160,"呼び出しました!(敵落下限界判定)",Cr);
Score = Score - 5;
//X座標が画面外(X座標が540以上)に出たらもう一度計算
if(TekiX > 640 - 100)
{
DrawString(0,180,"呼び出しました!(敵落下限界判定(画面外))",Cr);
TekiFlag = 1;
}else{
TekiFlag = 1;
}
}
//=====================ポーズ画面移動判定=====================
//スペースキーを押して5フレーム経過後
if(Key[KEY_INPUT_SPACE] == 1)
{
GameState = 1;//ポーズ画面へ移動
}
//========================スコア描画処理========================
DrawFormatString(0,0,Cr,"スコア = %d",Score);
}
//=====================敵再配置フラグ処理=====================
if(TekiFlag == 1)
{
TekiX = rand() * 500 / RAND_MAX;
TekiY = 0;
TekiFlag = 0;
DrawString(0,120,"呼び出されてます!(再配置フラグ)",Cr);
}
//=====================ポーズ画面=====================
if(GameState == 1)
{
DrawString(200,200,"ポーズ中です",Cr);
//スペースキーを押して5フレーム経過後
if(Key[KEY_INPUT_SPACE] == 1)
{
GameState = 0;//ゲーム画面へ戻る
}
}
//=====================ゲームオーバー画面=====================
if(GameState == 2)
{
DrawString(150,200,"残念!ゲームオーバーです",Cr);
DrawString(150,250,"もう一度プレイするならスペースキーを押してください",Cr);
DrawString(150,300,"終了するならESCキーを長押ししてください",Cr);
//スペースキーを押して1フレーム経過後
if(Key[KEY_INPUT_SPACE] == 1)
{
GameState = 0;//ゲーム画面へ戻る
}
}
//=====================ゲーム終了処理=====================
if(Key[KEY_INPUT_ESCAPE] == 10)//ESCキーを押して10フレーム経過後
{
DxLib_End();//DXライブラリを終了する
}
}
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}