txtデータを読み込んでMAPデータとして使いたいのですが

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

txtデータを読み込んでMAPデータとして使いたいのですが

#1

投稿記事 by aiku » 14年前

txtデータを読んでMAPデータとして使いたいのですが上手くいきません。
ビルドは成功するのですが実行すると停止してしまします。
VS2008を使ってます。

main.cpp

コード:

#include "DxLib.h"
#include "Stage.h"
#include <iostream>
using namespace std;
char KeyBuf[ 256 ];
 

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
     ChangeWindowMode( TRUE ) ;                                  //ウィンドウモードに変更
        if( DxLib_Init() == -1 ) return -1;                      // DXライブラリ初期化処理 エラーが起きたら終了
        SetDrawScreen( DX_SCREEN_BACK ) ;                        // 描画先を裏画面に設定
           
        while( 1 ){
                ClearDrawScreen();                               // 裏画面のデータを全て削除
                GetHitKeyStateAll( KeyBuf ) ; 

				Stage stage;
				stage.StageInput();
				stage.StageRead();
				stage.Stagedorw();

                if( ProcessMessage() == -1 ) break ;             //エラーが起きたら終了
                
                ScreenFlip() ;                                   // 裏画面データを表画面へ反映
        }
 
        DxLib_End() ;                                            // DXライブラリ使用の終了処理
        return 0 ;                                               // ソフトの終了
}
Stage.h

コード:

class Stage{
public:
	enum Object{
		OBJ_A,
		OBJ_B,
		//OBJ_E,

		OBJ_UNKNOWN,
	};

private:
	int fileSize,mWidth,mHeight;
	char* fileImage;
	Object* state;
	
public:
	void StageInput();
	Object* StageRead();
	void Stagedorw();
};
Stage.cpp

コード:

#include <fstream>
#include "DxLib.h"
#include "Stage.h"
using namespace std;

void Stage::StageInput(){
	char* stage = "stageData2.txt";
	ifstream inputFile(stage, ifstream::binary);			//MAPDATA読み込み
	inputFile.seekg(0,ifstream::end);						
	fileSize = static_cast<int>(inputFile.tellg());			//txtの文字数を入れる
	inputFile.seekg(0,ifstream::beg);
	fileImage = new char [fileSize];						//文字数分の配列を作る
	inputFile.read(fileImage,fileSize);						//配列に書き出し
}


Stage::Object* Stage::StageRead(){
	mWidth = mHeight = 0; //初期化
	int d = 0;
	int f = 0;
	for ( int i = 0; i < fileSize; ++i ){
		switch ( fileImage[ i ] ){
			case '1': case '0':								//読み取ったtxtデータの縦横の最大値を取る
				++d;
				break;
			case '\n': 
				++f;
				//最大値更新
				mWidth = max( mWidth, d );
				mHeight = max( mHeight, f );
				d = 0; 
				break;
		}
	}

	state = new Object[mWidth * mHeight];
	int x = 0;
	int y = 0;
	for ( int i = 0; i < fileSize; ++i){
		Object t;	
		switch ( fileImage[ i ] ){
			case '1': t = OBJ_A; break;						//列挙型に変換
			case '0': t = OBJ_B; break;

			case '\n': x = 0; ++y; t = OBJ_UNKNOWN; break;  //改行処理
			default: t = OBJ_UNKNOWN; break;
		}
		if ( t != OBJ_UNKNOWN ){							//知らない文字なら無視
			state[y*mWidth+x] = t;
			++x;
		}
	}
	return state;											//今は使っていない
}

void Stage::Stagedorw(){									//描画
		for ( int y = 0; y < mHeight; ++y ){
		for ( int x = 0; x < mWidth; ++x ){
			Object o = state[y*mWidth+x];
			switch (o){
				case OBJ_A:DrawBox(x*32,y*32,(x+1)*32,(y+1)*32,GetColor(255,255,255),TRUE); break;
				case OBJ_B:DrawBox(x*32,y*32,(x+1)*32,(y+1)*32,GetColor(  0,255,255),TRUE); break;
				default: break;
			}
			
		}
	}

}

読み込んでいるtxtは"stageData2.txt"という名前で、半角数字1と0と改行のみです。
11111
10001
10001
10001
10001
11111
こんなかんじです。 改行コードはCR+LFです。

state[y*mWidth+x] = t;
ここをコメントアウトすれば停止しないのですが・・・
全く分からないのでご指導お願いします・・・。

aiku

Re: txtデータを読み込んでMAPデータとして使いたいのですが

#2

投稿記事 by aiku » 14年前

すいません。txtの最後を改行すれば停止しなくなりました。
お騒がせしました・・・。

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

Re: txtデータを読み込んでMAPデータとして使いたいのですが

#3

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

毎フレームnewして読み込んでいるのでメモリ消費がどんどん伸びていくのでまずいと思います。
その他にも気になるところが多数ありますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

aiku

Re: txtデータを読み込んでMAPデータとして使いたいのですが

#4

投稿記事 by aiku » 14年前

返信有難うございます。
まだ勉強し始めている最中で、参考書を見ながら自分なりに書いています。
正直自分ではおかしい部分は分からないので教えていただけると幸いです。

とりあえずnewした配列をdeleteすることですよね。

コード:

void Stage::Stagedorw(){									//描画
		for ( int y = 0; y < mHeight; ++y ){
		for ( int x = 0; x < mWidth; ++x ){
			Object o = state[y*mWidth+x];
			switch (o){
				case OBJ_A://DrawFormatString(x,y, GetColor(255,255,255),"A");x+=20; break;
						 DrawBox(x*32,y*32,(x+1)*32,(y+1)*32,GetColor(255,255,255),TRUE); break;
				case OBJ_B://DrawFormatString(x,y, GetColor(255,255,255),"B");x+=20; break;
						 DrawBox(x*32,y*32,(x+1)*32,(y+1)*32,GetColor(  0,255,255),TRUE); break;
				default: break;
			}
			
		}
	}
	delete[] state;
	delete[] fileImage;
}
書くのはこの場所であってますでしょうか・・・。

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

Re: txtデータを読み込んでMAPデータとして使いたいのですが

#5

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

気になった点を書かせてもらいますね。
・StageInput()とStageRead()のメソッドに分ける意味はないと思うので1つにまとめてください。
 fileImageやらfileSizeをローカル変数にできるのでクラスのメンバ変数が整理できます。
 関数の最後でfileImageの解放をお忘れなく。
・毎フレーム読み込む必要はありません。インスタンスの生成から読み込みはwhileループの外に追いだしてください。
 毎フレーム呼び出すにはStagedorw(→Stagedraw)だけです。
・stateの解放はデストラクタで行ってください。
・caseの後ろに色々書き過ぎなのでcaseの後ろが1つ以上の命令文なら改行した方が可読性が高くなります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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