从文本文件加载时的bug

Bugs while loading from text file

本文关键字:bug 加载 文本 文件      更新时间:2023-10-16

我目前正在制作一款RTS游戏,我以这种方式从txt文件中加载单位:

1 1 700 200 10

/单位类型//玩家//x单位//y单位//血量/

我使用settler(我目前拥有的唯一单位)对象(不是指针)的向量来保存所有单位

当我加载单元并尝试在屏幕上绘制它们时,它们却不在那里。我做了一些测试,它发生的矢量"定居者"是空的,即使我从txt文件

加载

main.cpp:

vector<Settler> settlers;
...
void load_units(string filename)
{
settlers.clear();
ifstream unit_file(filename.c_str());
string line;
vector<vector<int> > ww;
while(unit_file.eof())
{
    while(getline(unit_file, line))
    {
        stringstream ss(line);
        int i;
        vector<int> w;
        while( ss >> i )
        {
            w.push_back(i);
        }
        ww.push_back(w);
    }
}
for(int i = 0; i < ww.size(); i++)
{
    int type = ww[i][0];
    int player = ww[i][1];
    int x = ww[i][2];
    int y = ww[i][3];
    int hp = ww[i][4];
    if(type == 1)//settler
    {
        Settler settler(x, y, hp, player);
        settlers.push_back(settler);
    }
}
unit_file.close();}

...

void init() {
SDL_Init( SDL_INIT_EVERYTHING );
TTF_Init();
Mix_OpenAudio( 22050, MIX_DEFAULT_FORMAT, 2, 4096 );
SDL_WM_SetIcon(IMG_Load("icon.png"), NULL);
screen = SDL_SetVideoMode(1600, 900, 32, SDL_FULLSCREEN);
map = IMG_Load("tlo.png");
bar = IMG_Load("bar.png");
pause_menu = IMG_Load("menu.png");
save_game_menu = IMG_Load("save_game_menu.png");
save_prompt = IMG_Load("saved_prompt.png");
load_game_menu = IMG_Load("load_game_menu.png");
load_prompt = IMG_Load("loaded_prompt.png");
intro_control = true;
menu = true;
running = false;
paused = false;
saving = false;
loading = false;
mapX = 0;
mapY = 0;
Xoffset = 0;
Yoffset = 0;
load_map("mapa1.txt");
load_units("units1.txt");
for(int i = 0; i < 60; i++)
{
    string file_frame;
    stringstream ss;
    ss << i + 1;
    if(i < 9)
    {
        file_frame = ("intro/000");
    }else
    {
        file_frame = ("intro/00");
    }
    file_frame.append(ss.str());
    file_frame.append(".png");
    intro[i] = IMG_Load(file_frame.c_str());
}}

int main( int argc, char* args[] ) {
int frame = 0;
Timer fps;
init();
Player p1(0, player_1_colour, "player 1");
int frame_control = 0;
while(intro_control)
{

PS:我怀疑"while(unit_file.eof()){"语句可能有问题。但这只是个猜测

你的代码有几个问题:

  • 只要eof被设置,while循环就会循环(你应该只循环直到eof被设置)
  • 即使你修复了while循环,它仍然是错误的,因为eof只在你读取它之后设置,所以你会有一个无效的条目
  • 为什么首先得到一行,只是把它放在一个字符串流再次,然后解析它?您可以直接使用文件对象的流操作符。

我认为下面的方法可以更简洁地解决你的问题:

首先,定居者结构:

struct Settler {
  int type;     // Maybe some of those should be unsigned, 
                // but I just left them as you already had them
  int player;
  int x;
  int y;
  int health;
};
然后你可以重载类的>>操作符,允许它从任何输入流中流化。它将要读取的流作为第一个参数,将应该读取结果的对象作为第二个参数:
std::istream& operator>>(std::istream in&, Settler& settler) {
  // Just read the values in the corresponding fields of Settler
  return in >> settler.type 
     >> settler.player 
     >> settler.x 
     >> settler.y 
     >> settler.health;
}

然后你可以使用一个简单的while循环读取整个定居者文件:

int main() {
  std::ifstream file("test.txt");
  Settler current;
  std::vector<Settler> settlers;
  while(file >> current) { // Read as long as it's possible to 
                           // read a Settler
    settlers.push_back(current);
  };
}

有一个工作示例(也重载<<虽然在实际程序中on可以重载<<在ideone

处生成与>>读入相同的格式