4

编译器不会返回缺少的 SDL.h,而是 SDL_DisplayFormat 未在位于不同标头的类成员函数的范围内声明,即使我已在 main 中对其进行了初始化。

SDL_Surface *SpriteLoad::Load(char *File)
{
    SDL_Surface *temp = NULL;
    SDL_Surface *opt = NULL;

    if ((temp = IMG_Load(File)) == NULL)
    {
        return NULL;
    }

    opt = SDL_DisplayFormat(temp);
    SDL_FreeSurface(temp);

    return opt;
}

我的主要通过类和成员函数初始化 SDL:

int main (int args, char *argc[])
{
    bool quit = false;

    OnRun Game;           // Class that init's SDL
    Window TestWin;

    GlobalTimer fps;
    TestWin.Debug();

我可以使用 SDL_Window 使用该类创建一个窗口,也可以使用 SDL_GetTick。

编辑:用于 Sprite::Load 的标头当前是从 mercurial 存储库中提取和构建的 SDL、SDL_image、SDL_ttf 和 SDL_mixer。我不认为这是一个链接错误

4

2 回答 2

15

您收到该编译器错误的原因是因为SDL_DisplayFormatSDL-2.0 中不再存在。

查看SDL wiki 文档后,SDL-1.2似乎SDL_DisplayFormat已被SDL_ConvertSurfaceFormatSDL-2.0 取代。

于 2013-07-08T04:49:56.250 回答
1

我会为 SDL 2.0 重写您的代码,如下所示;

SDL_Surface *SpriteLoad::Load(SDL_Window *window, char *File)
{
    SDL_Surface *temp = NULL;
    SDL_Surface *opt = NULL;

    if ((temp = IMG_Load(File)) == NULL)
    {
        return NULL;
    }

    // If the window wasn't created yet, just return the texture
    if(window == NULL) return temp;

    opt = SDL_ConvertSurfaceFormat(temp, SDL_GetWindowPixelFormat(window), 0);
    SDL_FreeSurface(temp);

    return opt;
}

在我自己的代码中,如果还没有创建窗口,我会返回未优化的图像(我有时将它用于窗口前的初始屏幕)。但是您可以更改它,使其释放 temp 并返回 NULL(如果这对您很重要),可能会发出警告以首先创建一个窗口。

于 2017-08-20T22:28:46.657 回答