Професионална програма
Loading...
Smeshan avatar Smeshan 89 Точки

Четене на настройки от файл

Здравейте,

искам да направя настройките да се четат от файл.

Това което направих за сега:

MonitorConfig.txt

name of the display:Hardwear renderering
display height:800
display width:600


EngineConfigLoader.cpp (не е целия)

const char* MONITOR_CFG_FILE = "../sdl_utils/config/MonitorConfig.txt";

static std::string readConfigFromFile(const int32_t lineNum) {
    std::fstream file(MONITOR_CFG_FILE );
    if (!file.is_open()) {
        std::cerr << "Unable to open config file: " << MONITOR_CFG_FILE << std::endl;
    }
    std::string configLine;
    int32_t currLine = 0;

    while (!file.eof()) { // eof -> end of file
        std::string discard;

        if (currLine == lineNum) {
            getline(file, discard, ':'); //delete text before ':'
            getline(file, configLine);
            //std::cerr << "Line: " << configLine << std::endl;
            break;
        }
        getline(file, discard);
        //std::cerr << "Discard: " << discard << std::endl;
        currLine++;
    }
    return configLine;
}

static void populateMonitorConfig(MonitorConfig &outConfig) {
    outConfig.windowName = readConfigFromFile(0);
    outConfig.windowHeight = stoi(readConfigFromFile(1));
    outConfig.windowWidth = stoi(readConfigFromFile(2));
    outConfig.windowFlags = WINDOW_SHOWN;
}

И няколко неща не ми харесват или се чудя как да станат:
1. Като станат 100 настройки, while цикъла ще има да си върти докато стигне до 87-мия ред (примерно) за да го вземе. :Х И т. н..
2. Реда на настройките във файла трябва напълно да отговаря на реда, в който съм ги написал в populateMonitorConfig() (или поне номера на реда да отговаря). Това ми се струва бомба със закъснител и отделно трудно за промени..
3. populateMonitorConfig() стана адски нечетима.. :/

Ще продължа да го мисля и преработвам, но ще се радвам да се получи някаква дискусия и да съберем добри идеи :)

Поздрави,
Илиян

Тагове:
1
C++ Applications Development 17/10/2021 00:07:01
Smeshan avatar Smeshan 89 Точки

Здравейте, пак съм аз.
Сега след като направих това да се зареждат настройките автоматично и стигнат да въвеждам Sprite анимациите, по-някакви причини не мога да го направя renderer-a да ми покаже само част от картинката.

Доколкото разбирам Renderer::drawImage, destRect трябва да е с цялата големина на картината? Нали?
И от него sourceRect да взема само тази част, която искаме.
Но пък в същото време width и height в drawParams ги посочваме (гледах урока поне 5 пъти) да са равни на първия фрейм.
И тук вече тотално се обърквам и не разбирам защо ако трябва да е така, е така.. Нали зареждаме картинката, не я слагаме в никакъв правоъгълник, после в Image казваме drawParams какви да са и все излиза смачкана..
Явно има нещо общо с автоматичното зареждане на настройки, но те изплюват един вектор с настройки (за картинката с момиченцето са Width: 256 Height: 220 Frames: 6):

static void populateImageContainerConfig(ImageContainerConfig& cfg) {
    AutoResLoader resLoader;
    resLoader.init();

    const std::vector<Resource> imgFiles = resLoader.getResources(IMAGES);
    const std::vector<ImageConfig> imgConfigs = ConfigProcessor::processImageFiles(imgFiles);

    for (const auto& config : imgConfigs) {
        cfg.imageConfigs.insert(std::make_pair(config.id, config));
        //emplace
    }

и от там всичко трябва да е еднакво както в урока? Единствено в ImageConfig аз си запазвам width и height, но пробвах и да ги махна и да работя само с първия фрейм - същия резултат, така че предполагам грешката е преди това.

И имах съвсем друга идея да правя последните 5-6 часа и изобщо не мръднах. 3-4 пъти го преправях, сменях пробвах.. грр

https://github.com/Smeshan/SFX

Ако някой има време да погледне, ще се радвам и ще съм много благодарен!

Поздрави,
Илиян

0
Smeshan avatar Smeshan 89 Точки

Оправих се..

Не бях сменил на всички места където пише SDL_RenderCopy да взема сорс правоъгълник и го бях написал само тук:
if (FULL_OPACITY != drawParams.opacity) {
..
(facepalm)

1