SDL2入门教程(01_hello_SDL)
2017-09-07 17:05
169 查看
注: 本教程翻译自 lazyfoo的教程,原网址戳这里。翻译目的为鼓励自己坚持下去,可能语言不准确,仅供参考。
因为会用到SDL库所以在代码一开始包含
包含头文件之后,我们定义了存储要生成的窗口的宽(width)和高(height)的常量。
这就是主函数的开头,在这里有一点很重要——那就是主函数的参数一定是一个
然后定义了之后我们将要创建的SDL窗口的指针,紧接着我们定义了一个screen SDL surface(不太会翻译)。
SDL surface就是一个2D的图像,它的指针既可以指向文件中的图像,也可以指向屏幕上正在显示的图像。
(A SDL surface is just a 2D image. A 2D image can be loaded from a file or it can be the image inside of a window. )在这里它指向屏幕里的窗口中的图像(所以名字叫screenSurface)
定义完窗口和screen surface之后,对SDL进行初始化。若没有对SDL进行初始化,则无法调用任何SDL函数。因为在这篇教程里面我们只需要用SDL的视频子系统(video subsystem)创建一个窗口,我们只给这个初始化函数
当有错误发生时,
对于从来没有使用过
如果SDL成功初始化,我们就能使用
接下来的两个参数定义了窗口生成处的x和y的坐标。因为我们暂时不用关心它创建在哪里,所以就直接使用
接下来的两个参数定义了窗口的宽度和高度。最后那个参数是创建标签(creation flag)。以
如果有任何错误,
如果窗口创建成功,如果能获取到窗口的surface,我们就能在surface上作图。而
为了使这篇教程尽量简单,我们所要对这个窗口做的就只是使用
这里说一下关于渲染的很重要的事,在screen surface上更改或画上一些东西并不意味着你会看到更改后的surface。只有更新(update)窗口后,它才会展示你更改之后的surface。操作完成后使用
如果只做创建窗口,填充,更新的步骤,那我们会看到一个窗口极快地闪了一下就关闭了。为了使窗口持续更长的时间,我们使用
需要注意的是当SDL正处于持续时间中(delaying),它无法从键盘或是鼠标接受输入。所以当你跑这段代码时出现程序未响应请不要慌张。另外,我们还没有学如何响应键盘和鼠标事件。
在窗口保持两秒之后,这里的代码会销毁这个窗口并释放其内存。这也会使指向这个window的
下载此教程中涉及的源代码,原作者链接:戳我
注: 本教程翻译自 lazyfoo的教程,原网址戳这里。翻译目的为鼓励自己坚持下去,可能语言不准确,仅供参考。
Hello SDL: 你的第一个图形窗口
这一篇教程包含最主要也最基础的一步——弹出一个窗口(Window)//使用 SDL 和 标准 IO #include <SDL.h> #include <stdio.h> //定义屏幕尺寸常量 const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480;
因为会用到SDL库所以在代码一开始包含
SDL.h,这里使用
stdio.h而不是
iostream是因为原作者喜欢用C的标准IO(理由是more thread safe),对于这样比较简单的程序,使用你习惯的IO就好。
包含头文件之后,我们定义了存储要生成的窗口的宽(width)和高(height)的常量。
int main( int argc, char* args[] ) { //将要渲染的窗口 SDL_Window* window = NULL; //窗口含有的surface SDL_Surface* screenSurface = NULL; //初始化SDL if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) { printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() ); }
这就是主函数的开头,在这里有一点很重要——那就是主函数的参数一定是一个
int以及
char *数组(顺序不能变)且主函数的返回值必须为
int。任何其他形式的主函数会导致对主函数未定义的引用(an undefined reference to main),这样的主函数才能让SDL与多个平台兼容。
然后定义了之后我们将要创建的SDL窗口的指针,紧接着我们定义了一个screen SDL surface(不太会翻译)。
SDL surface就是一个2D的图像,它的指针既可以指向文件中的图像,也可以指向屏幕上正在显示的图像。
(A SDL surface is just a 2D image. A 2D image can be loaded from a file or it can be the image inside of a window. )在这里它指向屏幕里的窗口中的图像(所以名字叫screenSurface)
定义完窗口和screen surface之后,对SDL进行初始化。若没有对SDL进行初始化,则无法调用任何SDL函数。因为在这篇教程里面我们只需要用SDL的视频子系统(video subsystem)创建一个窗口,我们只给这个初始化函数
SDL_INIT_VIDEO作为参数。
当有错误发生时,
SDL_Init()函数返回-1。此处对其返回值进行检查的目的是如果初始化失败,可以从控制台中知道到底发生了什么错误,从而避免因错误窗口闪一下就关闭了的情况。
对于从来没有使用过
printf()这个函数的人,你只需要知道它表示按照格式打印。它将作为第一个参数的字符串和其后的变量按照格式打印。在此处的程序中,一旦发生错误,那么字符串”SDL could not initialize! SDL_Error:”会和
SDL_GetError()这个函数所返回的字符串一起打印到控制台中。那个’%s’表示从后面的参数表中打印相对应的字符串。
SDL_GetError()函数总是返回SDL的函数产生的最新的错误信息。
SDL_GetError()是一个非常有用的函数。只要你需要知道哪里出错了,它总能让你及时知道任何SDL函数中发生的错误。
else { //创建 window window = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN ); if( window == NULL ) { printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() ); }
如果SDL成功初始化,我们就能使用
SDL_CreatWindow()函数来创建窗口。第一个参数设置窗口的标题或窗口的这一部分:
接下来的两个参数定义了窗口生成处的x和y的坐标。因为我们暂时不用关心它创建在哪里,所以就直接使用
SDL_WINDOWPOS_UNDEFINED这个预定义的常量来初始化x和y坐标。
接下来的两个参数定义了窗口的宽度和高度。最后那个参数是创建标签(creation flag)。以
SDL_WINDOW_SHOWN作为此参数时,表示窗口一创建即为可见的(非隐藏窗口?)
如果有任何错误,
SDL_CreateWindow()返回
NULL。如果没有窗口产生,我们会想在控制台里知道原因的,所以使用了
printf()和
SDL_GetError()来打印相应的错误。
else { //获取 window surface screenSurface = SDL_GetWindowSurface( window ); //用白色填充surface SDL_FillRect( screenSurface, NULL, SDL_MapRGB( screenSurface->format, 0xFF, 0xFF, 0xFF ) ); //更新surface SDL_UpdateWindowSurface( window ); //延迟两秒 SDL_Delay( 2000 ); } }
如果窗口创建成功,如果能获取到窗口的surface,我们就能在surface上作图。而
SDL_GetWindowSurface()就是干这个的。
为了使这篇教程尽量简单,我们所要对这个窗口做的就只是使用
SDL_FillRect()函数来填充整个窗口。不用太在意这里的这个函数,本篇教程的目的只是创建一个窗口而已。
这里说一下关于渲染的很重要的事,在screen surface上更改或画上一些东西并不意味着你会看到更改后的surface。只有更新(update)窗口后,它才会展示你更改之后的surface。操作完成后使用
SDL_UpdateWindowSurface()这个函数就行了。
如果只做创建窗口,填充,更新的步骤,那我们会看到一个窗口极快地闪了一下就关闭了。为了使窗口持续更长的时间,我们使用
SDL_Delay()。它会让窗口持续(delay)相应数量的毫秒。1毫秒=1/1000秒。在上面的代码中,我们使用的参数会让窗口保持2000个 1/10000秒也就是保持2秒。
需要注意的是当SDL正处于持续时间中(delaying),它无法从键盘或是鼠标接受输入。所以当你跑这段代码时出现程序未响应请不要慌张。另外,我们还没有学如何响应键盘和鼠标事件。
//销毁 window SDL_DestroyWindow( window ); //退出 SDL subsystems SDL_Quit(); return 0; }
在窗口保持两秒之后,这里的代码会销毁这个窗口并释放其内存。这也会使指向这个window的
SDL_Surface失效。当所有的的析构工作完成后,我们退出了SDL并返回0来终止这段程序。
下载此教程中涉及的源代码,原作者链接:戳我
注: 本教程翻译自 lazyfoo的教程,原网址戳这里。翻译目的为鼓励自己坚持下去,可能语言不准确,仅供参考。
相关文章推荐
- ExtJS 4.2 教程-01:Hello ExtJS
- C++ SDL教程翻译 Lesson 01 Hello SDL
- SDL游戏开发教程01(环境准备 mingw+eclipse)
- ExtJS 4.2 教程-01:Hello ExtJS
- [置顶] [Java教程 01]Hello,Java!
- MiniUI快速入门教程(二)编写第一个MiniUI程序:Hello, world!
- struts2_教程01
- flask入门的教程-Hello, World! (this article)
- Qt教程 第一章:Hello, World!
- commonlisp教程以及学习笔记-01
- 背包问题系列教程(1):01背包问题
- 【三石jQuery视频教程】01.图片循环展示_重发
- 猫哥网页设计视频教程01[网络基础]什么是上网
- SDL入门教程(一):3、MinGW 下的安装与设置
- PyQt5教程-01-最简单的窗口
- 数据结构教程(java语言描述)徐孝凯主编----复习摘要01
- ActiveReports 报表应用教程 (1)---Hello ActiveReports
- 【Arduino】开发入门教程【五】Hello Arduino
- SDL游戏教程第五课 动画
- 【GStreamer开发】GStreamer播放教程01——playbin2的使用