c言語でシューティングを作ってます

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kob

c言語でシューティングを作ってます

#1

投稿記事 by kob » 2年前

現在、シューティングゲームっぽいものを作っています。
自機にHPの概念を追加したくて以下のプログラムを書きました。3回弾に当たると死亡するような感じにしたかったんですけどプログラムを実行すると2回で死んだり1回で死んだりして、困っています。何が原因でしょうか。かぼちゃは敵です。

コード:

 #include <math.h>
#include "DxLib.h"
#include "drawgra.h"
#include <time.h>

int jiki_handle;
int jiki_x = 100;
int jiki_y = 240;
int tama_handle;
int tama_sonzai = 0;
int tama_x;
int tama_y;
int teki_handle;
int teki_x = 500;
int teki_y = 200;
int tekitama_handle;
int tekitama_sonzai = 0;
int tekitama_x;
int tekitama_y;
int shouhai = 0;
int bakuhatu;
int haikei_hosizora;
int HP = 0;





void jiki_hyouji(int key)
{
	if (key == PAD_INPUT_RIGHT) {
		jiki_x = jiki_x + 4;
		if (jiki_x > 639) {
			jiki_x = 639;
		}
	}
	if (key == PAD_INPUT_LEFT) {
		jiki_x = jiki_x - 4;
		if (jiki_x < 0) {
			jiki_x = 0;
		}
	}
	if (key == PAD_INPUT_DOWN) {
		jiki_y = jiki_y + 4;
		if (jiki_y > 479) {
			jiki_y = 479;
		}
	}
	if (key == PAD_INPUT_UP) {
		jiki_y = jiki_y - 4;
		if (jiki_y < 0) {
			jiki_y = 0;
		}
	}

	DrawGra(jiki_x, jiki_y, jiki_handle, TRUE);

}
void tama_hyouji(int key)
{
	if (key == PAD_INPUT_A){
		if (tama_sonzai == 0) {
			tama_sonzai = 1;
			tama_x = jiki_x;
			tama_y = jiki_y;
		}
	}
	  if (tama_sonzai == 1) {
			tama_x = tama_x + 8;
			if (tama_x > 639) {
				tama_sonzai = 0;
			}
			DrawGra(tama_x, tama_y, tama_handle, TRUE);
		}

	}
	
void tama_z(int key)
{
	if (key == PAD_INPUT_B) {

		if (tama_sonzai == 0) {
			tama_sonzai = 1;
			tama_x = jiki_x;
			tama_y = jiki_y;
		}
	}
	
	if (tama_sonzai == 1) {
		tama_x = tama_x + 16;
		if (tama_x > 639) {
			tama_sonzai = 0;
		}
		DrawGra(tama_x, tama_y, tama_handle, TRUE);
	}
}


int count;
int teki_houkou;
void teki_hyouji(void)
{
	count = count + 1;

	if (count > 30) {
		teki_houkou = GetRand(3);
		count = 0;
	}
	//0.5秒ごとにランダムに上下移動するかぼちゃ


	if (teki_houkou == 0) {
		teki_y = teki_y + 3;
	}
	if (teki_houkou == 1) {
		teki_y = teki_y + 3;
	}
	if (teki_houkou == 2) {
		teki_y = teki_y - 3;
	}
	if (teki_houkou == 3) {
		teki_y = teki_y - 3;
	}

	
	if (teki_y > 479) {
		teki_y = 0;
	}
	if (teki_y < 0) {
		teki_y = 479;
	}
	//かぼちゃが画面外に出ないように反対側へ移動

	DrawGra(teki_x, teki_y, teki_handle, TRUE);
	
}

void tekitama_hyouji(void)
{
	int ransuu;
	ransuu = GetRand(4);

	if (tekitama_sonzai == 0) {
		if (ransuu == 4) {
			tekitama_sonzai = 1;
			tekitama_x = teki_x;

			tekitama_y = teki_y;
		}
	}


if (tekitama_sonzai == 1) {
	tekitama_x = tekitama_x - 8;
	
	if (tekitama_x < 0){
		tekitama_sonzai = 0;
	}
	if (tekitama_y < 0) {//ボールが上にいくと下から帰ってくるようにした
		tekitama_y = 439;
		
	}
	DrawGra(tekitama_x, tekitama_y, tekitama_handle, TRUE);
}
}
void atari_hantei_tama_to_teki(void)
{
	if (shouhai != 0) {
		return;
	}

	if (tama_sonzai == 1) {
		if ((tama_x < teki_x + 20) && (tama_x > teki_x -20) && (tama_y < teki_y + 20) && (tama_y > teki_y - 20)) {
			shouhai =  1;
			tama_sonzai = 0;
		}
	}
}

