2016-11-25 4 views
0

Je suis en train de charger une image ("carnero.png") mais quand je l'utilise IMG_LoadTexture(), elle renvoie null;C++ IMG_LoadTexture() retourne 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(); 
} 

Cette fonction retourne null

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

Mais quand j'utilise SDL_LoadBMP() pour charger l'arrière-plan il fonctionne. J'ai essayé de mettre mon .png dans d'autres dossiers mais ça ne marche pas non plus. J'ai également essayé de charger mon .png using IMG_LOAD() mais je n'ai eu aucun succès.

+3

' « /textures/carnero2.png »' serait que la charge du répertoire racine au lieu d'un parent 'textures' répertoire? –

+0

Je recommande d'utiliser IMG_GetError après l'appel IMG_LoadTexture. Si vous voulez charger des fichiers PNG, vous avez besoin des bibliothèques libpng et zlib, incluez-vous ces DLL dans le répertoire de travail? Ils devraient être dans le dossier SDL_Image et vous devez les copier dans votre répertoire de travail –

+0

@ EmiHöss Merci, il a corrigé mon problème –

Répondre

0

Votre chemin d'accès est incorrect. /textures/carnero2.png va chercher un fichier dans C:\textures\carnero2.png, ou /textures/carnero2.png sur unix.

Vous pouvez résoudre ce problème comme suit:

  • Utiliser le chemin complet (absolu): C:\Program Files (x86)\MyGame\textures\carnero2.png, /usr/local/share/mygame/textures/carnero2.png
  • Ajouter un dot./textures/carnero2.png
  • Retirez la barre oblique: textures/carnero2.png.
+1

J'ai essayé ce que vous avez dit mais il n'a pas résolu le problème. J'ai changé "textures/carnero2.png" en "scenario.bmp" et cela a fonctionné. Je pense que mes fichiers png ont un problème EDIT: J'avais oublié de mettre zlib.dll et libpgn.dll dans mon répertoire de débogage. maintenant ça marche –

0

Le chemin de votre fichier d'entrée est probablement incorrect:

/textures/carnero2.png 

devrait probablement

textures/carnero2.png 

comme dans le précédent (travail) commande de charge.

À l'avenir, je vous suggère de tester l'existence de fichiers avant de tenter de charger le fichier. Ainsi, vous pouvez séparer les erreurs "fichier non trouvé" du format réel/problèmes de fichiers corrompus.