LINUX.ORG.RU

Проблема с инициализацией объектов UI с JSON файла

 


0

1

У меня есть два файла это ui.cpp и loadui.cpp

ui.cpp - все классы UI объектов, например: кнопки, текст и т.д, есть функция .render(renderer), которая рендерит все объекты.

loadui.cpp - функция которая возвращает все UI объекты и добавляет в список, который позже возвращается.

В цикле в main.cpp есть данный код:

LayoutUI main_screen("./layouts/main_screen.json");
vector<Button> buttons = main_screen.load(renderer);

SDL_Event event;
while(programRunning)
{
    while(SDL_PollEvent(&event) != 0)
    {
        if(event.type == SDL_QUIT)
            programRunning = false;

        for (Button& btn : buttons) {
            btn.handleEvent(event);
        }
    }

    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);

    SDL_RenderClear(renderer);

    for (Button& btn : buttons) {
        btn.render(renderer);
    } 

    SDL_RenderPresent(renderer);
}

SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();

return 0;

В цикле основного цикла идут ивенты, они работают прекрасно, то есть, происходят нажатия кнопок и т.д.

После цикла ивента возникают проблемы с прорисовкой UI объектов, которые не отображаются должным образом.

Но, если я это сделаю вручную, то всё заработает.



Последнее исправление: InFineTy (всего исправлений: 4)

По-моему ты забыл в окно положить то, что ты нарендерил?

SDL_RenderCopy(renderer, texture, NULL, NULL);

перед

SDL_RenderPresent(renderer);

zx_gamer ★★★
()
Ответ на: комментарий от zx_gamer

Смотри, у меня в цикле for есть функция .render(), она это и делает.

Код:

void Button::render(SDL_Renderer *renderer) {
    SDL_RenderCopy(renderer, buttonTextureStatic, NULL, &buttonRect);
}

Само по себе оно должно рендерить кнопки, но это не удаётся, в чём рофл так это в том что если это вручную делать то всё будет работать)

InFineTy
() автор топика
Ответ на: комментарий от InFineTy

Жесть. Во-первых без самого класса ничего не понятно, а во-вторых код у вас...

Короче, первое что надо сделать — научиться ООП. И пожалуйста, делайте это без STL. Можете использовать его потом, если захотите (что не факт), но на стадии обучения не нужно использовать то, что не понимаете.

Существуют разные кодстайлы, но большинство запрещают писать в строку более 79 символов. И это не означает, что если не влазит, надо переносить строку, это значит, что надо переосмысливать код.

Button::Button(SDL_Renderer *renderer, const string custom_id, const char* staticImage, const char* readyImage, const char* clickedImage, tuple<int, int> xy)

Что это?

Решите проблему классически: создайте класс Widget, в котором опишите логику виджетов (у вас же не только кнопки будут?), потом отнаследуйте класс Button от Widget. Таким образом вы избежите написание одного и того же кода, и выглядеть это будет по-человечески. «Наружу» из классов GUI не должны торчать куски SDL. Вся логика GUI должна быть описана исключительно внутри соответствующих классов.

Ваш вопрос был про другое, но, простите, разбираться в этой «лапше» я не хочу (и скорее всего где-то в ней проблема).

zx_gamer ★★★
()
Ответ на: комментарий от zx_gamer

Хорошо, думаю что ваша идея реально очень хорошая по поводу виджетов, думаю разберусь.

InFineTy
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.