SDL2.0创建窗口


***【在线视频教程】***

好文章,来自【福优学苑@音视频+流媒体】


SDL2.0创建窗口

image.png

本节介绍如何使用SDL2(Simple DirectMedia 2)库。

它是一个(相对)易于使用的库,可以在不依赖于特定于操作的功能的情况下添加多媒体功能。

////////////////////////

1.初始化sdl

2.窗口 SDL_Window, 

3.表面 SDL_Surface, 

4.绘制 SDL_XXX

5.退出(清理)

////////////////////////


SDL_Surface* winSurface = NULL;

SDL_Window* window = NULL;

SDL_Init

SDL_Quit

SDL_CreateWindow

SDL_DestroyWindow

SDL_GetWindowSurface

SDL_UpdateWindowSurface

SDL_FillRect



SDL提供的内容:

窗口管理

软件(CPU)和硬件(GPU)渲染2D图形

输入事件系统

时间管理

音频处理

文件IO和库加载

用于3D图形的OpenGL API

SDL有扩展,提供更多功能 - 网络,更好的音频系统,图像加载等。


在本节中,我将引用SDL提供的许多功能。

这些课程的目的是教你如何使用SDL的功能,而不是参数的细节等。因此,每个对SDL对象的引用都将包含指向其SDL文档页面的链接。如果您对函数的参数,返回类型,副作用或结构成员等有疑问,请阅读文档。这将是一个非常宝贵的资源。


始终阅读备注 - 它们可能会显示意外的功能并描述何时应保存/释放内存。

每页底部的“相关功能”部分将显示您还可以使用的其他内容。我们不会涵盖每节课的每一项功能。


建立

使用SDL函数或对象时,您必须(当然)包含其头文件。

文件SDL.h将自动包含其他所有内容 - 通常这就是您需要的全部内容。但是,许多函数都是在特定文件中进行原型化。如果您不确定需要包含哪些内容,请查看文档。


此外,如果正确设置编译器,则应该能够使用尖括号(例如#include <SDL.h>)。这告诉编译器查看其指定的include目录。


初始化SDL

在做任何其他事情之前,您必须将SDL整体初始化。正如您所料,SDL_Init()就是这样做的。如果要初始化SDL的所有部分,请传递SDL_INIT_EVERYTHING。


SDL还允许您单独初始化库的特定子集(或子系统)。要指定,请指定SDL_Init()的标志,或使用SDL_InitSubSystem()。如果您计划单独初始化子系统,只需将0传递给SDL_Init()。

SDL_Init( SDL_INIT_EVERYTHING )


创建一个窗口

您必须创建程序将用于多媒体输入和输出的窗口。从头开始创建Windows应用程序时,必须定义“WinMain”,调用操作系统来获取句柄,创建窗口等等.SDL提供了一个更简单,与平台无关的窗口API。


为了管理窗口,SDL方便地提供结构SDL_Window和SDL_CreateWindow()等功能。


略微切线:您可能会注意到SDL_Window没有文档链接。这是因为结构不透明; 你的程序无法看到“SDL_Window”中实际包含的内容。您只需管理指向SDL_Window的指针即可。


SDL_CreateWindow()执行您期望的操作:它接受指定窗口的名称,大小,位置和选项的参数,并返回指向新SDL_Window结构的指针。有关详细信息,请参阅SDL文档。


SDL_Window  *window;

window = SDL_CreateWindow( "窗口名称", 100, 100, 1280, 720, SDL_WINDOW_SHOWN );


大多数SDL函数将在失败时返回特定值。对于返回指针的函数,此值为NULL。因此,您可以轻松检查操作是否成功。


发生任何错误后,函数SDL_GetError()允许您检索描述错误的字符串。


if ( !window ) {

        cout << "Error creating window: " << SDL_GetError()  << endl;

        return 1;

}


 


表面

创建窗口后,您需要一种绘制方法。SDL将您可以绘制的任何区域(包括加载的图像)抽象为“表面”。(这是为了软件渲染 - 在未来,我们将进入GPU渲染,它不使用表面。)


结构SDL_Surface和诸如SDL_LoadBMP()和SDL_GetWindowSurface()之类的函数提供软件渲染(也称为blitting)API。


正如您所期望的那样,使用SDL_GetWindowSurface()来获取窗口的表面。绘制到此表面后,可以通过调用SDL_UpdateWindowSurface()在窗口中看到结果。



SDL_Surface* winSurface = SDL_GetWindowSurface( window );


// 做绘画 

/// .....


SDL_UpdateWindowSurface( win );


 


绘制一个矩形

要测试窗口表面是否正常工作,可以用颜色填充它。一个非常简单的方法是使用SDL_FillRect()。要填充整个窗口,只需传递NULL而不是SDL_Rect指针。此外,SDL_FillRect()采用表示颜色的特定格式编号。要获得此格式的颜色,可以使用曲面格式和所需的RGB值调用SDL_MapRGB。


SDL_FillRect( winSurface, NULL, SDL_MapRGB( winSurface->format, 255, 90, 120 ));


 


退出

一旦程序完成其操作,它必须销毁窗口并释放相关资源。正如您所料,SDL_DestroyWindow()就是这么做的。该功能将关闭窗口,释放相关内存(包括窗口表面)。


SDL_DestroyWindow( window );

win = NULL;

winSurface = NULL;

最后,要关闭SDL作为一个整体,请调用SDL_Quit()。这是非常明确的。


SDL_Quit();

 


////////////////////////

6.初始化sdl

7.窗口

8.表面

9.绘制

10.退出(清理)

////////////////////////




代码如下:

SDL2_C1_Lesson1
Main_000
Main_CreateWindow
函数名字:Main_CreateWindow
#include <SDL.h>
// You shouldn't really use this statement, but it's fine for small programs
#include <iostream>
using namespace std;
// You must include the command line parameters for your main function to be recognized by SDL
int main(int argc, char* args[]) {
    // Pointers to our window and surface
    SDL_Surface* winSurface = NULL;
    SDL_Window* window = NULL;
    // Initialize SDL. SDL_Init will return -1 if it fails.
    if ( SDL_Init( SDL_INIT_EVERYTHING ) < 0 ) {
        cout << "Error initializing SDL: " << SDL_GetError() << endl;
        return 1;
    } 
    // Create our window
    window = SDL_CreateWindow( "Example", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 1280, 720, SDL_WINDOW_SHOWN );
    // Make sure creating the window succeeded
    if ( !window ) {
        cout << "Error creating window: " << SDL_GetError()  << endl;
        return 1;
    }
    // Get the surface from the window
    winSurface = SDL_GetWindowSurface( window );
    // Make sure getting the surface succeeded
    if ( !winSurface ) {
        cout << "Error getting surface: " << SDL_GetError() << endl;
        return 1;
    }
    // Fill the window with a white rectangle
    SDL_FillRect( winSurface, NULL, SDL_MapRGB( winSurface->format, 255, 255, 255 ) );
    // Update the window display
    SDL_UpdateWindowSurface( window );
    //Delay 3s
    SDL_Delay(3000);
    
    // Destroy the window. This will also destroy the surface
    SDL_DestroyWindow( window );
    // Quit SDL
    SDL_Quit();
    // End the program
    return 0;
}


好文章,来自【福优学苑@音视频+流媒体】
***【在线视频教程】***