落ちゲーのフラグがうまく機能しません

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

落ちゲーのフラグがうまく機能しません

#1

投稿記事 by けいすけ きさ » 2年前

たびたび失礼します。
現在落ちゲーを作っています。(MAKE 10 落下してくるアイテム(数字1~10)を拾い10を作っていく)
ゲーム自体はほとんど完成しています。
しかし絶対に修正しなければならない点があるのですが、自分ではどうにもできませんでした。
その問題というのが、
落下してくるアイテムが途中で突然消えてしまう。
という致命的なものです。
すべてのアイテムがそうなるわけではないのですが、ゲームのレベルが上がるにつれてそうなるアイテムが増えてきている気がします。
ちなみに、アイテムにはフラグをたてて、1なら存在0なら消滅という風に書いています。
ちなみにレベルが上がると、落ちてくるアイテムが増えていくという仕様になっています。

ゲームメインのコードは以下です。

コード:

#include"gamemain.h"
#include"loading.h"
#include<math.h>

GameState gamestate = GAME_TITLE;

int count;    //カウンタ(メインループ)
int key[STRN];//キー
int sum;      //合計(アイテム)
int point;    //得点
int level;
int Font,Font1;
unsigned int Cr, Cr2;

//初期化
void Init()
{
	sum = 0;
	point = 0;
	basket.x = 320;
	basket.y = 360;
	level = 60;
	count = 0;
	Cr = GetColor(255, 255, 255);
	Cr2 = GetColor(65, 183, 249);
}

//かご描画
void Graph_Basket() {
	DrawGraph(basket.x, basket.y, imghandles.basket, TRUE);
}

//かご移動
void Operate_Basket() {
	if (key[KEY_INPUT_LEFT] > 0)
		basket.x -= 8;
	if (key[KEY_INPUT_RIGHT] > 0)
		basket.x += 8;
	if (basket.x + CHIP * 2 > STAGE_WIDTH)
		basket.x = STAGE_WIDTH - CHIP * 2;
	if (basket.x < (CHIP / 2))
		basket.x = (CHIP / 2);
}

//アイテム登録
void Item_Enter() {
	int n = GetRand((NUM_MAX - 1));              //ランダムでアイテム選択
	item[n].flag = 1;			                //アイテムの存在フラグを立てる
	item[n].cnt = 0;			                //カウンタ初期化
	item[n].speed = 4;			                //発射スピードを4に
	item[n].angle = PI / 2;		                //角度は真下である90°
	item[n].x = GetRand((STAGE_WIDTH - 20));	    //x座標は0~620のランダムな値
	item[n].y = 0;				                //y座標は0
}

//i番のアイテムがかごの中にあるか
//1:ある 0:ない
int Item_Basket_Exit(int i) {
	//もしカゴの中にあれば
	if (basket.x - 10 < item[i].x && item[i].x < basket.x + 84 && basket.y - 10 < item[i].y&&item[i].y < basket.y + 60) {
		PlaySoundMem(sndhandles.hit, DX_PLAYTYPE_BACK);
		sum += (i + 1);
		Draw_Score();
		return 1;
	}
	return 0;
}

//i番の弾幕が画面内にあるか
//1:画面外 0:画面内
int Item_Feeld_Exit(int i) {
	//もし画面の中になければ
	if (!(26 <= item[i].x && item[i].x <= 630 && 0 <= item[i].y && item[i].y <= 450))
		return 1;
	return 0;
}

//軌道(アイテム)計算
void Item_calc() {
	int i;
	if (count % level == 0)//levelカウントに一回(モニタが60Hz、60カウントは1秒)
		Item_Enter();
	for (i = 0; i < NUM_MAX; i++) {
		if (item[i].flag == 1) {
			item[i].x += cos(item[i].angle) * item[i].speed;//x成分計算
			item[i].y += sin(item[i].angle) * item[i].speed;//y成分計算
			if (Item_Basket_Exit(i) == 1)//かごの中にあるか?
				item[i].flag = 0;//弾を消す
			if (Item_Feeld_Exit(i) == 1)//画面の中にあるか?
				item[i].flag = 0;//弾を消す
		}
	}
}

//アイテムの描画
void Graph_Item() {
	int i;
	for (i = 0; i < 500; i++) {
		if (item[i].flag > 0) {
			DrawRotaGraphF(item[i].x, item[i].y, 1.0f, item[i].angle - PI / 2, imghandles.item[i], TRUE);
			//+PI/2は弾の向きを合わせるため
		}
	}
}


//
void Draw_Score() {
	point++;
	if (sum == 10) {
		point += 10;
		sum = 0;
		if (level > 20)
			level -= 10;
	}
	else if (sum > 10)
	{
		gamestate = GAME_OVER;
	}
}


//各表示
void Draw_Display() {
	DrawFormatStringToHandle(25, 30, Cr, Font, "%d", sum);
	DrawFormatStringToHandle(480, 30, Cr2, Font, "%d", point);
}

