原文地址:http://twinklebeardev.blogspot.com/2012/07/lesson-0-setting-up-sdl.html
这一节我们将学习简单的将一张图片绘制到屏幕上的方法。具体来讲是绘制下面这张图片。
你可以通过右键另存为下载这张图片。这是一个指向一个我建立的Github版本库里的图片的链接,因为这样做会保存一个SDL能够加载的真正的BMP图片。 这个版本库同时也是我教程中例子的源代码和其他相关资源(assets)的主页。如果你丢了资源或者想要偷看一下我的代码,就从这里抓好了。但切忌复制粘贴!
第一步总是include SDL的头文件
1
|
|
注意,这依赖于你的SDL设置。对Linux用户来说,也许需要这么写:
1 2 3 4 |
|
——除非你在编译选项里指定了头文件的绝对路径(对linux用户来说)。
首先我们需要启动SDL以便使用它。注意:如果SDL初始化失败的话,它会返回-1。这样的情况下,我们可以使用SDL_GetError()函数来输出错误消息,然后退出程序。
针对Visual Studio用户的说明:如果你在连接器选项中把子系统设置为了windows,你将不会看到输出到控制台的结果。要获得这个结果,你必须把子系统改为“未设置”并且把#undef main放到main函数前面。当改回windows子系统的时候,你要确认一下你把#undef main这行代码去掉了,否则你会得到链接错误。
然后我们还需要创建一个能让我们绘制图像的窗口,我们可以使用SDL_Window:
SDL_CreateWindow这个函数的作用是为我们创建一个窗口,并且返回一个SDL_Window指针。这个函数的第一个参数是窗口的标题,之后是窗口所打开的位置的x,y坐标,之后的参数是窗口的长度和宽度。最后一个参数是窗口的各种flag,因为我们想要窗口在创建之后马上弹出,所以这里我们填SDL_WINDOW_SHOWN。
我还加了一些保证安全的措施。把指针初始化为了nullptr,并在创建了窗口之后,检查了这个指针是否仍为空。如果创建窗口失败了,这个指针将仍然是空的,这样我们就需要中止这个程序。把指针初始化为空NULL总是很重要的,或者也可以利用C++ 11新标准把它初始化为nullptr。
现在,仅仅只是打开一个窗口对我们来说意义不大,我们需要把东西画到窗口上。所以现在让我们获取一个SDL_Renderer并且运行吧。
我们的renderer(渲染器)是用SDL_CreateRenderer这个函数创建的,这个函数还需要我们指定用来绘制的窗口。我们也可以指定一个可选的显卡驱动,或者直接把参数设为-1,好让SDL自动选择适合我们指定的选项的驱动。这样做也许是最好的选择,因为这样SDL会自动帮你选择你所需要的(也就是你在最后一个参数中用那些标志指定的)最合适的驱动。
在这里我们指定了SDL_RENDERER_ACCELERATED,因为我们想使用硬件加速的renderer,换句话说就是想利用显卡的力量。我们还指定了 SDL_RENDERER_PRESENTVSYNC标志,因为我们想要使用SDL_RendererPresent这个函数,这个函数将会以显示器的刷新率来更新画面。
注意,在这里我们使用了和之前创建窗口时一样的错误处理方式。
现在是时候加载一张图片并把它画到屏幕上啦!你应该已经把这张图片下载到当前文件夹下了,或者把这张图放在你生成的可执行文件附近也是可以的。
尽管SDL2.0使用SDL_Texture来用硬件加速绘制图像,我们还是需要使用SDL_LoadBMP函数将图片加载到SDL_Surface中,因为本节我们没有使用SDL_image这个神奇的扩展库(我们以后会用到的)。
注意在这里你需要更改传给SDL_LoadBMP的图片路径,以便和你电脑上的图片路径匹配。或者如果你想使用我现在这样的文件结构的话,你也可以保持这个参数原来的样子而不改动。
要有效地利用硬件加速来绘制,我们必须把SDL_Surface转化为SDL_Texture,这样renderer才能够绘制。
在这里我们也把刚才的SDL_Surface释放掉,因为以后就用不着它了。
现在我们可以把Texture画到renderer上了。首先,我们先使用SDL_RenderClear来清空屏幕,然后我们使用SDL_RenderCopy来把texture画上去。最后,我们使用SDL_RenderPresent来更新屏幕的画面。
这里我们给SDL_RenderCopy传了两个NULL值。第一个NULL是一个指向源矩形的指针,也就是说,从图像上裁剪下的一块矩形;而另一个是指向目标矩形的指针。我们将NULL传入这两个参数,是告诉SDL绘制整个源图像(第一个NULL),并把它画在屏幕上(0,0 )的位置,并拉伸这个图像让它填满整个窗口(第二个NULL)。这一点以后还会详细说明。
我们还用SDL_Delay告诉程序让它等2000毫秒,以便于我们可以看到这个窗口。不让它等待的话,这个程序就会在窗口弹出之后立刻退出的。
在退出程序之前,我们有必要释放掉我们这个窗口、renderer还有texture所用的全部内存。这可以通过调用几次SDL_Destroy来完成。
退出SDL以停止程序,并且返回0.
然后编译并检查这个程序吧!不要忘了把SDL.dll放到你的可执行文件的文件夹里,否则它会给你弹出错误提示。如果你用的是linux系统,你应该已经安装了SDL的共享库了,所以你应该不会遇到什么问题。
现在,恭喜你写出第一个SDL2.0程序!
Troubleshooting
If your program fails to compile make sure you’ve properly configured your libraries and linked to the correct path in your include statement.
If your program complains about SDL.dll missing, make sure it is located in the same folder as the executable.
如果你的程序报错说SDL.dll丢失,确认你是不是已经把它放在了可执行文件所在的文件夹里。
If your program runs but exits with out displaying anything make sure your image path is set correctly. If that doesn’t help try writing some cout or file output into the program, although depending on your platform and configuration settings cout may not appear.
如果你的程序运行之后却什么都没显示,很快退出了,那么确认一下你的图片路径写对了。如果这还不行,你可以试着写一些cout或者输出到文件来看错误提示。不过取决于你的平台还有配置选项,cout的结果可能不会显示。
第一节结束。
这就是第一节了。我们第二节:别把什么都放到main里再见吧!