IMG_Load不起作用

时间:2015-06-02 16:44:53

标签: c++ c++11 sdl sdl-2

我在看这个系列= https://www.youtube.com/watch?v=2NVgHrOFneg 由于某种原因,视频中的人可以使用代码,但对我来说它编译得很好,但不会加载图像。我真的不知道该怎么办。

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

SDL_Texture *LoadTexture(std::string filePath, SDL_Renderer *renderTarget) //texture optimization function
{


    SDL_Texture *texture = nullptr;
    SDL_Surface *surface = IMG_Load(filePath.c_str());


    if (surface == NULL)
        std::cout << "Error 1" << std::endl;
    else
    {
        texture = SDL_CreateTextureFromSurface(renderTarget, surface);

        if (texture == NULL)
            std::cout << "Error 2" << std::endl;
    }
    SDL_FreeSurface(surface);

    return texture;
}



int main(int, char *argv[])
{
    const int FPS = 144;
    int frameTime = 0;

    SDL_Window *window = nullptr;

    SDL_Texture *currentImage= nullptr;
    SDL_Renderer *renderTarget = nullptr;
    SDL_Rect playerRect;
    int frameWidth, frameHeight;
    int textureWidth, textureHeight;
    SDL_Init(SDL_INIT_VIDEO );

    int imgFlags = IMG_INIT_PNG | IMG_INIT_JPG;

    if (!(IMG_Init(imgFlags) != imgFlags))

    {
        std::cout << "Error: " << IMG_GetError()    << std::endl;



    }

    window = SDL_CreateWindow("SDL Pong", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1024, 720, SDL_WINDOW_SHOWN);
    renderTarget = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);

    currentImage = LoadTexture("Untitled.jpg", renderTarget);
    SDL_QueryTexture(currentImage, NULL, NULL, &textureWidth, &textureHeight);
    SDL_SetRenderDrawColor(renderTarget, 0xFF, 0, 0, 0xFF);
    frameWidth = textureWidth / 3;
    frameHeight = textureHeight / 4;
    playerRect.x = playerRect.y = 0;
    playerRect.y = frameWidth;
    playerRect.h = frameHeight;

    bool isRunning = true; //game loop
    SDL_Event ev;

    while (isRunning)
    {
        while (SDL_PollEvent(&ev) != 0)
        {

            if (ev.type == SDL_QUIT)
                isRunning = false;
        }


    frameTime++;

    if (FPS / frameTime == 4)
    {

        frameTime = 0;
        playerRect.x += frameWidth;
        if (playerRect.x >= textureWidth)
            playerRect.x =0;

        }
        SDL_RenderClear(renderTarget);
        SDL_RenderCopy(renderTarget, currentImage, &playerRect, NULL);
        SDL_RenderPresent(renderTarget);

    }
    SDL_DestroyWindow(window);
    SDL_DestroyTexture(currentImage);
    SDL_DestroyRenderer(renderTarget);
    window = nullptr;

    renderTarget = nullptr;
    currentImage  = nullptr;

    SDL_Quit();


    return 0;
}

这是错误消息:http://imgur.com/LHMdt5F

3 个答案:

答案 0 :(得分:0)

(我没有足够的声誉对您的主要帖子发表评论,所以我只是在这里发帖:)

下载SDL_image时,您会获得多个.dll&#39;(http://i.imgur.com/tT9yxUW.png)。

由于您收到了特定错误,我认为您没有将libjpeg dll删除到您的目录中。

我相当肯定SDL_image需要那些读取这些特定文件类型。

答案 1 :(得分:0)

IMG_Init返回已初始化的格式的位域。如果结果位域不包含flags中请求的每种格式,则会出错。

if (!(IMG_Init(imgFlags) != imgFlags))检查是否存在错误。然后,您尝试收到错误消息,但没有错误。删除否定运算符。

答案 2 :(得分:0)

当您创建.exe并从IDE运行它时,它通常将可执行文件存储在../bin/ ..目录中。如果Untitled.jpg与源文件位于同一目录中,则无法找到它。

SDL_GetBasePath();将返回您的文件的基本路径。看看它的文档。

来自SDL_GetBasePath()+“Untitled.jpg”的字符串将找到并打开该文件。