SDL2-Tutorial00

  SDL(Simple DirectMedia Layer) 是一个的第三方图形库(library),用于主要2D游戏开发(当然你也可以用它开发普通的应用)。优点有轻量,跨平台,简单。很适合想做游戏开发但目前仅有基本的C++基础(至少了解类和指针的操作)的童鞋。

  这是官网地址,英文OK的童鞋可以在wiki板块得到很大帮助。在这篇博客的底部会有一些英文资源为这些童鞋准备。

  不同平台的安装方法不一,这里我就不解释了(自行Google)。最新的稳定版本是SDL2.0.3(不过只要是SDL2.0或以上基本没区别),这一个系列的博客将写下我的学习历程和对一些问题的感想,也有翻译国外一些教程。不定期更新。

  这篇博客是用SDL2创建一个简单的窗口程序。

  要使用SDL2,要包含“SDL.h”的头文件:

1 #include "SDL.h"

  于是有了下面的大体结构:

1 #include "SDL.h"
2 #include <iostream>
3 int main(int argc,char* argv[[]){
4
5     return 0;
6 }

  不同于学习C++时的int main(){return 0;},这里的main函数有了两个很怪的参数,对于初学者只要先记住就好。

  接下来是初始化SDL:

1 SDL_Init(SDL_INIT_EVERYTHING);

  这个SDL_Init函数的语法是SDL_Init(Uint32 flags).这个Uint32类型是SDL中的一种特殊类型,是Unsigned Int 32(占32字节的无符号整数)的缩写。这里的flags有以下几个:

  如果你英文实在不好我还制作了如下表格(翻译水平很烂):

  

  作为初学者,了解SDL_INIT_AUDIO,SDL_INIT_VIDEO,SDL_INIT_EVERYTHING就已足够。我一般选择SDL_INIT_EVERYTHING,应为它初始化了所有的分支系统(不管是不是我需要的,但一定可以满足我的需求)。

  而SDL_Init函数的返回类型是int,如果初始化成功就返回0,失败就返回一个负数。所以要检查是否初始化成功,一个if语句就OK:

#include "SDL.h"
#include <iostream>
int main(int argc,char* argv[]){
    if(SDL_Init(SDL_INIT_EVERYTHING)!=0){
        std::cout<<"初始化失败"<<std::endl;
    }else{
        //做我们想干的事情
    }
    return 0;
}    

  我们想干什么呢?我们要创建一个窗口!得有一个窗口对象。SDL中这个对象的类型为SDL_Window.

1 SDL_Window* myWindow;

  你可能对为吗要声明一个指针而不是直接声明对象有疑问,这个我只能说为了以后方便。现在我们把myWindow作为全局变量。

  目前为止我们声明了一个指针,但我们的窗口没有属性(标题,位置,大小,展现形式),SDL中用SDL_CreateWindow函数来给窗口添加属性。

  SDL_CreateWindow函数的语法如下:

1 SDL_Window* SDL_CreateWindow(const char* title,
2                              int         x,
3                              int         y,
4                              int         w,
5                              int         h,
6                              Uint32      flags)

  6个参数,title代表window的标题,x和y是window左上角的坐标(当然你也可以填SDL_WINDOWPOS_CENTERED来让你的窗口在屏幕正中间),w和h是window的宽和高。最后一个flags有以下几个可选:

  好多,我就不翻译了,英文不好的童鞋还是好好学一下吧,满眼都是英文,你不懂会打击你的。

  这里我认为3个应该掌握:1.SDL_WINDOW_SHOWN(window不可改变大小)2.SDL_WINDOW_RESIZABLE(window可改变大小)3.SDL_WINDOW_FULLSCRREEN(全屏)。大家可以把每一个都试一下。我个人习惯SDL_WINDOW_RESIZABLE。现在代码应该长这个样子:

 1 #include "SDL.h"
 2 #include <iostream>
 3 SDL_Window* myWindow;
 4 int main(int argc,char* argv[]){
 5     if(SDL_Init(SDL_INIT_EVERYTHING)!=0){
 6         std::cout<<"初始化SDL失败"<<std::endl;
 7     }else{
 8         myWindow=SDL_CreateWindow("Demo",300,300,600,450,SDL_WINDOW_RESIZABLE);
 9     }
10     return 0;
11 }    

  这里需要说明的是SDL_CreateWindow是有返回类型的,他返回一个(SDL_Window*)类型的指针。在这里正好是myWindow。

  要检查myWindow是否创建成功,只需检查myWindow是否是空指针就好。代码:

1 if(myWindow==NULL){
2     std::cout<<"创建窗口失败"<<std::endl;
3 }else{
4      //做我们想干的事
5 }

  有初始就有毁灭,我们初始化了SDL和myWindow,程序不可能一直运行,是时候毁灭他们了。

  

1 SDL_DestroyWindow(myWindow);//毁灭窗口
2 SDL_Quit();//退出程序

  现在代码应该长这样:

 1 #include "SDL.h"
 2 #include <iostream>
 3 SDL_Window* myWindow;
 4 int main(int argc,char* argv[]){
 5     if(SDL_Init(SDL_INIT_EVERYTHING)!=0){
 6         std::cout<<"初始化失败"<<std::endl;
 7     }else{
 8         myWindow=SDL_CreateWindow("Demo",300,300,600,450,SDL_WINDOW_RESIZABLE);
 9         if(myWindow==NULL){
10             std::cout<<"创建窗口失败"<<std::endl;
11          }else{
12                  //做我们想干的事
13         }
14     SDL_DestroyWindow(myWindow);
15     SDL_Quit();
16     return 0;
17   }  }    

  可是想一下我们到底干了些什么:我们创建了一个window,然后立马把它毁灭,仅此而已!!这个程序可以运行,但我们什么也看不到(程序是逐语句运行的,myWindow创建后立即被毁灭的速度很快);怎样才能看到我们辛苦创建的window呢?

  在毁灭窗口前用SDL_Delay函数,它的语法是:

1 SDL_Delay(int 毫秒数);

  比如SDL_Delay(5000);就可以让SDL在执行其后的语句前停留5秒钟;

  最终代码:

 1 #include "SDL.h"
 2 #include <iostream>
 3 SDL_Window* myWindow;
 4 int main(int argc,char* argv[]){
 5     if(SDL_Init(SDL_INIT_EVERYTHING)!=0){
 6         std::cout<<"初始化失败"<<std::endl;
 7     }else{
 8         myWindow=SDL_CreateWindow("Demo",300,300,600,450,SDL_WINDOW_RESIZABLE);
 9         if(myWindow==NULL){
10             std::cout<<"创建窗口失败"<<std::endl;
11          }else{
12                  //做我们想干的事
13         }
14     SDL_Delay(5000);
15     SDL_DestroyWindow(myWindow);
16     SDL_Quit();
17     return 0;
18     }
19 }    

  运行后你将看到一个宽600,高450的窗口,它会持续5秒,之后自动消失。

  2个SDL2的英文资源:

 1.headerphile.com(这个人网站的SDL2教程简洁又不乏深度)

 2.SDL2 Game Development(为数不多的SDL2书籍,讲的蛮好),下一篇博客我将给出百度网盘链接

时间: 2024-08-09 23:55:11

SDL2-Tutorial00的相关文章

最简单的基于FFMPEG+SDL的视频播放器 ver2 (採用SDL2.0)

===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x) 最简单的基于FFMPEG+SDL的视频播放器 ver2 (採用SDL2.0) 最简单的基于FFmpeg的解码器-纯净版(不包括libavformat) 最简单的基于FFMPEG+SDL的视频播放器:拆分-解码器和播放器 最简单的基于FFMPEG的Hellowor

