SDL_image Невозможно загрузить файл .png с помощью IMG_LoadTexture () - PullRequest
0 голосов
/ 28 ноября 2018

При попытке загрузить файл .png с помощью IMG_LoadTexture (renderer, "idle.png") SDL_GetError () говорит: "Не удалось открыть idle.png". Нет ошибок компилятора, появляется только черное окно.

Это мой main.cpp

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

int main(int argc,  char** argv) {
    SDL_Event event;
    SDL_Renderer *renderer = NULL;
    SDL_Texture *texture = NULL;
    SDL_Window *window = NULL;

    SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO);
    SDL_CreateWindowAndRenderer(
            800, 600,
            0, &window, &renderer
    );
    IMG_Init(IMG_INIT_PNG);
    texture = IMG_LoadTexture(renderer, "idle.png");
    std::cout << SDL_GetError();

    while (1) {
        SDL_RenderCopy(renderer, texture, NULL, NULL);
        SDL_RenderPresent(renderer);
        if (SDL_PollEvent(&event) && event.type == SDL_QUIT)
            break;
    }
    SDL_DestroyTexture(texture);
    IMG_Quit();
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return EXIT_SUCCESS;
}

Но я думаю, проблема в том, как я связываю библиотеку.Я установил sdl2, sdl2_image и libpng.

CMakeLists.txt:

cmake_minimum_required(VERSION 3.12)
project(untitled)

set(CMAKE_CXX_STANDARD 17)

add_executable(untitled main.cpp)

INCLUDE(FindPkgConfig)

PKG_SEARCH_MODULE(SDL2 REQUIRED sdl2)
PKG_SEARCH_MODULE(SDL2IMAGE REQUIRED SDL2_image>=2.0.0)

INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS} ${SDL2IMAGE_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES(untitled ${SDL2_LIBRARIES} ${SDL2IMAGE_LIBRARIES})

1 Ответ

0 голосов
/ 28 ноября 2018

Вы загружаете изображение из текущего рабочего каталога (CWD) вашего приложения.То есть не обязательно тот же каталог, в котором находится ваш исполняемый файл (это зависит от того, как он запускается), что, как вы, вероятно, предполагаете.

3 простых способа исправить:

  1. измените cwd во время выполнения на место, где находится файл, и загрузите, как сейчас.
  2. предоставляет абсолютный путь к файлу при загрузке, поэтому cwd не имеет значения.
  3. получить путь к исполняемому файлу во время выполнения и затем построить путь к файлу относительно того, где находится исполняемый файл.(На мой взгляд, лучший вариант, так как он надежен против перемещения вашего проекта / установки в другое место).
...