2014-03-31 68 views
0

我正试图在SDL的帮助下编写一个简单的程序。该程序加载到SDL_Texture中,并将其呈现到窗口中。但是,一旦启动我的程序,它立即退出。我将VS Express 2013与SDL2和SDL2_image库一起添加到项目中。可能是什么问题?提前致谢!SDL程序启动后立即退出。我做错了什么?

#include "SDL.h" 
#include "SDL_image.h" 
#include <iostream> 
#include <string> 

const int SCREEN_WIDTH = 640; 
const int SCREEN_HEIGHT = 480; 

bool init(); 
bool loadMedia(); 
void close(); 
// Loads individual image as texture 
SDL_Texture* loadTexture(std::string); 

SDL_Event event; 
SDL_Window* gWindow = NULL; 
// The window renderes 
SDL_Renderer* gRenderer = NULL; 
// Current displayed texture 
SDL_Texture* gTexture = NULL; 

int main(int argc, char* args[]) 
{ 
    if (!init()) 
    { 
     std::cout << "An error has occured while initializing the window: " << SDL_GetError(); 
     return 1; 
    } 

    if (loadMedia()) 
    { 
     std::cout << "Could not load media!"; 
     return 1; 
    } 

    bool quit = false; 
    // main game loop 
    while (!quit) 
    { 
     while (SDL_PollEvent(&event)) 
     { 
      switch (event.type) 
      { 
      case SDL_QUIT: 
       quit = true; 
       break;  
      } 
     } 

     // Clear screen 
     SDL_RenderClear(gRenderer); 

     // Render texture to screen 
     SDL_RenderCopy(gRenderer, gTexture, NULL, NULL); 

     SDL_RenderPresent(gRenderer); 
    } 

    close(); 
    return 0; 
} 

bool init() 
{ 
    //initialize SDL 
    if (SDL_Init(SDL_INIT_VIDEO) == -1) 
    { 
     std::cout << "SDL could not initialize! Error: " << SDL_GetError(); 
     return false; 
    } 

    // Set texture filtering to linear 
    if (!SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1")) 
     std::cout << "Warning: Linear texture filtering not enabled!"; 

    //create window 
    gWindow = SDL_CreateWindow("Hello World", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); 

    if (gWindow == NULL) 
     return false; 

    // Hardware accelerated renderer 
    gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED); 

    if (gRenderer == NULL) 
     return false; 

    // Initialize renderer color 
    SDL_SetRenderDrawColor(gRenderer, 0xFF, 0xFF, 0xFF, 0xFF); 

    //Initialize PNG loading 
    int imgFlags = IMG_INIT_PNG; 
    if(!(IMG_Init(imgFlags) & imgFlags)) 
    { 
     std::cout << "SDL_image could not initialize! SDL_image Error: " << IMG_GetError(); 
     return false; 
    } 

    return true; 
} 

bool loadMedia() 
{ 
    gTexture = loadTexture("texture.png"); 

    if (gTexture == NULL) 
    { 
     std::cout << "Failed to load texture image!!"; 
     return false; 
    } 

    return true; 
} 

SDL_Texture* loadTexture(std::string path) 
{ 
    SDL_Texture* newTexture = NULL; 

    // Load an image from a specific path 
    SDL_Surface* loadedSurface = IMG_Load(path.c_str()); 

    if (loadedSurface == NULL) 
    { 
     std::cout << "Error while loading surface: " << IMG_GetError(); 
     return newTexture; 
    } 

    newTexture = SDL_CreateTextureFromSurface(gRenderer, loadedSurface); 

    SDL_FreeSurface(loadedSurface); 
    loadedSurface = NULL; 

    return newTexture; 
} 

void close() 
{ 
    SDL_DestroyTexture(gTexture); 
    SDL_DestroyWindow(gWindow); 
    IMG_Quit(); 
    SDL_Quit(); 
} 

回答

1

您的代码在我的系统上测试过,没有问题。我怀疑它是下列之一:

  1. 您尝试加载的纹理不在正确的目录中。这会在尝试加载纹理时导致应用程序失败。根据您的代码,纹理应与您的VC++项目文件位于同一个文件夹中。你可以把它放在其他目录中,你只需要在加载时指定一个路径。

  2. 您的SDL和SDL_image DLL文件与您的可执行文件不在同一目录中。这会在SDL和SDL_image的初始化调用期间导致应用程序失败。这些DLL的,我在目录中曾在(我倾向于包括所有的图像类型库,但如果你只使用过一个图像格式,你可以有一个):

    • 的libjpeg-9.dll
    • libpng16-16.dll
    • 的libtiff-5.dll
    • libwebp-4.dll
    • SDL2.dll
    • SDL2_image.dll

应该很容易找到它一次失败的代码行。

唯一的其他评论我要提出的是,loadmedia()返回一个布尔值,所以你或许应该改变if (loadMedia() == NULL)只是if (!loadMedia())

0

适合我。

尝试用替换returns与while(1)。也许你会收到错误消息,应用程序会立即关闭?

+0

如果我删除在main()函数这两个回报则显示空白屏幕。 while(!quit)部分工作正常 – masm64

+0

如果我将它们逐一放回,每次它立即退出,因此init()和loadmedia()也会由于某种原因返回false – masm64

+0

是否打印任何错误消息? – HolyBlackCat

0

增加一个点 - 在某些Windows平台libpng16-16.dll需求zlib1。 dll明确添加到文件夹位置libpng16-16.dll

您可以找到预编译zlib1.dllhttp://www.zlib.net/

相关问题