2

我的 SDL_image 库有问题。我写了一个简单的程序加载一个精灵表并在左键单击时对其进行动画处理。这是代码:

#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>

const int sw=800;
const int sh=450;

int main(){
    SDL_Init(SDL_INIT_EVERYTHING);
    IMG_Init(IMG_INIT_PNG);

    bool quit=false;
    bool shoot=false;
    SDL_Event event;
    Uint32 time;
    unsigned  char frame=0;


    SDL_Window* window = SDL_CreateWindow("Sprite",SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,sw,sh,0);
    SDL_Renderer* render = SDL_CreateRenderer(window,-1,0);

    SDL_Surface* image = IMG_Load("p_pt_12.png");
    printf("IMG_Load: %s\n", IMG_GetError());

    SDL_Texture* texture = SDL_CreateTextureFromSurface(render, image);

    while(!quit){
        if(shoot){
            time=SDL_GetTicks();
            time/=(750/5);
            frame=time%5;
            if(frame==4){
                frame = 0;
                shoot=false;
            }
        }
            SDL_Rect srcrect = { frame*96,0,96,96};
            SDL_Rect dstrect = { (sw-96)/2, (sh-96)/2, 96, 96 };


        SDL_PollEvent(&event);
        switch (event.type){
            case SDL_QUIT:
                quit = true;
                break;
            case SDL_MOUSEBUTTONDOWN:
                if(event.button.button == SDL_BUTTON_LEFT) shoot = true;
                break;
        }

        SDL_RenderClear(render);
        SDL_RenderCopy(render, texture,&srcrect,&dstrect);
        SDL_RenderPresent(render);
    }

    SDL_DestroyTexture(texture);
    SDL_FreeSurface(image);
    SDL_DestroyRenderer(render);
    SDL_DestroyWindow(window);
    IMG_Quit();
    SDL_Quit();

    return 0;
}    

问题是当我尝试运行它时,IMG_Load() 返回 NULL 指针并且 IMG_GetError() 说“不支持的文件格式”。spritesheet 是一个 .png 文件,但 .jpg spritesheet 也是如此。我敢肯定,代码是正确的,因为它可以在具有完全相同图像文件的其他设备上运行,就像魅力一样。我试过重新安装 SDL 和 SDL_image,但它不起作用。SDL_RWops 和 IMG_LoadPNG_RW 也无济于事。我在 64 位 Linux Mint 上使用 Eclipse Kepler SR2(但我也尝试使用 Code::Blocks 12.11 运行它,结果相同)。

我将不胜感激任何帮助,谢谢!

4

1 回答 1

2

您的代码是正确的并且对我有用。可能您的系统缺少 sdl_image 处理图像所需的一些库,例如 libpng 和 zlib。安装它们并让我们知道它是否有效。

于 2014-04-27T14:37:22.897 回答