マップデータの読み込み

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

マップデータの読み込み

#1

投稿記事 by megaman » 10年前

こんにちは、自分が思っていた以上にここへ早く戻ってきてしまいました。またお世話になります。
変わらず「14歳からはじめるc言語わくわくゲームプログラミング教室」とにらめっこしています。
その中にマップデータをtxtファイルから読み取る章があるのですが、そのソースが数字の1ケタしか読み取れない仕様なので
困っています。調べてみるとstrtolがよくヒットするのですが、どうソースに組み込むかわかりません。
理想はアルファベット小文字「a~f」大文字「A~F」をtxtファイルから読み取ることです。
gamemain.h

コード:

#ifndef __GAMEMAIN_H__ 
#define __GAMEMAIN_H__

#include <DxLib.h>
#include "main.h"

#define IMG_CHIPSIZE 25
#define MAP_WIDTH 500
#define SHOW_WIDTH 16
#define MAP_HEIGHT 15
#define MOVERATE 5

extern char g_mapdata[MAP_HEIGHT][MAP_WIDTH];

struct StageData{
 	int movecounter;
	int scroll_x;
	int stage_width;
};
extern StageData g_stagedata;

void GameMain();
void DrawMap();
void InitStage();

#endif
gamemain.cpp

コード:

#include "gamemain.h"

char g_mapdata[MAP_HEIGHT][MAP_WIDTH];
StageData g_stagedata;

//ステージ初期化
void InitStage(){
	int fh = FileRead_open("media\\mapdata2.txt");
	for (int y = 0; y < MAP_HEIGHT; y++){
		FileRead_gets(g_mapdata[y], 256, fh);
	}
	FileRead_close(fh);
	//マップの長さを調べる
	g_stagedata.stage_width = strlen(g_mapdata[0]);
	if (g_stagedata.scroll_x >= g_stagedata.stage_width - SHOW_WIDTH){
		g_stagedata.scroll_x = g_stagedata.stage_width - SHOW_WIDTH;
	}
}


void GameMain(){
	//移動制限
	g_stagedata.movecounter++;
	g_stagedata.movecounter %= MOVERATE;

	DrawMap();
	//スクロール移動
	int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
	if (g_stagedata.movecounter == 0){
		int sx = g_stagedata.scroll_x;
		if (key & PAD_INPUT_LEFT)	sx -= 1;
		if (key & PAD_INPUT_RIGHT)	sx += 1;
		//範囲チェック
		if (sx < 0) sx = 0;
		if (sx > g_stagedata.stage_width - SHOW_WIDTH) {
			sx = g_stagedata.stage_width - SHOW_WIDTH;
		}
		g_stagedata.scroll_x = sx;
	}
	//Zキーをチェックしてリロード
	if (IsAKeyTrigger(key) == TRUE) {
		InitStage();
	}
}


