Изображение SDL2 - IMG_Init() возвращает 0, при этом IMG_GetError() является пустым

Я пытаюсь загрузить png изображение с SDL2. Тем не менее, даже если файл существует и средство визуализации создано правильно, IMG_LoadTexture вернет только nullptr без видимой причины.

Функция, которую я использую IMG_LoadTexture выглядит так, где texture это SDL_Texture*:

void setTexture(const char* filePath) {
    // check if the specified file exists
    assert(utils::fileExists(filePath) && "Texture file does not exist!");

    // this should set the texture, but never succeeds
    texture = IMG_LoadTexture(Game::renderer, filePath);
    if (!texture) {
        // error handling, this is always true
    }
}

Утверждение прошло, поэтому файл был найден. filePath выглядит примерно так "assets/texture.png", Game::renderer устанавливается заранее и выглядит так:

static SDL_Renderer* renderer; // in header

renderer = SDL_CreateRenderer(window, -1, 0); // in implementation
if(renderer) {
    SDL_SetRenderDrawColor(renderer, 100, 200, 255, 255);
} else {
// error handling and quit
}

Однако, несмотря на IMG_LoadTexture не вернуть должное SDL_Texture*, IMG_GetError() просто пусто, что означает

std::cout << IMG_GetError();

после звонка IMG_LoadTexture ничего не выводит.

Видя, что я в полной растерянности относительно того, почему это происходит, я надеюсь, что кто-то может помочь мне здесь.

РЕДАКТИРОВАТЬ: По запросу, вот более полная, компилируемая версия программы, которая выдает ту же ошибку.

Я на Windows 10 Home 64-bit, использую 32-битную версию MingW-w64 для компиляции на C++17. Моя версия SDL2 - 2.0.8, а моя версия SDL2_image - 2.0.3.

Вот изображение, которое я хотел бы загрузить: игрок

Изображение содержится в папке с именем assets в исходном каталоге и в каталоге сборки. (Я использую CMake, чтобы удалить папку в каталоге сборки перед сборкой и скопировать ее после сборки).

И вот код:

#include <iostream>
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>

void quit(SDL_Window* window, SDL_Renderer* renderer) {
    SDL_DestroyWindow(window);
    SDL_DestroyRenderer(renderer);
    IMG_Quit();
    SDL_Quit();
    std::cout << "Quit Test." << std::endl;
}

int main(int argv, char** argc) {

    if (SDL_Init(SDL_INIT_EVERYTHING) == 0) {
        std::cout << "SDL initialized" << std::endl;
    } else {
        std::cerr << "Failed to initialize SDL" << std::endl;
        std::cerr << SDL_GetError() << std::endl;
        return 1;
    }
    auto window = SDL_CreateWindow("Test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, 0);
    if (window) {
        std::cout << "Window created." << std::endl;
    } else {
        std::cerr << "Failed to create window." << std::endl;
        return 2;
    }

    auto initError = IMG_Init(IMG_INIT_PNG);
    if (initError == IMG_INIT_PNG) {
        std::cout << "SDL_image initialized" << std::endl;
    } else {
        std::cerr << "Failed to initialize SDL_image" << std::endl;
        std::cerr << "Return value: " << initError << std::endl;
        std::cerr << "Error flags: " << IMG_GetError() << std::endl;
        return 3;
    }

    auto renderer = SDL_CreateRenderer(window, -1, 0);
    if (renderer) {
        SDL_SetRenderDrawColor(renderer, 100, 200, 255, 255);
        std::cout << "Renderer created." << std::endl;
    } else {
        std::cerr << "Failed to create renderer." << std::endl;
        std::cerr << SDL_GetError() << std::endl;
        return 4;
    }

    auto texture = IMG_LoadTexture(renderer, "assets/player.png");
    if (!texture) {
        std::cerr << "Failed to load texture!" << std::endl;
        std::cerr << IMG_GetError() << std::endl;
        return 5;
    }

    quit(window, renderer);

    return 0;
}

Какие выводы:

SDL initialized
Window created.
Failed to initialize SDL_image
Return value: 0
Error flags:

Process finished with exit code 3

0 ответов

Другие вопросы по тегам