2016-11-25 12 views
0

Я пытаюсь загрузить изображение («carnero.png»), но когда я использую IMG_LoadTexture(), он возвращает null;C++ IMG_LoadTexture() возвращает null

Game.h

#ifndef GAME_H_ 
#define GAME_H_ 

#include <SDL.h> 
#include <SDL_image.h> 
#include <windows.h> 

class Game { 
public: 
    Game(); 
    ~Game(); 

    void run(); 
    void initGraphics(); 
    void gameLoop(); 
private: 
    SDL_Window* _window = nullptr; 
    SDL_Renderer* _renderer; 
    SDL_Surface* _surfaceBMP; 
    SDL_Texture* _textureScenario; 
    SDL_Texture* _textureCarnero; 
    SDL_Rect* _scenarioRect; 
    SDL_Rect* _carneroRect; 
    int _width; 
    int _height; 
    bool _running; 
}; 


#endif /* SRC_GAME_H_ */ 

Game.cpp

#include "Game.h" 
#include <iostream> 

Game::Game(){ 
    _running = true; 
    run(); 
} 

Game::~Game(){ 

} 

void Game::run(){ 
    initGraphics(); 
    gameLoop(); 
} 

void Game::initGraphics(){ 

    SDL_Init(SDL_INIT_VIDEO); 
    IMG_Init(IMG_INIT_PNG); 

    _window = SDL_CreateWindow("Carneiro", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1024, 768, SDL_WINDOW_SHOWN); 

    if(_window == nullptr) exit(1); 

    _renderer = SDL_CreateRenderer(_window, -1, SDL_RENDERER_ACCELERATED); 

    _surfaceBMP = SDL_LoadBMP("textures/scenario.bmp"); 
    _textureScenario = SDL_CreateTextureFromSurface(_renderer, _surfaceBMP); 
    SDL_FreeSurface(_surfaceBMP); 

    _textureCarnero = IMG_LoadTexture(_renderer, "/textures/carnero2.png"); 
    if(_textureCarnero == nullptr) exit(1); 

    _scenarioRect->x = 0; _scenarioRect->w = 1024; 
    _scenarioRect->y = 0; _scenarioRect->h = 740; 
    _carneroRect->x = 20; _carneroRect->w = 150; 
    _carneroRect->y = 100; _carneroRect->h = 100; 



} 

void Game::gameLoop(){ 
    while(_running){ 
     Sleep(10); 
     SDL_Event evnt; 
     if(SDL_PollEvent(&evnt)){ 
      switch(evnt.type){ 
       case SDL_QUIT: 
        _running = false; 
        break; 
       } 
      } 

     SDL_RenderClear(_renderer); 
     SDL_RenderCopy(_renderer, _textureScenario, nullptr, _scenarioRect); 
    // SDL_QueryTexture(_textureCarnero, NULL, NULL, &_carneroRect->x, &_carneroRect->y); 
     SDL_RenderCopy(_renderer, _textureCarnero, nullptr, _carneroRect); 

     SDL_RenderPresent(_renderer); 

     } 

    SDL_DestroyTexture(_textureScenario); 
    SDL_DestroyTexture(_textureCarnero); 
    SDL_DestroyRenderer(_renderer); 
    SDL_DestroyWindow(_window); 
    SDL_Quit(); 
    IMG_Quit(); 
} 

Эта функция возвращает нулевое значение

_textureCarnero = IMG_LoadTexture(_renderer, "/textures/carnero2.png"); 

Но когда я использую SDL_LoadBMP() для загрузки фона он работает. Я попытался поместить мой .png в другие папки, но он тоже не работает. Я также пытался загрузить мой .png, используя IMG_LOAD(), но у меня не было успеха.

+3

'' /textures/carnero2.png «будет ли загружаться из корневого каталога вместо относительного каталога« текстуры »? –

+0

Я рекомендую использовать IMG_GetError после вызова IMG_LoadTexture. Если вы хотите загрузить PNG, вам нужны libpng и zlib libs, вы включаете эти DLL в рабочий каталог? Они должны быть в папке SDL_Image, и вы должны скопировать их в свой рабочий каталог. –

+0

@ EmiHöss Спасибо, я исправил свою проблему –

ответ

0

Ваш путь неправильный. /textures/carnero2.png будет искать файл в C:\textures\carnero2.png, или /textures/carnero2.png на unix.

Вы можете решить эту проблему следующим образом:

  • Используйте полный (абсолютный) путь: C:\Program Files (x86)\MyGame\textures\carnero2.png, /usr/local/share/mygame/textures/carnero2.png
  • Добавить dot./textures/carnero2.png
  • Удалить слэш: textures/carnero2.png.
+1

Я попробовал то, что вы сказали, но это не решило проблему. Я изменил «textures/carnero2.png» на «stage.bmp», и он сработал. Я думаю, что у моих png-файлов есть проблема EDIT: я забыл поместить zlib.dll и libpgn.dll в свой отладочный каталог. теперь он работает –

0

Путь к вашей входной файл, вероятно, неправильно:

/textures/carnero2.png 

, вероятно, следует

textures/carnero2.png 

как в предыдущей команде загрузки (рабочий).

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