2024-3-20-SDL2开发一

2024-3-20-SDL2开发一

三月 20, 2024

SDL2步骤

  1. 要做的第一件事,先初始化,调用 SDL_Init()方法
    • 如果不初始化的话,一些方法在后续是无法起作用的。
    • 例如 未初始化 SDL_AUDIO就无法使用SDL_AUDIO.h内包含的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//我的初始化例子
bool init()// 初始化
//Initialization flag
bool success = true;

//Initialize SDL
if( SDL_Init( SDL_INIT_EVERYTHING ) < 0 )// 初始化全部系统
{
std::cout << "SDL could not initialize! SDL Error: " << SDL_GetError() << std::endl;
success = false;
}
else
{
...... // 这里编写成功后的代码

}

这段初始化代码使用了SDL_INIT_EVERYTHING常量,意思是初始化全部的系统。

如果没有成功初始化会打印出错误来。

  1. 要做的第二件事 创建屏幕 使用SDL_CreateWindow()方法即可

但是在此之前我们需要定义几个变量

1
2
3
4
5
//The window we'll be rendering to
SDL_Window* gWindow = NULL;

//The surface contained by the window
SDL_Surface* gScreenSurface = NULL;

以上定义了一个窗口指针和一个曲面指针,这在我们后续会用到的。

然后定义两个常量

1
2
const int SCREEN_WIDTH = 1920;
const int SCREEN_HEIGHT = 1080;

也就是我们窗口的长和宽了。

然后如何使用SDL_Createwindow()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
extern DECLSPEC SDL_Window * SDLCALL SDL_CreateWindow(const char *title,
int x, int y, int w,
int h, Uint32 flags);

/**
* Create an SDL window from an existing native window.
*
* In some cases (e.g. OpenGL) and on some platforms (e.g. Microsoft Windows)
* the hint `SDL_HINT_VIDEO_WINDOW_SHARE_PIXEL_FORMAT` needs to be configured
* before using SDL_CreateWindowFrom().
*
* \param data a pointer to driver-dependent window creation data, typically
* your native window cast to a void*
* \returns the window that was created or NULL on failure; call
* SDL_GetError() for more information.
*
* \since This function is available since SDL 2.0.0.
*
* \sa SDL_CreateWindow
* \sa SDL_DestroyWindow
*/

我们可以看到它默认接受6个参数

  1. 第1个是标题,字符串类型的
  2. 第2,3个是坐标,这个坐标是相对于屏幕的坐标,就是一屏幕左上角为0,0开始
  3. 第4,5,个很显然是width和height的缩写
  4. 第6个,flag标志位,则是填写一些SDL定义好的常量了

示例

1
gWindow = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_FULLSCREEN );

示例中的代码我们使用了一个特殊的常量: SDL_WINDOWPOS_UNDEFINED

  • 表示将窗口的位置设置为不确定,这意味着窗口将被放置在一个由操作系统确定的默认位置。这通常用于在创建窗口时指定窗口的初始位置。
  1. 要做的第三件事:构建事件循环

如果不去构建事件循环,我们将无法直接和我们的程序交互。所以我们需要构建一个用来监听事件的事件循环。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool quit = false;
SDL_Event e;


//While application is running

while( !quit )
{
//Handle events on queue
while( SDL_PollEvent( &e ) != 0 )
{
//User requests quit
if( e.type == SDL_QUIT )
{
quit = true;
}
}
}

这段代码里我们首先声明了和bool 类型的变量quitSDL_Event类型的变量e.

quit 用来判断是否退出,如果退出则终止循环。

写成!quit 也是为了便于理解,相当于如果quittrue的时候,则主循环终止。

重要的事情有三点:

  • SDL_PollEvent()是 SDL 库中用于轮询事件队列的函数。

  • 当调用 SDL_PollEvent() 函数时,它会检查当前事件队列中是否有任何待处理的事件。如果有事件在队列中,它将从队列中取出一个事件,并将其存储在传入的 SDL_Event 结构体中。然后你可以根据事件的类型和内容来做出相应的处理。

  • SDL_PollEvent() 是一个非阻塞函数,即如果没有事件发生,它会立即返回,不会阻塞程序的执行。

也就是说,内层循环中,SDL_PollEvent()即使一直被反复执行,也不会发生阻塞,但其一直反复的等待事件发生,以便做出相应的处理。