void DrawMap(){
	for (int y = 0; y < MAP_HEIGHT; y++){
		for (int x = 0; x < SHOW_WIDTH; x++){
			int c = g_mapdata[y][g_stagedata.scroll_x + x] - '0';
			DrawRotaGraph2(x*IMG_CHIPSIZE, y*IMG_CHIPSIZE, 0, 0, 0.5, 0,
				g_imghandles.mapitems[c], TRUE, FALSE);
		}
	}
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: マップデータの読み込み

#2

投稿記事 by softya(ソフト屋) » 10年前

データ形式が不明ですが、言語がc++で区切りがカンマ(,)ならfstreamを使うのもひとつの方法では無いでしょうか?
「fstream csv」で探せば例が幾つか見つかるはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ろん
記事: 18
登録日時: 14年前

Re: マップデータの読み込み

#3

投稿記事 by ろん » 10年前

0~9、アルファベット大文字・小文字の62種類の文字データで構成されたマップデータを連続した添え字で管理したいという事ですよね?
g_imghandles.mapitems[c]に添え字0~61に対応した画像があれば下記のようにDrawMapの中身を変更して動くはずです。

コード:

void DrawMap(){
	for (int y = 0; y < MAP_HEIGHT; y++){
		for (int x = 0; x < SHOW_WIDTH; x++){
			if (48 <= g_mapdata[y][g_stagedata.scroll_x + x] && g_mapdata[y][g_stagedata.scroll_x + x] <= 57){
				int c = g_mapdata[y][g_stagedata.scroll_x + x] - '0';
			}
			if (65 <= g_mapdata[y][g_stagedata.scroll_x + x] && g_mapdata[y][g_stagedata.scroll_x + x] <= 90){
				//大文字AからZを添え字10から35へ変換
				int c = g_mapdata[y][g_stagedata.scroll_x + x] - 55;
			}
			if (97 <= g_mapdata[y][g_stagedata.scroll_x + x] && g_mapdata[y][g_stagedata.scroll_x + x] <= 122){
				//子文字aからzを添え字36から61へ変換
				int c = g_mapdata[y][g_stagedata.scroll_x + x] - 61;
			}
			DrawRotaGraph2(x*IMG_CHIPSIZE, y*IMG_CHIPSIZE, 0, 0, 0.5, 0,
				g_imghandles.mapitems[c], TRUE, FALSE);
		}
	}
}

megaman

Re: マップデータの読み込み

#4

投稿記事 by megaman » 10年前

返信が遅くなって申し訳ありません。
>softya(ソフト屋)さん
csvファイル調べてみました、なるほど文字列をそのまま読み込めるようですね。
一度、今のtxtファイルと比較してどちらが自分に合っているか試すことにします。

>ろんさん
ソースまで貼っていただきありがとうございます。ですが引用すると「識別子 cが定義されていません」
と出てきてしまいました。これは変数の持ち方が悪いのでしょうか?
画像読み込みのソースを貼っておきます。
loading.h

コード:

#ifndef __LOADING_H__
#define __LOADING_H__

#include <DxLib.h>

struct ImageHandles{
	int hero;
	int mapitems[20];	//マップ上のアイテム
	int knife;
	int bullet;
};
extern ImageHandles g_imghandles;

BOOL LoadGameImage();

#endif
loading.cpp

コード:

#include "loading.h"

ImageHandles g_imghandles;

BOOL LoadGameImage(){
	int buf[20];
	if (LoadDivGraph("media\\smp2_chara01.png", 2, 2, 1, 50, 50, buf) == -1) return FALSE;
	g_imghandles.hero = buf[0];
	if (g_imghandles.hero == -1) return FALSE;

	g_imghandles.mapitems[1] = LoadGraph("media\\test\\metroid\\block01.png");
	if (g_imghandles.mapitems[1] == -1) return FALSE;

	g_imghandles.mapitems[2] = LoadGraph("media\\test\\metroid\\block02.png");
	if (g_imghandles.mapitems[2] == -1) return FALSE;

	g_imghandles.mapitems[3] = LoadGraph("media\\test\\metroid\\block03.png");
	if (g_imghandles.mapitems[3] == -1) return FALSE;

	g_imghandles.mapitems[4] = LoadGraph("media\\test\\metroid\\block04.png");
	if (g_imghandles.mapitems[4] == -1) return FALSE;

	g_imghandles.mapitems[5] = LoadGraph("media\\test\\metroid\\block05.png");
	if (g_imghandles.mapitems[5] == -1) return FALSE;

	g_imghandles.mapitems[6] = LoadGraph("media\\test\\metroid\\block06.png");
	if (g_imghandles.mapitems[6] == -1) return FALSE;

	g_imghandles.mapitems[7] = LoadGraph("media\\test\\metroid\\block07.png");
	if (g_imghandles.mapitems[7] == -1) return FALSE;

	g_imghandles.mapitems[8] = LoadGraph("media\\test\\metroid\\block08.png");
	if (g_imghandles.mapitems[8] == -1) return FALSE;

	g_imghandles.mapitems[9] = LoadGraph("media\\test\\metroid\\block09.png");
	if (g_imghandles.mapitems[9] == -1) return FALSE;

	g_imghandles.mapitems[10] = LoadGraph("media\\test\\metroid\\block10.png");
	if (g_imghandles.mapitems[10] == -1) return FALSE;

	g_imghandles.knife = LoadGraph("media\\smp2_knife.png");
	if (g_imghandles.knife == -1) return FALSE;
	g_imghandles.bullet = LoadGraph("media\\smp2_bullet.png");
	if (g_imghandles.bullet == -1) return FALSE;


	return TRUE;
}


ろん
記事: 18
登録日時: 14年前

Re: マップデータの読み込み

#5

投稿記事 by ろん » 10年前

すみません、えらい間違いしてました。
int cを別の所で宣言してると勘違いしてました。頭にintついてるのに恥ずかしい限りです。

コード:

void DrawMap(){
    for (int y = 0; y < MAP_HEIGHT; y++){
        for (int x = 0; x < SHOW_WIDTH; x++){
            int c = 0;
            if (48 <= g_mapdata[y][g_stagedata.scroll_x + x] && g_mapdata[y][g_stagedata.scroll_x + x] <= 57){
                c = g_mapdata[y][g_stagedata.scroll_x + x] - '0';
            }
            if (65 <= g_mapdata[y][g_stagedata.scroll_x + x] && g_mapdata[y][g_stagedata.scroll_x + x] <= 90){
                //大文字AからZを添え字10から35へ変換
                c = g_mapdata[y][g_stagedata.scroll_x + x] - 55;
            }
            if (97 <= g_mapdata[y][g_stagedata.scroll_x + x] && g_mapdata[y][g_stagedata.scroll_x + x] <= 122){
                //子文字aからzを添え字36から61へ変換
                c = g_mapdata[y][g_stagedata.scroll_x + x] - 61;
            }
            DrawRotaGraph2(x*IMG_CHIPSIZE, y*IMG_CHIPSIZE, 0, 0, 0.5, 0,
                g_imghandles.mapitems[c], TRUE, FALSE);
        }
    }
}

megaman

Re: マップデータの読み込み

#6

投稿記事 by megaman » 10年前

>ろんさん
そのソースを使ってみましたが、やはり小文字に対応してくれません。
画像読み込みのソース以外のソースも貼ったほうがいいでしょうか?
お手数をお掛けして、申し訳ありません。

閉鎖

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