マップデータ停止?

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

マップデータ停止?

#1

投稿記事 by Qloeh » 9年前

度々すみません。
シーン管理の方法を替えてみました。それでもマップが出なかったので少しいじってみると、ビルドは正常にされるのですが、遷移時にプログラムが停止するようになりました。
多分メイン関数にはりつけても同じだとは思います。
以下がコードです。

コード:

#pragma once


#define STR_MAX 256
//グローバール
extern int g_lasttime;
extern int g_frametime;
typedef enum {
	GAME_TITLE, GAME_MAP, GAME_END, GAME_OVER
}GameScene;
extern int g_titleimg;
extern float g_hx;
extern float g_hy;
extern char key[256];
void DrawGameTitle();
void DrawGameMap();
void DrawGameEnd();
void DrawGameOver();

void SceneMgr_Update();
void SceneMgr_Draw();

void SceneMgr_ChangeScene(GameScene nextScene);

コード:


#include"Common.h"


//グローバール
int g_lasttime = 0;
 int g_frametime = 0;
  static GameScene g_gamestate= GAME_TITLE;
 int g_titleimg;
 float g_hx, g_hy = 0;


// プログラムは WinMain から始まります
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	ChangeWindowMode(TRUE);
	SetDrawScreen(DX_SCREEN_BACK);
	if (DxLib_Init() == -1)		// DXライブラリ初期化処理
	{
		return -1;			// エラーが起きたら直ちに終了
	}
//いまのところの変数
	g_titleimg = LoadGraph("Title\\Title.png");
	char key[256];
	while (ScreenFlip() == 0 && ProcessMessage() == 0 && GetHitKeyStateAll(key) == 0){

		ClearDrawScreen();
		SceneMgr_Update();
		SceneMgr_Draw();
		ScreenFlip();
		WaitKey();				// キー入力待ち
		if (key[KEY_INPUT_ESCAPE] == 1){
			DxLib_End();				// DXライブラリ使用の終了処理

			return 0;				// 
		}
	}
}

void SceneMgr_Update(){
	switch (g_gamestate){
	case GAME_TITLE:
		Title_Update();
		break;
	case GAME_MAP:
		Map_Update();
		break;
	}
}
void SceneMgr_Draw(){
	switch (g_gamestate){
	case GAME_TITLE:
			Title_Draw();
			break;
	case GAME_MAP:
		Map_Draw();
		break;
	}
}

void SceneMgr_ChangeScene(GameScene NextScene){
	g_gamestate = NextScene;
}

コード:

#pragma once





#define MAP_LISTROOT "Map\\map.txt"
#define MAP_ROOT "Map\\"
#define MAP_DATAROOT "\\data.txt"
#define MAP_IMAGEROOT "\\image.txt"

#define MAP_GRAPH "\\chip.png"
#define MAP_LIST_MAX 10
#define MAP_CHIP_NUM_X 20
#define MAP_CHIP_NUM_Y 15
#define MAP_CHIP_RAYER 4
#define MAP_CHIP_MAX 1024
#define MAP_CHIP_X_MAX 192
#define MAP_CHIP_Y_MAX 192
#define MAP_RAYER 4
#define STR_MAX 256
#define SCROLL_MAX_X 40
#define SCROLL_MAX_Y 30

struct MapData{
	int size_x;//マップのサイズX
	int size_y;//マップのサイズY
	int num;
	int num_x;
	int num_y;
	int mapchip[MAP_CHIP_MAX];
	int mapdata[MAP_CHIP_RAYER][MAP_CHIP_Y_MAX][MAP_CHIP_X_MAX];
};
struct MapPlug{
	char name[STR_MAX];
};
struct MapField{
	int back;
	int graphic;

	
};



struct MapObject{
	int field;
	int wall;
	int obg;
	int item;
};

struct MAP{
	MapData data;
	MapField field;
	MapPlug plug;
	MapObject object;
};

struct MAP_LIST{
	 char list[MAP_LIST_MAX][STR_MAX];
	 int num;
	 int map_id;
};

extern MAP_LIST maplist;

bool LoadMapList();
bool LoasMapData();
bool LoadMapFieldData();
bool LoadMapGraph();
void DrawMap(int no,bool flag);
void Map_Update();
void Map_Draw();

コード:

#include"Common.h"
MAP map;
MAP_LIST maplist;

int LoadListFile(const char*name, char list[][STR_MAX], int max);
//ファイルのパス読み込み
bool LoadMapList(){
	if ((maplist.num = LoadListFile(MAP_LISTROOT, maplist.list, MAP_LIST_MAX)) == -1){
		MB("MapList Cannot Open");
		return false;
	}
	return true;
}

bool LoadMapData(){
	int fh = 0;
	char pass[STR_MAX] = { NULL };
	char str[STR_MAX] = { NULL };
	char* a;
	sprintf_s(pass, "%s%s%s", MAP_ROOT, maplist.list[maplist.map_id], MAP_DATAROOT);
	if ((fh = FileRead_open(pass)) == 0){
		MB("MapData Cannot Open");
		return false;
	}
	FileRead_gets(str, STR_MAX, fh);
	strcpy_s(map.plug.name, sizeof(map.plug.name), strtok_s(str, PERIOD, &a));
	if (FileRead_close(fh) == -1){
		MB("MapData Cannot Close");
		return false;
	}
	return true;
}

