こんばんわ、お世話になっております。
ファイルの読み込み書き込みについて質問をさせていただきます。
自分は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に任せる
スレッドに書き込みむのは初めてなので情報の過不足があったらすみません。よろしくお願いします。