2016-11-25 4 views
0

イメージ( "carnero.png")をロードしようとしていますが、IMG_LoadTexture()を使用するとnullが返されます。C++ IMG_LoadTexture()はヌルを返します

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(); 
} 

この機能私はそれが動作するバックグラウンドをロードするためにSDL_LoadBMP()を使用する場合はnull

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

を返しますが。他のフォルダに.pngを入れてみましたが、うまくいきません。 IMG_LOAD()を使用して.pngをロードしようとしましたが、成功しませんでした。

+3

'' /textures/carnero2.png」 ''相対 '' textures'ディレクトリの代わりにルートディレクトリからロードするでしょうか? –

+0

IMG_LoadTexture呼び出しの後にIMG_GetErrorを使用することをお勧めします。 PNGをロードするにはlibpngとzlibのライブラリが必要ですが、それらのDLLを作業ディレクトリに含めていますか?それらはSDL_Imageフォルダにある必要があります。あなたの作業ディレクトリにコピーする必要があります。 –

+0

@EmiHössありがとうございます。私の問題は修正されました。 –

答えて

0

パスが正しくありません。 /textures/carnero2.pngは、C:\textures\carnero2.png、またはUNIXの場合は/textures/carnero2.pngのファイルを検索します。次のように

あなたはこの問題を解決することができます

  • 使用フル(絶対)パス:textures/carnero2.pngC:\Program Files (x86)\MyGame\textures\carnero2.png/usr/local/share/mygame/textures/carnero2.png
  • dot./textures/carnero2.png
  • はスラッシュを削除します。
+1

私はあなたが言ったことを試しましたが、問題は解決しませんでした。私は "textures/carnero2.png"を "scenario.bmp"に変更しました。私は私のPNGファイルに問題があると思う編集:私はデバッグディレクトリにzlib.dllとlibpgn.dllを置くことを忘れてしまった。今それは働いている –

0

入力ファイルへのパスは、おそらく間違っています:

/textures/carnero2.png 

はおそらく、以前の(作業)loadコマンドのように

textures/carnero2.png 

でなければなりません。

今後、ファイルをロードする前にファイルの存在をテストすることをお勧めします。したがって、「ファイルが見つかりません」というエラーと実際のフォーマット/破損したファイルの問題を区別することができます。

関連する問題