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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.