bool LoadMapFieldData(){
	int fh = 0;
	char pass[STR_MAX] = { NULL };
	char buf[256];
	sprintf_s(pass, "%s%s%s", MAP_ROOT, maplist.list[maplist.map_id], MAP_IMAGEROOT);
	if ((fh = FileRead_open(pass)) == 0){
		MB("MapImage Cannot Open");
		return false;
	}
	for (int i = 0; i < 1; i++){
		if (FileRead_gets(&buf[i], sizeof(BYTE), fh) == -1){
			MB("MapChip Image Cannot Read");
			FileRead_close(fh);
			return false;
		}
		map.data.size_x = buf[i] - '0';
	}
	for (int i = 0; i < 1; i++){
		if (FileRead_gets(&buf[i], sizeof(BYTE), fh) == -1){
			MB("MapChip Image Cannot Read");
			FileRead_close(fh);
			return false;
		}
		map.data.size_y = buf[i] - '0';
	}
	for (int i = 0; i < 1; i++){
		if (FileRead_gets(&buf[i], sizeof(BYTE), fh) == -1){
			MB("MapChip Image Cannot Read");
			FileRead_close(fh);
			return false;
		}
		map.data.num_x = buf[i] - '0';
	}
	for (int i = 0; i < 1; i++){
		if (FileRead_gets(&buf[i], sizeof(BYTE), fh) == -1){
			MB("MapChip Image Cannot Read");
			FileRead_close(fh);
			return false;
		}
		map.data.num_y = buf[i] - '0';
	}
	FileRead_seek(fh, 8, SEEK_SET);
	for (int k = 0; k < 4; k++){
		for (int i = 0; i < map.data.num_y; i++){

			for (int j = 0; j < map.data.num_x; j++){

				for (int l = 0; l < 1; l++){
					if (FileRead_gets(&buf[l], sizeof(BYTE), fh) == -1){
						MB("MapImage Cannot Read");
						FileRead_close(fh);
						return false;
					}

				}
				map.data.mapdata[k][i][j] = buf[i]-'0';
			}
		}
	}
	if (FileRead_close(fh) == -1){
		MB("MapImage Cannot Close");
		return false;
	}
	return true;
}

bool LoadMapGraph(){
	char pass[STR_MAX] = { NULL };
	sprintf_s(pass, "%s%s%s", MAP_ROOT, maplist.list[maplist.map_id], MAP_GRAPH);
	if ((map.data.num = LoadDivImageFile(pass, map.data.mapchip, map.data.size_x, map.data.size_y)) == -1){
		MB("MapChip Cannot Read");
		return false;
	}
	
	return true;
}

void DrawMap(int no ,bool flag){
	for (int i = 0; i <(WINDOW_HEIGHT/map.data.size_y); i++){
		for (int j = 0; j <( WINDOW_WIDTH/map.data.size_x); j++){
			DrawGraph((j * map.data.size_x), (i * map.data.size_y), map.data.mapchip[map.data.mapdata[no][i][j]],flag);
		}
	}
}

void Map_Draw(){
	DrawMap(0,false);
}

void Map_Update(){

}

コード:

#pragma once




void Title_Update();

void Title_Draw();

コード:

#include"Common.h"

void Title_Update(){
	if (CheckHitKey(KEY_INPUT_Z) != 0){
		SceneMgr_ChangeScene(GAME_MAP);
	}
}
void Title_Draw(){
	DrawBox(0, 0, 640, 480, GetColor(255, 255, 255), true);
	DrawGraph(0, 0, g_titleimg, false);

}
追加ですが、テキストファイルの書き方を誤っているという可能性もあるので、マップデータ読み込み用のものを載せておきます。使用文字はマルチバイトです。

コード:

32,32,20,15/
0000000001000000000/
0000000001000000000/
0000000001000000000/
0000000001000000000/
0000000001000000000/
0000000001000000000/
0000000001000000000/
0000000001000000000/
0000000001000000000/
0000000001000000000/
0000000001000000000/
0000000001000000000/
0000000001000000000/
0000000001000000000/
0000000001000000000/
お暇でしたら解答よろしくおねがいします

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

Re: マップデータ停止?

#2

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

コンパイルして実験してみようと思いましたが、ファイル名が載っていなくてわかりにくい上、DxLib.hをインクルードしている場所が無いので足りないファイルがある気がします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: マップデータ停止?

#3

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

提示されたファイルは上からhead1.h、src1.cpp、head2.h、src2.cpp、head3.h、src3.cpp、map.txtに保存し、適当に作成した以下のファイルを追加してVC2008でコンパイルしてみました。

Common.h

コード:

#include <DxLib.h>

#include "head1.h"
#include "head2.h"
#include "head3.h"

#define MB(a)
#define PERIOD "."
#define LoadDivImageFile 0*(int)
#define WINDOW_HEIGHT 480
#define WINDOW_WIDTH 640
LoadListFile.cpp

コード:

#include "Common.h"

int LoadListFile(const char*name, char list[][STR_MAX], int max) {
	(void)name;
	(void)list;
	(void)max;
	return 0;
}
実行し、Zキーを押すとゼロ除算で強制終了しました。
明示的に初期化されていないグローバル変数であるため0となっているmap.data.size_yを割る数として割り算をしたのが原因ですね。
前回も指摘した通り、
マップを描画しようとする前にマップの読み込み処理を呼び出してください。

オフトピック
ちなみに、sprintf_sは第一引数に配列を渡すのであれば、その要素数を別の引数で渡す必要は無いようですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Qloeh
記事: 35
登録日時: 10年前

Re: マップデータ停止?

#4

投稿記事 by Qloeh » 9年前

それは初期化が必要という事でしょうか?それともメインで処理する関数の中で読み込み処理を呼び出すという事でしょうか?後者の方だと思いますが……理解力がなくてすみません。とりあえずやってみます。結果の報告は後ほどいたします

Qloeh
記事: 35
登録日時: 10年前

Re: マップデータ停止?

#5

投稿記事 by Qloeh » 9年前

defineの場所を替えると上手くいきました。ありがとうございます。
次は読み込みと初期化に挑戦してみます

閉鎖

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