SDL2 рендерер доставляет мне проблемы

я следую этот урок это учит, как использовать SDL2 с конечной целью изучения C ++ в более увлекательной и интерактивной форме.

Для этого мне нужно только уметь рисовать линии, многоугольники и круги.

Итак, после прочтения части 1, которая объясняет, как создать окно на экране, и части 3, которая вводит обработку событий, я направился к частям 7 и 8, которые объясняют, соответственно, как создать средство визуализации и как нарисовать прямоугольник на экране. , Это код, который я получил до сих пор (это не совсем то же самое, что код из учебника: я ввел структуру для передачи объектов SDL и удалил всю обработку ошибок, которая приводила к путанице):

#include <SDL2/SDL.h>

//screen dimensions costants
#define SCREEN_WIDTH 540
#define SCREEN_HEIGHT 960

//data structure holding the objects needed to create a window and draw on it
struct interface {
SDL_Window * window = NULL;
SDL_Surface * surface = NULL;
SDL_Renderer * renderer = NULL;
};

//function which inits the sdl and creates an interface object
interface init() {
interface screen;
SDL_Init(SDL_INIT_VIDEO);
screen.window = SDL_CreateWindow("", 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
screen.surface = SDL_GetWindowSurface(screen.window);
screen.renderer = SDL_CreateRenderer(screen.window, -1, SDL_RENDERER_ACCELERATED);
return screen;
}

//function to free the memory and close the sdl application
void close(interface screen) {
SDL_DestroyRenderer(screen.renderer);
SDL_DestroyWindow(screen.window);
screen.renderer = NULL;
screen.window = NULL;
SDL_Quit();
}

int main(int argc, char* args[]) {

//start the application
interface screen = init();

//setup for event handling
bool quit = false;
SDL_Event event;

//the shape to render
SDL_Rect fillRect = { SCREEN_WIDTH / 4, SCREEN_HEIGHT / 4, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2 };

//main loop which first handles events
while (!quit) {
while (SDL_PollEvent(&event) != 0) {
if (event.type == SDL_QUIT)
quit = true;
}
//should draw a red rectangle on the screen
SDL_SetRenderDrawColor(screen.renderer, 0xFF, 0xFF, 0xFF, 0xFF);
SDL_RenderClear(screen.renderer);
SDL_SetRenderDrawColor(screen.renderer, 0xFF, 0x00, 0x00, 0xFF);
SDL_RenderFillRect(screen.renderer, &fillRect);
}

//End the application
close(screen);
return 0;
}

Проблема в том, что, как есть, программа ничего не рисует на экране (который остается черным), и если я удаляю линии screen.surface = SDL_GetWindowSurface(screen.window); он также начинает сильно отставать, и мне даже трудно выйти из приложения.

Обратите внимание, что я программирую на Android с использованием C4droid и SDL Plugin для C4droid.

Почему это происходит? Что я делаю неправильно?

РЕДАКТИРОВАТЬ Проблема решена путем переименования close в end и включив вызов SDL_RenderPresent(screen.renderer); в конце основного цикла. При такой настройке поверхность экрана должен быть удален или программа не будет ничего рисовать.

Спасибо @keltar и @Wutipong Wongsakuldej за ответы на вопрос в комментариях

1

Решение

Скриншот

Прежде всего, я протестировал код в Windows (MSYS2), а не в Android, так как в данный момент у меня не установлена ​​AIDE.

В основном я добавил 2 строки кода в основной цикл:

//main loop which first handles events
while (!quit) {
while (SDL_PollEvent(&event) != 0) {
if (event.type == SDL_QUIT)
quit = true;
}
//should draw a red rectangle on the screen
SDL_SetRenderDrawColor(screen.renderer, 0xFF, 0xFF, 0xFF, 0xFF);
SDL_RenderClear(screen.renderer);
SDL_SetRenderDrawColor(screen.renderer, 0xFF, 0x00, 0x00, 0xFF);
SDL_RenderFillRect(screen.renderer, &fillRect);
/** below lines are added **/
SDL_RenderPresent(screen.renderer);
SDL_Delay(0);
}
  • SDL_RenderPresent Нарисуйте все, что вы сделали до сих пор на экране. Это делает вывод показывает вверх.

  • SDL_Delay() это добавлено, чтобы дать процессору время вернуться к ОС. Без этого ваше приложение может перестать отвечать на запросы, и загрузка процессора будет 100% (на одном ядре) в некоторой операционной системе (особенно в очень старой). Я не знаю, нужно ли это в Android или нет в любом случае. Попробуйте.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]