void atari_hantei_jiki_to_teki(void)
{
	if (shouhai != 0) {
		return;
	}

	if ((jiki_x < teki_x + 5) && (jiki_x > teki_x - 5) && (jiki_y < teki_y + 5) && (jiki_y > teki_y - 5)) {
		shouhai =  1;
	}
}

void atari_hantei_jiki_to_tekitama(void)
{
	
	if (shouhai != 0) {
		return;
	}

	if ((tekitama_x < jiki_x + 20) && (tekitama_x > jiki_x - 20) && (tekitama_y < jiki_y + 20) && (
		tekitama_y > jiki_y - 20)) {
		tekitama_sonzai = 0;
		HP = HP + 1;
	}
	if (HP == 3) {
		shouhai = -1;
	}

}


int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC)
{
int key;
int iro_shiro;
int iro_aka;

	
ChangeWindowMode(TRUE);
	DxLib_Init();     
	SetDrawScreen(DX_SCREEN_BACK);

	jiki_handle = LoadGraph("jiki.bmp");
	tama_handle = LoadGraph("tama.bmp");
	teki_handle = LoadGraph("kabocha.bmp");
	tekitama_handle = LoadGraph("tekitama.bmp");
	bakuhatu = LoadGraph("bakuhatu.bmp");
	haikei_hosizora = LoadGraph("hosizora1.bmp");

	iro_shiro = GetColor(255, 255, 255);
	iro_aka = GetColor(255, 0, 0);


	while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0) {
		ClearDrawScreen();
		DrawGra(320, 240, haikei_hosizora, TRUE);

		key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
		jiki_hyouji(key);
		if (key == PAD_INPUT_B) {
			tama_z(key);
		}
	    tama_hyouji(key);
		teki_hyouji();		
		tekitama_hyouji();

		atari_hantei_tama_to_teki();

		if (shouhai == 1) {
			DrawGra(teki_x, teki_y, bakuhatu, TRUE);
			DeleteGraph(teki_handle);
			SetFontSize(64);
			DrawString(100, 200, "You Win!", iro_shiro);
			DeleteGraph(tekitama_handle);
		}
		atari_hantei_jiki_to_teki();
		atari_hantei_jiki_to_tekitama();	
		
		if (shouhai == -1) {
			SetFontSize(64);
			DrawGra(jiki_x, jiki_y, bakuhatu, TRUE);
			DeleteGraph(jiki_handle);
			
			DrawString(100, 200, "Game Over...", iro_aka);
			
		}

		ScreenFlip();
	}
		
		DxLib_End();      
	return 0;              
} 

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

Re: c言語でシューティングを作ってます

#2

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

kob さんが書きました:
2年前

コード:

void atari_hantei_jiki_to_tekitama(void)
{
	
	if (shouhai != 0) {
		return;
	}

	if ((tekitama_x < jiki_x + 20) && (tekitama_x > jiki_x - 20) && (tekitama_y < jiki_y + 20) && (
		tekitama_y > jiki_y - 20)) {
		tekitama_sonzai = 0;
		HP = HP + 1;
	}
	if (HP == 3) {
		shouhai = -1;
	}

}
当たった時に tekitama_sonzai を0にしているものの、
tekitama_sonzai の値にかかわらず当たり判定を行っているため、当たり判定がそのまま残り、
1回しか当たっていないつもりでも(複数フレームで)複数回当たったことになることがありそうです。
tekitama_sonzai が1の時のみ当たり判定を行うようにすると、改善しそうです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

kob

Re: c言語でシューティングを作ってます

#3

投稿記事 by kob » 2年前

当たり判定が大きすぎるから何回もHPが足されてHPがすぐ3になるということはわかりました
。しかし、昨日からいろいろ試してもすぐGAMEOVERになったり、無敵になったりとちょっと難しいです。。。
何か助言はいただけないでしょうか。。。

ひーろー(笑)

Re: c言語でシューティングを作ってます

#4

投稿記事 by ひーろー(笑) » 2年前

当たった弾を消すか無効化したらいいんじゃない?

ひーろー(笑)

Re: c言語でシューティングを作ってます

#5

投稿記事 by ひーろー(笑) » 2年前

当たった弾を消すか無効化したらいいんじゃない?

返信

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