Przeciwnicy - dodawanie, wczytywanie, zapis

0

Witam!
Od jakiegoś czasu szukam najlepszego sposobu na przeciwników. Zastanawiam się w jaki sposób można by wczytywać z pliku pozycje x,y i moveSpeed w zależności od ID, tzn.

ID:1
x = 100
y = 200
ms = 1

ID:2
x = 200
y = 300
ms = 1.5

Renderuje się 2 przeciwników z różnymi wartościami.

  1. Obsługę wczytywania stringów znam.
    Próbowałem zrobić na takiej zasadzie:

    //FileManager class
    void FileManager::LoadFromFile(std::string fileName, std::vector<std::vector<std::string>>&variables, std::vector<std::vector<std::string>>& contents, std::string name, std::string id)
    {
    fileName = "Files/Config/" + fileName;
    
    std::vector<std::string> tempVariables;
    std::vector<std::string> tempContents;
    
    variables.clear();
    contents.clear();
    
    std::ifstream openFile(fileName.c_str());
    
    bool idFound = false;
    
    if (openFile.is_open())
    {
        while (!openFile.eof())
        {
            std::string line;
            std::getline(openFile, line);
    
            if (line.find("ID:" + id) != std::string::npos)
            {
                idFound = true;
                continue;
            }
            else if(line.find("eID:") != std::string::npos && line.find(id) != std::string::npos)
            {
                idFound = false;
                break;
            }
    
            if (idFound)
            {
                if (line.find(name + ":") != std::string::npos)
                {
                    state = VARIABLES;
                    line.erase(0, line.find(':') + 1);
                    tempVariables.clear();
                }
                else
                {
                    state = CONTENTS;
                    tempContents.clear();
                }
    
                line.erase(std::remove(line.begin(), line.end(), '{'), line.end());
                line.erase(std::remove(line.begin(), line.end(), '}'), line.end());
    
                std::stringstream str(line);
                while (str)
                {
                    std::getline(str, line, ',');
                    if (line != "")
                    {
                        if (state == VARIABLES)
                        {
                            tempVariables.push_back(line);
                        }
                        else
                        {
                            tempContents.push_back(line);
                        }
                        std::cout << line << std::endl;
                    }
                }
                if (state == CONTENTS && tempContents.size() > 0)
                {
                    variables.push_back(tempVariables);
                    contents.push_back(tempContents);
                }
            }
        }
    }
    openFile.clear();
    openFile.close();
    }
    //Entity class
    void Entity::LoadFromFile(std::string fileName, std::string name, std::string id)
    {
    std::vector<std::vector<std::string>> variables;
    std::vector<std::vector<std::string>> contents;
    
    Config::getFM()->LoadFromFile(fileName, variables, contents, name, id);
    for (int i = 0; i < variables.size(); i++)
    {
        for (int j = 0; j < variables[i].size(); j++)
        {
            std::string var = variables[i][j];
            std::string con = contents[i][j];
    
            float conf = atof(contents[i][j].c_str());
            float coni = atoi(contents[i][j].c_str());
    
            if (var == "x") posX = conf;
            else if (var == "y") posY = conf;
            else if (var == "ms") velX = conf;
    
                       //Tutaj próbowałem dodawać różne rzeczy, żeby program wykrywał id, ale coś nie wyszyło
        }
    }
    }
    // Klasa Przeciwnika - konstruktor
    Human::Human(int moveDirection, SDL_Renderer *renderer, std::string id)
    {
    Entity::LoadFromFile("Human.txt", "Human", id);
        ...
        ...
    }

    I w pliku z którego mamy czytać :

ID:1 // Start id
//name, variables
Human:{x, y, ms}
100, 450, 1 // Contents
eID:1 // stop id

ID:2 // start id
//name, variables
Human:{x, y, ms}
200, 500, 1.5 //Contents
eID:2 // stop id
  1. Zapis
    Jakiś pomysł mam, jednak nie jest to jakiś bardzo super profesjonalny pomysł. Prosiłbym o jakieś przykłady kodów.
  2. Dodawanie
    Posiadam manager przeciwników, który korzysta ze smart pointerów, nie wiem czy to też jest dobry pomysł, bo w niektórych przykładach kiedy zmieniłem z normalnych na smart odnotowałem większe użycie procesora
0

pliki .xml i w sumie tyle, jak to i tak pewnie ładowanie danych na początku to czemu nie? Użyj jakiegoś parsera xml.

Posiadam manager przeciwników, który korzysta ze smart pointerów, nie wiem czy to też jest dobry pomysł, bo w niektórych przykładach kiedy zmieniłem z normalnych na smart odnotowałem większe użycie procesora

tak, to nie nowość że w takich silnikach do gier znajdziesz w wielu miejscach nie shared_ptr a zwykłe wskaźniki. Bo tam spadek wydajności jest widoczny.

edit:
uważaj też na tak wiele argumentów w funkcji, staraj się mieć max trzy argumenty.

0

Z tego co przeczytałem o xml, to działa to w sieci, a ja chce zwykłą singleplayer bez żadnego połączenia + nauka.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0