トップページ > 記事閲覧
ファイルを読み込むには
名前:Tomo 日時: 2025/06/09 04:24

こんばんわ、お世話になっております。 ファイルの読み込み書き込みについて質問をさせていただきます。 自分はSTGを作成しているのですがそこで敵の出現時に持たせるclassのメンバ変数を現在はハードコーディングで引数に必要な情報を全部含む関数で入力しているのですが、 これだと敵の出現数が増えたり敵に持たせるメンバ変数の数が変化すると対応が難しいです。 そのため敵の持つ情報を外部ファイルから読み込んでメンバへ数に入力をしたいと考えています。 そこでどの種類のファイルを使って読み込みを行えばよいのか質問をさせていただきます。 【開発環境】 ・言語:C++ ・ライブラリ:DxLib (Visual Studio 2022) ・対象:Windows ## やりたいこと STG のステージ内で出現する敵のパラメータ(座標/移動パターン/画像ID/弾パターン/弾発射間隔など)を、 ソースコード内のハードコーディングではなく、外部ファイルから読み込んで管理したいと考えています。 ## 現状の実装 - `Enemy_setup(double x, double y, int pattern, int image, int shot_pattern, int shot_count)` の引数で全情報を渡している - 敵が増える/パラメータが増えるたびに関数定義を更新する必要があり、拡張性に乏しい ## 想定フォーマット例(CSV) x,y,pattern,image,shot_pattern,shot_count 100,100,0,enemy_00,0,60 500,100,1,enemy_00,2,180 ・質問 1.読み込みに適切なファイルはどれがよいのか(txt,csv,dat)。 2.もしあればそのファイルを使用するうえで便利な関数やライブラリ、拡張機能 以下現在のコード ///////////////////////////////// Enemy.h ///////////////////////////////// #ifndef DEF_ENEMY //二重include防止 #define DEF_ENEMY #define PI 3.14159265358979 #define PI2 (PI*2) #define ENEMY 50//敵1の数 #include"Size.h" #include "DxLib.h" #include"Material.h" class enemy_c { private: double x, y;//座標 int pattern;//移動用パターン bool flag = false;//出現フラグ int image;//画像 int hp;//hp int count = 0;//カウント(出現時からカウントし始める) double angle = 0;//角度(向いてる向きもこれで計算させる) int shot_count = 0;//ショット開始タイミング int shot_pattern;//ショットパターン int out_count;//外出たときカウント public: //bool shot_flag = false;//これがTRUEの時はenemy_shot_patternを処理し続ける void enemy_initialize();//初期化用 void enemy_set(double _x, double _y, int _pattern, int _image,int _shot_pattern,int _shot_count);//セットアップ用 void enemy_update(double _x, double _y, double _angle); void enemy_draw() { DrawRotaGraph(x, y, 1.0,PI, image, TRUE, FALSE); } 省略 }; void Enemy_initialize(); int Enemy_search(); void Enemy_setup(double __x, double __y, int __pattern, int __image,int __shot_pattern,int __shot_count); void Enemy_update(); void Enemy_draw(); extern enemy_c enemy[ENEMY]; #endif ///////////////////////////////// Enemy.cpp ///////////////////////////////// #include "DxLib.h" #include "Enemy.h" #include "Enemy_Pattern.h" #include"Size.h" #include"Enemy_Shot.h" #include"Material.h" #include"Item.h" enemy_c enemy[ENEMY]; 省略 //セットアップ用 void enemy_c::enemy_set(double _x, double _y, int _pattern, int _image,int _shot_pattern,int _shot_count)//出現時に呼び出す { flag = true;//出現フラグ out_count = 0;//外出た時用 hp = 4;//仮の共通hp x = _x; y = _y; pattern = _pattern; image = _image; count = 0;//カウントを初期化 angle = 0;//角度初期化 shot_pattern = _shot_pattern;//ショット種類設定 shot_count = _shot_count;//ショットタイミング } //移動用 省略 //enemy //空いてるenemyを探して引数に初期座標、行動パターン、画像を入れた関数を書く //フラグが立っているenemyをそれぞれupdate,drawする関数を探す関数を書く //初期化用 省略 //空いてる番号を探す 省略 //出現時に呼び出すよう void Enemy_setup(double __x, double __y, int __pattern, int __image,int __shot_pattern,int __shot_count) { int i;//利用可能なクラス番号 i = Enemy_search(); if (i == -1) return; enemy[i].enemy_set(adjust_x(__x),adjust_y(__y), __pattern, __image,__shot_pattern,__shot_count);//原点を画面に合わせてる } //これは毎回呼び出す void Enemy_update() { 省略 } void Enemy_draw() { 省略 } ///////////////////////////////// Stage.cpp(ここで実際に関数を呼び出してメンバ変数を定めている。) ///////////////////////////////// #include"DxLib.h" #include"Enemy.h" #include"Material.h" #include "Stage_1.h" #include "Size.h" //1面の敵管理 // 1面全体 static int c_1 = 0;//カウント用 //初期化 void Stage_1_initialize() { c_1 = 0; } //更新 void Stage_1_update() { if (c_1 == 120) { Enemy_setup(100, 100, 0, image.enemy_00(), 0, 60); } 省略 if (c_1 == 600) { Enemy_setup(500, 100, 1, image.enemy_00(), 2, 180); } //最後に時間を進める c_1++; } //描画はenemy.cppに任せる スレッドに書き込みむのは初めてなので情報の過不足があったらすみません。よろしくお願いします。
メンテ

