SDL_Renderer не будет показывать текстуры после прохождения через функцию

У меня есть небольшая проблема с SDL_Renderer. Я не могу понять, почему это не работает. Давайте посмотрим на этот пример, он отлично работает:

bool running = true;
SDL_Window* window = SDL_CreateWindow("ASDF", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN);
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
SDL_Texture* texture = IMG_LoadTexture(renderer, "asdf.bmp");
SDL_Event event;

while(running)
{
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_KEYDOWN:
if(event.key.keysym.sym == SDLK_ESCAPE)
{
running = false;
}
break;
default:
break;
}
}
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, texture, NULL, NULL);
SDL_RenderPresent(renderer);
}
SDL_DestroyTexture(texture);

Затем речь идет о классах, и когда я передаю визуализатор через функции, он больше не работает.

class Sprite
{
public:
Sprite(const std::string& path) : filePath(path) {};
~Sprite() { SDL_DestroyTexture(tex); };
void draw(SDL_Renderer* renderer);

private:
const std::string& filePath;
SDL_Texture* tex;
};

void Sprite::draw(SDL_Renderer* renderer)
{
printf("renderer sprite = %p\n", renderer);

tex = IMG_LoadTexture(renderer, filePath.c_str());
SDL_RenderCopy(renderer, tex, NULL, NULL);
}

int main(int argc, char **argv)
{
bool running = true;
SDL_Window* window = SDL_CreateWindow("ASDF", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN);
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
SDL_Event event;

Sprite* sprite = new Sprite("asdf.bmp");
while(running)
{
printf("renderer main = %p\n", renderer);

while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_KEYDOWN:
if(event.key.keysym.sym == SDLK_ESCAPE)
{
running = false;
}
break;
default:
break;
}
}
SDL_RenderClear(renderer);
sprite->draw(renderer);
SDL_RenderPresent(renderer);
}

return 0;
}

Адрес рендерера одинаков в основной и в функции рисования. Я знаю, что, возможно, я совершаю здесь какую-то ошибку новичка, но не могу ее найти.

0

Решение

Текстура загружается каждый кадр при вызове sprite->draw,

Вы должны переместить линию tex = IMG_LoadTexture(renderer, filePath.c_str()); в конструктор, чтобы он загружался только один раз.

Причина этого в том, что текстура не будет готова к рендерингу в том же кадре, в котором она загружена.

Как примечание стороны, Вы, кажется, не убираете SDL_Window или же SDL_Renderer с их соответствующими функциями уничтожения или вызова SDL_Quit хотя я принимаю это, возможно, было опущено для отправки примера кода.

1

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


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