SDL2源码分析5:更新纹理(SDL_UpdateTexture())

===================================================== SDL源码分析系列文章列表: SDL2源码分析1:初始化(SDL_Init()) SDL2源码分析2:窗体(SDL_Window) SDL2源码分析3:渲染器(SDL_Renderer) SDL2源码分析4:纹理(SDL_Texture) SDL2源码分析5:更新纹理(SDL_UpdateTexture()) SDL2源码分析6:拷贝到渲染器(SDL_RenderCopy()) SDL2源

SDL2开发环境搭建

开发环境 Visual studio 2012 Win8.1 64位 SDL2库及扩展库网址和下载库地址 SDL2库 http://www.libsdl.org/download-2.0.php 下载地址 http://www.libsdl.org/release/SDL2-devel-2.0.3-VC.zip 多通道音频混合器库 http://www.libsdl.org/projects/SDL_mixer/ 下载地址 http://www.libsdl.org/projects/SDL_m

[原]零基础学习SDL开发之在Android使用SDL2.0显示BMP图

关于如何移植SDL2.0到安卓上面来参考我的上一篇文章:[原]零基础学习SDL开发之移植SDL2.0到Android 在一篇文章我们主要使用SDL2.0来加载一张BMP图来渲染显示. 博主的开发环境:Ubuntu 14.04 64位,Eclipse + CDT + ADT+NDK 博主曾经自己使用NDK编译出了libSDL2.so,然后使用共享库的方式来调用libSDL2中的函数,结果发现SDL\src\core\android\SDL_android.c 这个jni函数写的实在是不够自己另外做