Page: 1 |

Re: ファイルを読み込むには ( No.1 )
名前:管理人 日時:2025/06/09 22:53

> 1.読み込みに適切なファイルはどれがよいのか(txt,csv,dat)。 テキストファイルに直接データを入力するのでしたら txt,csv 等のテキストファイルが良いと思います 専用の敵出現情報編集エディターなどを作成されるのでしたらバイナリデータ( dat )が良いと思います > 2.もしあればそのファイルを使用するうえで便利な関数やライブラリ、拡張機能 ベタですがC言語の標準関数である fscanf のDXライブラリ版である FileRead_scanf 関数を 使用するとテキストファイルからの読み込みはある程度簡単に実装することが出来ます ( バイナリファイルの場合は FileRead_read 関数になります ) 例えばデータのテキストファイルの中身が以下のような場合 100,100,0,0,0,60 500,100,1,0,2,180 以下のようなプログラムでファイルを読み込み Enemy_setup を呼ぶことができます // 読み込みデータ保存用変数 int x, y, pattern, image, shot_pattern, shot_count; // ファイルを開く int FileHandle = FileRead_open( "TextData.txt" ); // 1行データを読み込み、FileRead_scanf の戻り値が 0 以上の場合のみループの中を実行する while( FileRead_scanf( FileHandle, "%d,%d,%d,%d,%d,%d", &x, &y, &pattern, &image, &shot_pattern, &shot_count ) > 0 ) { // データが読み込めたら Enemy_setup を実行する Enemy_setup( x, y, pattern, image, shot_pattern, shot_count ); } // ファイルを閉じる FileRead_close( FileHandle ); FileRead_scanf は指定の数のデータが読み込めなかった場合は戻り値が -1 となるので、 ファイルの終端に到達するまでループが繰り返されます よろしければお試しください m(_ _)m
メンテ
Re: ファイルを読み込むには ( No.2 )
名前:Tomo (解決しました) 日時:2025/06/10 11:00

ありがとうございます。 上記のプログラムを試してみたところ、正常にデータを読み込むことができました。 FileRead_scanf 関数とアーカイブ機能を合わせて使用してみます。 また、csv形式のファイルでも問題なく読み込みができたため、編集のしやすさのためにcsvを使用してみようと思います。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存