SDL2新手入门 —— 初始化并创建窗口

SDL2 阅读(240)

# 初始化并创建窗口  

编写SDL2程序首先要初始化SDL2的子系统,例如要使用定时器则需要初始化定时器子系统,要播放声音则需要初始化声音子系统。初始化SDL子系统需要使用[`SDL_Init`](http://wiki.libsdl.org/SDL_Init)函数或[`SDL_InitSubSystem`](http://wiki.libsdl.org/SDL_InitSubSystem),这两个函数是完全一样的。  
```C  
 #include <SDL.h>
int SDL_Init(Uint32 flags);
int SDL_InitSubSystem(Uint32 flags);
//成功返回0,否则返回非0
```  
这两个函数的参数是要初始化的子系统,通过位或运算(|)初始化多个子系统 :   

|宏定义                        | 说明                      |
|:-                           |:-                         |
| `SDL_INIT_TIMER`            | 初始化`时钟`子系统          |
| `SDL_INIT_AUDIO`            | 初始化`音频`子系统          |
| `SDL_INIT_VIDEO`            | 初始化`视频`子系统          |
| `SDL_INIT_JOYSTICK`         | 初始化`操纵杆`子系统        |
| `SDL_INIT_HAPTIC`           | 初始化`触摸感应`子系统      |
| `SDL_INIT_GAMECONTROLLER`   | 初始化`游戏控制器`子系统    |
| `SDL_INIT_EVENTS`           | 初始化`事件`子系统         |
| `SDL_INIT_EVERYTHING`       | 初始化全部子系统           |

初始化`VIDEO`子系统之后即可使用[`SDL_CreateWindow`](http://wiki.libsdl.org/SDL_CreateWindow)来创建一个窗口,它的参数依次是窗口的标题、横坐标、纵坐标、宽度、高度和[属性](http://wiki.libsdl.org/SDL_WindowFlags),可以将x,y设为`SDL_WINDOWPOS_CENTER`使窗口居中或`SDL_WINDOWPOS_UNDEFINED`让操作系统自动分配坐标。  
```C
#include <SDL_video.h>
SDL_Window* SDL_CreateWindow(const char* title,int x,int y,
                                int w,int h,Uint32 flag);
//成功返回窗口指针,失败返回NULL
```

创建窗口之后需要通过`EVENTS`子系统的[`SDL_PollEvent`](http://wiki.libsdl.org/SDL_PollEvent)函数捕获退出事件来控制程序退出。退出之前应当使用[`SDL_DestroyWindow`](http://wiki.libsdl.org/SDL_DestroyWindow)销毁窗口释放资源,并使用[`SDL_Quit`](http://wiki.libsdl.org/SDL_Quit)关闭SDL子系统。  

```C
#include <SDL_video.h>
void SDL_DestroyWindow(SDL_Window* window);

#include <SDL.h>
void SDL_Quit(void);
```

SDL2函数如果发生了错误,可以使用[`SDL_GetError`](http://wiki.libsdl.org/SDL_GetError)获得错误的内容,并且可以使用[`SDL_Log`](http://wiki.libsdl.org/SDL_Log)函数打印日志。  
```C
#include <SDL_error.h>
const char* SDL_GetError(void);
//返回错误消息的字符串

#include <SDL_log.h>
void SDL_Log(const char* fmt,...);
```

## 创建窗口的完整代码  
```C
#include <SDL2/SDL.h>
 
int main(int argc,char* argv[])
{
    SDL_Init(SDL_INIT_EVERYTHING);
    SDL_Window* win =  SDL_CreateWindow("SDL2",SDL_WINDOWPOS_CENTERED,      
                                        SDL_WINDOWPOS_CENTERED,640,400,
                                        SDL_WINDOW_RESIZABLE);
     
    SDL_Event e;//定义保存事件的变量
    while(1)
    {
        SDL_PollEvent(&e); //捕获事件
        if(e.type == SDL_QUIT) //如果事件类型是退出,则跳出循环
        {
            break;
        }
    }
    /* 销毁窗口 */
    SDL_DestroyWindow(win);
    /* 关闭SDL子系统 */
    SDL_Quit();
     
    return 0;
}
```

Markdown使用 帮助


匿名

富强 民主 文明 和谐 自由 平等 公正 法治 爱国 敬业 诚信 友善

匿名

在山的那边,海的那边,有一群蓝精灵。

匿名

我有一头小毛驴,我从来也不骑。

匿名

富强 民主 文明 和谐 自由 平等 公正 法治 爱国 敬业 诚信 友善

匿名

我有一头小毛驴,我从来也不骑。

匿名

我有一头小毛驴,我从来也不骑。

匿名

爆ぜろリアル  弾けろシナプス   バニッシュメント・ディス・ワールド!

匿名

在山的那边,海的那边,有一群蓝精灵。