//ゲームメイン関数
void DrawGameMain() {
	Operate_Basket();
	Item_calc();
	Graph_Basket();
	Graph_Item();
	Draw_Display();
}

//ゲームタイトル描画
void DrawGameTitle() {
	DrawGraph(0, 0, imghandles.title, FALSE);
	Init();
	if (CheckHitKey(KEY_INPUT_RETURN) == 1) {
		gamestate = GAME_MAIN;
	}
}

//ゲームオーバー描画
void DrawGameOver() {
	DrawGraph(0, 0, imghandles.gameover, FALSE);
	DrawFormatStringToHandle(260, 200, Cr2, Font1, "%d", point);
	if (CheckHitKey(KEY_INPUT_SPACE) == 1) {
		gamestate = GAME_TITLE;
	}
}

//キーがどれ位押されたかを判定する関数
int GetHitKeyStateAll_2(int KeyStateBuf[]) {
	char GetHitKeyStateAll_key[256];
	GetHitKeyStateAll(GetHitKeyStateAll_key);
	for (int i = 0; i < 256; i++) {
		if (GetHitKeyStateAll_key[i] == 1) KeyStateBuf[i]++;
		else                            KeyStateBuf[i] = 0;
	}
	return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	//ウィンドウモードにする
	ChangeWindowMode(TRUE);
	//ウィンドウサイズを変更する
	SetGraphMode(640, 480, 32);
	SetBackgroundColor(255, 255, 255);
	if (DxLib_Init() == -1 || SetDrawScreen(DX_SCREEN_BACK) != 0) return -1;//初期化と裏画面化
	Load();
	PlaySoundMem(sndhandles.back, DX_PLAYTYPE_LOOP);
	Init();
	Font = CreateFontToHandle("游ゴシック", 60, 6, DX_FONTTYPE_ANTIALIASING);
	Font1 = CreateFontToHandle("游ゴシック", 72, 6, DX_FONTTYPE_ANTIALIASING);
	while (ProcessMessage() == 0 && ClearDrawScreen() == 0 && GetHitKeyStateAll_2(key) == 0 && key[KEY_INPUT_ESCAPE] == 0) {
		ClearDrawScreen();
		switch (gamestate)
		{
		case GAME_TITLE:
			DrawGameTitle();
			break;
		case GAME_MAIN:
			    DrawGraph(4,8,imghandles.boad,FALSE) ;    // 四角形を描画
			DrawGameMain();
			count++;
			break;
		case GAME_OVER:
			DrawGameOver();
			break;
		default:
			break;
		}
		ScreenFlip();
	}
	DxLib_End();
	return 0;
}
ちなみにビルドすると 

コード:

1>  gamemain.cpp
1>c:\users\keisuke\documents\visual studio 2015\projects\....\gamemain.cpp(100): warning C4244: '引数': 'double' から 'float' への変換です。データが失われる可能性があります。
という警告が出てきますが、問題なくデバックできます。この警告も何か関係しているのでしょうか.
使用しているパソコンは今年の1月に購入しました。モニタが60HZ ではないという可能性もありますでしょうか。CPUはcore i7 6500U だった気がします。

アバター
usao
記事: 1565
登録日時: 6年前

Re: 落ちゲーのフラグがうまく機能しません

#2

投稿記事 by usao » 2年前

とりあえずコードをぱっと見で思ったことですが,
Item_Enter()という関数は,問答無用で現在のデータを書きかえてしまうように見えます.
乱数で決定しているnが既存のアイテムの番号であった場合に,問題の現象が起こるのではないでしょうか.

アバター
にこよん
記事: 112
登録日時: 2年前
住所: 大阪府
連絡を取る:

Re: 落ちゲーのフラグがうまく機能しません

#3

投稿記事 by にこよん » 2年前

存在しない配列に数を代入しているのではないでしょうか?

コード:

//例えばですが
int a[10];
a[15]=1;
//みたいな
私はよくこれでゲーム内の何かが消えるバグを起こしてしまいます。
最近は東方風アクションゲームを少しずつ作ってる人です
東方翠風燐FreeDownload⇒http://dxlib.o.oo7.jp/cgi/patio/read.cgi?no=212

けいすけ きさ

Re: 落ちゲーのフラグがうまく機能しません

#4

投稿記事 by けいすけ きさ » 2年前

usao さんが書きました:とりあえずコードをぱっと見で思ったことですが,
Item_Enter()という関数は,問答無用で現在のデータを書きかえてしまうように見えます.
乱数で決定しているnが既存のアイテムの番号であった場合に,問題の現象が起こるのではないでしょうか.
次の関数をつくるとうまくいきました!指摘ありがとうございます。

コード:

//空いている弾情報格納要素番号を返す
int Item_Serch() {
	int i;
	i = GetRand((NUM_MAX - 1));
	if (item[i].flag == 1) {
		for (int k = 0; k < NUM_MAX; k++) {
			if (item[k].flag == 0)
				return k;
		}
	}
	else {
		return i;
	}
	return -1;
}

返信

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