スペースを離すと弾が消えるのと、なぜかタイトル画面が表示されなくなりました。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
cupa
記事: 117
登録日時: 2年前

スペースを離すと弾が消えるのと、なぜかタイトル画面が表示されなくなりました。

#1

投稿記事 by cupa » 2年前

たびたび質問失礼します。
頑張ってSTGを作ろうとしている初心者です。
まず、前まで表示されていたタイトルが、弾を発射するようになってから表示されなくなりました。(Zを押すとスタートという設定で、真っ暗な画面でもZを押すとゲーム画面にはなります。)
もう一つは、スペースを押したときに弾を連射できるようになったのですが、スペースを離すと弾が消え、もう一度押すと先ほどの弾が先ほどの位置に居て、スペースを押していると弾が動きます。

コードを下記のとおりです、、、

コード:

#define WORLD_WIDTH 640
#define WORLD_HEIGHT 480
#define Tama 500

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	int i;

	int PienX, PienY, PienGraph;
	int PienTamaGraph, PienTamaX[Tama], PienTamaY[Tama], PienTamaFlag[Tama];
	int titlebackground, gamebackground, titlefont, titlemojifont;
	int sht_sound;

	ChangeWindowMode(true);
	SetGraphMode(WORLD_WIDTH, WORLD_HEIGHT, 64);
	DxLib_Init();
	SetDrawScreen(DX_SCREEN_BACK);
	SetDrawMode(DX_DRAWMODE_BILINEAR);
	SetWindowText("生姜");

	for (i = 0; i < Tama; i++)
	{
		PienTamaFlag[i] = 0;
	}

	titlebackground = LoadGraph("Game.title.jpg");
	gamebackground = LoadGraph("title2.jpg");
	PienGraph = LoadGraph("sprite.png");
	PienX = 320; PienY = 400;
	PienTamaGraph = LoadGraph("sht.jikishot.png");
	titlefont = CreateFontToHandle("けいふぉんと", 50, 9, DX_FONTTYPE_ANTIALIASING_EDGE);
	titlemojifont = CreateFontToHandle("07やさしさゴシック手書き", 20, 5, DX_FONTTYPE_ANTIALIASING_EDGE);
	sht_sound = LoadSoundMem("sht.c.z.mp3");

	enum {
		TITLE,

		GAME,

		END,
	}status=TITLE;

	while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)
	{
		ClearDrawScreen();

		switch (status)
		{
		case TITLE:
			DrawGraph(0, 0, titlebackground, 0);
			if (CheckHitKey(KEY_INPUT_Z)) {
				status = GAME;
			}
			break;
		case GAME:
			DrawGraph(0, 0, gamebackground, 0);
			break;
		case END:
			break;
		}
		
		if (status == TITLE)
		{
			DrawStringToHandle(70, 200, "シューティングゲーム", GetColor(255, 255, 255), titlefont);
			DrawStringToHandle(30, 420, "Zでゲーム開始", GetColor(255, 255, 255), titlemojifont);
			DrawStringToHandle(30, 450, "ESCでゲーム終了", GetColor(255, 255, 255), titlemojifont);
		}


		if (status == GAME)
		{
			DrawGraph(PienX, PienY, PienGraph, true);

			if (CheckHitKey(KEY_INPUT_W))PienY -= 3;
			if (CheckHitKey(KEY_INPUT_A))PienX -= 3;
			if (CheckHitKey(KEY_INPUT_S))PienY += 3;
			if (CheckHitKey(KEY_INPUT_D))PienX += 3;


			if (CheckHitKey(KEY_INPUT_SPACE) == 1)
			{
				i = -1;
				for (int p = 0; p < Tama; p++) // 配列を走査し
				{
					if (PienTamaFlag[p] != 1) // 空いている場所を見つけたら
					{
						i = p; // その添字をiに設定
						break;
					}
				}
				if (i >= 0)
				{
					int Pw, Ph, Tw, Th;

					GetGraphSize(PienGraph, &Pw, &Ph);
					GetGraphSize(PienTamaGraph, &Tw, &Th);

					// 弾iの位置をセット、位置はボール君の中心にする
					PienTamaX[i] = (Pw - Tw) / 2 + PienX;
					PienTamaY[i] = (Ph - Th) / 2 + PienY;

					PienTamaFlag[i] = 1;
				}

				


				for (i = 0; i < Tama; i++)
				{
					// 自機の弾iの移動ルーチン( 存在状態を保持している変数の内容が1(存在する)の場合のみ行う )
					if (PienTamaFlag[i] == 1)
					{
						// 弾iを16ドット上に移動させる
						PienTamaY[i] -= 16;

						// 画面外に出てしまった場合は存在状態を保持している変数に0(存在しない)を代入する
						if (PienTamaY[i] < -80)
						{
							PienTamaFlag[i] = 0;
						}

						// 画面に弾iを描画する
						DrawGraph(PienTamaX[i] + 10, PienTamaY[i] - 30, PienTamaGraph, true);
						DrawGraph(PienTamaX[i] - 10, PienTamaY[i] - 30, PienTamaGraph, true);
					}
				}
			}
			
			

			if (PienX > 640 - 64) PienX = 640 - 64;
			if (PienX <= 0) PienX = 0;
			if (PienY > 480 - 64) PienY = 480 - 64;
			if (PienY <= 0) PienY = 0;

			

			ScreenFlip();

		}
	}

	
	DxLib_End();

	return 0; 
}
どなたか助けてください、、、(Visual Studio 2019 C++)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: スペースを離すと弾が消えるのと、なぜかタイトル画面が表示されなくなりました。

#2

投稿記事 by みけCAT » 2年前

cupa さんが書きました:
2年前
まず、前まで表示されていたタイトルが、弾を発射するようになってから表示されなくなりました。(Zを押すとスタートという設定で、真っ暗な画面でもZを押すとゲーム画面にはなります。)
ScreenFlip(); を、 status == GAME の時にのみ実行するようにしているからですね。
cupa さんが書きました:
2年前
もう一つは、スペースを押したときに弾を連射できるようになったのですが、スペースを離すと弾が消え、もう一度押すと先ほどの弾が先ほどの位置に居て、スペースを押していると弾が動きます。
「自機の弾iの移動ルーチン」を、 CheckHitKey(KEY_INPUT_SPACE) == 1 の時にのみ実行するようにしているからですね。

いずれの処理も不適切なif文の外に出し、必要十分に実行されるようにするといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

cupa
記事: 117
登録日時: 2年前

Re: スペースを離すと弾が消えるのと、なぜかタイトル画面が表示されなくなりました。

#3

投稿記事 by cupa » 2年前

みけCATさん、いつも回答ありがとうございます!
ScreenFlip()がGAMEの時だけになっていたんですね、、、気づきませんでした(´;ω;`)
おかげで弾も思った通りになりましたし、タイトルのことも治りました、ありがとうございました!

返信

“C言語何でも質問掲示板” へ戻る