基于ffmpeg+SDL2 实现简单rtsp播放器

参考资料: 编译参考:         http://blog.chinaunix.net/uid-20718335-id-2980793.html 代码参考:         http://blog.csdn.net/leixiaohua1020/article/details/8652605 实现ffmpeg在window下编译,并基于ffmpeg动态库用测试程序播放本地文件和RTSP视频流 csdn博客插个图片怎么这么麻烦,上篇辛辛苦苦截了那么多图一上传全没了,代码里想变色结果发布了一看全

用 SDL2 在屏幕上打印文本

打印完图片,是时候打印文字了.这里引用了SDL的字体扩展库,SDL2_ttf.lib,需要包含相应的头文件. 环境:SDL2 + VC++2015 下面的代码将在窗口打印一段文字,并对相应的操作做出响应. 这次把错误处理给精简掉了,代码看起来更清爽. 1 #include <iostream> 2 #include "SDL.h" 3 #include "SDL_ttf.h" 4 5 int main(int argc, char** argv) 6 {

用 SDL2 处理精灵图

上面就是一个精灵图,由多个固定间隔的图标组成.利用精灵图的好处就是不必将图标逐个读入内存进行操作.我们可以将精灵图中需要的部分用一个个矩形截取下来,然后再输出到渲染器上. 环境:SDL2 + VC++2015 下面的代码将打开sprite.png,并对相应的操作做出响应. sprite.png 1 #include <stdexcept> 2 #include <string> 3 #include <iostream> 4 #include "SDL.h&q

SDL2+OpenGL (4)混合图像产生动态效果

利用OpenGL的glBlendFunc函数将下面这张图作为纹理产生动态效果 1 #include <GL/glew.h> 2 #include <SDL2/SDL.h> 3 #include <SDL2/SDL_opengl.h> 4 #include <SDL2/SDL_image.h> 5 bool quit; 6 SDL_Window* window; 7 SDL_GLContext glContext; 8 SDL_Event sdlEvent;

CodeBlocks16.01 MinGW32位 配置SDL2.0.4

首先先从官网https://www.libsdl.org/下载开发库SDL2-devel-2.0.4-mingw.tar.gz (MinGW 32/64-bit). 解压后,看到i686-w64-mingw32(32位)和x86_64-w64-mingw32(64位)这两个文件夹. 将i686-w64-mingw32\include里的SDL2文件夹复制到CodeBlocks\MinGW\include中,i686-w64-mingw32\lib里的*.a文件复制到CodeBlocks\MinG

SDL2.0例子代码分析-----CheckKeys Project

SDL简介 SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成.SDL提供了数种控制图像.声音.输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux.Windows.Mac OS X等)的应用软件.目前SDL多用于开发游戏.模拟器.媒体播放器等多媒体应用领域. SDL1.2和SDL2的差别 SDK1.2和SDL2.1系列的API接口变动的不小,当然功能也大大增强,支持多线程窗口. 具体的change 请看 h