【问题标题】:SDL_BlitSurface() not displaying image?SDL_BlitSurface() 不显示图像?
【发布时间】:2012-07-10 17:13:35
【问题描述】:

所以我试图用 SDL 库显示一个简单的图像,但是当我使用函数 SDL_BlitSurface() 时没有任何反应,我得到的只是黑屏。我还应该注意,我的 .bmp 文件、源文件和可执行文件都在同一个目录中。

//SDL Header
#include "SDL/SDL.h"

int main(int argc, char* args[])
{
    //Starts SDL
    SDL_Init(SDL_INIT_EVERYTHING);

    //SDL Surfaces are images that are going to be displayed.
    SDL_Surface* Hello = NULL;
    SDL_Surface* Screen = NULL;

    //Sets the size of the window (Length, Height, Color(bits), Sets the Surface in Software Memory)
    Screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
    //Loads a .bmp image
    Hello = SDL_LoadBMP("Hello.bmp");
    //Applies the loaded image to the screen
    SDL_BlitSurface(Hello, NULL, Screen, NULL);
    //Update Screen
    SDL_Flip(Screen);
    //Pause
    SDL_Delay(2000);
    //Deletes the loaded image from memory
    SDL_FreeSurface(Hello);
    //Quits SDL
    SDL_Quit();

    return 0;
}

【问题讨论】:

    标签: c++ sdl


    【解决方案1】:

    LoadBMP() 是废话。安装 SDL_image 库

    sudo apt-get install SDL_image SDL_image_dev 
    

    (不确定软件包的名称。只需使用 aptitude 或 synaptic 或其他任何方法来找到它们)

    并包含它

    #include "SDL_image.h"
    

    然后你加载你的图片

    SDL_Surface* Hello = IMG_Load("Hello.bmp");
    if (!Hello){
        printf("Ooops, something went wrong: %s\n", IMG_GetError());
        exit(0);
    }
    

    重要提示:请注意,您应该始终进行错误检查并打印出错误。

    if (!Hello)if (Hello == NULL) 相同

    【讨论】:

      【解决方案2】:

      您是否尝试过对任何其他类型的图像进行 blitting?当我第一次启动 SDL 时,我记得 .bmp 文件存在问题。尝试 .jpg 或 .png 并回复我您的代码是否有效。

      【讨论】:

      • 你知道显示.jpg的功能是什么吗? SDL_LoadJPG()?
      • 放弃我一分钟前所说的话——你的代码对我有用。您可能缺少项目中的 .dll 文件。
      • 可能就是这样。我在 Ubuntu 上,你知道 .dll 在哪里吗?
      • 无论你在哪里,但我认为是他们哈哈。在 Windows 中,您手动将它们移动到您的项目目录或 sys64 文件夹。我假设当你在 Ubuntu 上安装时你做了同样的事情,只是文件夹名称不同。如果没有,请找到您的 SDL 文件夹所在的位置并从那里获取它们。您需要将 .dll 文件与项目可执行文件放在同一文件夹中。
      • 是的,我明白了。但是我使用“sudo apt-get install SDL....”从命令行安装了 SDL,所以它为我放置了文件夹。你知道它安装在哪里吗?
      【解决方案3】:

      我有类似的“问题”;可能是预版本,或者与您的图形驱动程序不兼容的版本;让我们弄清楚。 SWSurface 和翻转;我记得,翻转功能仅适用于双缓冲 HW_Surface。

      Screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
      

      请尝试更新而不是翻转。

      SDL_Update(surface);
      

      还有下次:)

      Hello = SDL_LoadBMP("Hello.bmp");
      if(Hello != NULL) {
          //Applies the loaded image to the screen
          SDL_BlitSurface(Hello, NULL, Screen, NULL);
          //Update Screen
          ...
          //Deletes the loaded image from memory
          SDL_FreeSurface(Hello);
      }
      

      因为SDL_FreeSurface(NULL) 会使你的程序崩溃。

      【讨论】:

      • SDL_Flip在非双缓冲表面上调用时,它会在内部自动调用SDL_UpdateRect。因此,它应该适用于所有视频表面。此外,SDL_FreeSurface(NULL) 不会让你的程序崩溃(SDL_FreeSurface 只会在使用NULL 调用时返回)。
      猜你喜欢
      • 2013-02-15
      • 2019-12-13
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多