【C++SDL2中文教程】 一,创建我们的第一个窗口(翻译于lazyfoo,使用百度翻译)

在源文件的顶部,我们包含了SDL,因为我们需要SDL函数和数据类型来生成任何SDL代码。我们还将包括C标准IO,以将错误打印到控制台。您可能更习惯于使用iostream,但我在应用程序中使用printf,因为它更安全。对于这些早期应用,请使用您最熟悉的。
在包含标题之后,我们声明要渲染到的窗口的宽度和高度。
 

//使用SDL和标准IO
#include <SDL.h>
#include <stdio.h>

//屏幕尺寸常数
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;



这是我们主要功能的顶部。函数的参数必须是一个整数,后跟一个char*数组,返回类型必须是整数,这一点很重要。任何其他类型的main函数都会导致对main的引用未定义。SDL需要这种类型的main,因此它与多个平台兼容。
然后我们声明我们将在稍后创建的SDL窗口。接下来我们有一个屏幕SDL曲面。SDL曲面只是一个2D图像。二维图像可以从文件中加载,也可以是窗口内的图像。我们将在这个窗口内看到它的图像。
声明窗口和屏幕表面后,我们初始化SDL。如果不先初始化SDL,就不能调用任何SDL函数。因为我们关心的只是使用SDL的视频子系统,所以我们只会将SDL_INIT_video标志传递给它。
当出现错误时,SDL_Init返回-1。当出现错误时,我们希望将发生的情况打印到控制台,否则应用程序只会闪烁一秒钟,然后消失。
如果您以前从未使用过printf,那么它代表打印格式。它打印第一个参数中的字符串和以下参数中的变量。当这里出现错误时,“SDL无法初始化!SDL_错误:”将被写入控制台,后跟SDL_GetError返回的字符串。%s是特殊格式。%s表示从变量列表中输出字符串。由于SDL_GetError是唯一的参数,因此将添加它返回的字符串。SDL_GetError返回SDL函数产生的最新错误。
SDL_GetError是一个非常有用的函数。无论什么时候出了问题,你都需要知道原因。SDL_GetError将让您知道任何SDL函数内部是否发生了任何错误。
 

int main( int argc, char* args[] )
{
    //我们将渲染到的窗口
    SDL_Window* window = NULL;
    
    //窗户的表面
    SDL_Surface* screenSurface = NULL;    //初始化SDL
    if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
    {
        printf( "SDL无法初始化!SDL_错误:%s\n", SDL_GetError() );
    }


 

    else
    {
        //创建窗口
        window = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
        if( window == NULL )
        {
            printf( "无法创建窗口!SDL_错误: %s\n", SDL_GetError() );
        }



如果SDL初始化成功,我们将使用SDL_CreateWindow创建一个窗口。第一个参数设置窗口的标题或窗口的这一部分:
接下来的两个参数定义了创建窗口的x和y位置。因为我们不关心它是在哪里创建的,所以我们只是将SDL_WINDOWPOS_未定义为x和y位置。
接下来的两个参数定义了窗口的宽度和高度。最后一个参数是创建标志。SDL_WINDOW_Showed确保在创建窗口时显示该窗口。
如果出现错误,SDL_CreateWindow将返回NULL。如果没有窗口,我们希望将错误打印到控制台。
 

        else
        {
            //获取窗口表面
            screenSurface = SDL_GetWindowSurface( window );

            //把表面涂成白色
            SDL_FillRect( screenSurface, NULL, SDL_MapRGB( screenSurface->format, 0xFF, 0xFF, 0xFF ) );
            
            //更新曲面
            SDL_UpdateWindowSurface( window );            //等两秒钟
            SDL_Delay( 2000 );
        }
    }



如果窗口创建成功,我们希望获得窗口的曲面,以便绘制到它。SDL_GetWindowsSurface就是这样做的。
为了简化本教程,我们将在这里使用SDL_FillRect填充窗口的表面白色。这里不要太担心这个函数。本教程只关注如何弹出一个窗口。
关于渲染,需要知道的一件重要事情是,仅仅因为你在屏幕表面绘制了一些东西,并不意味着你就能看到它。完成所有绘图后,需要更新窗口,使其显示您绘制的所有内容。调用SDL_UpdateWindowSurface即可完成此操作。
如果我们所做的只是创建窗口,填充它,然后更新它,我们将看到的只是一个窗口闪烁一秒钟,然后关闭。为了防止它消失,我们会打电话给SDL_Delay。SDL_延迟将等待给定的毫秒数。一毫秒是1/1000秒。这意味着上述代码将使窗口等待2000 1/1000秒或2秒。
需要注意的一点是,当SDL延迟时,它不能接受来自键盘或鼠标的输入。当你运行这个程序而它没有响应时,不要惊慌。我们还没有给它提供处理鼠标和键盘的代码。
 

     //破坏窗口
    SDL_DestroyWindow( window );

    //退出SDL子系统
    SDL_Quit();

    return 0;
}



当窗口在那里延迟2秒后,我们将破坏该窗口以释放其内存。这也将处理我们从中得到的SDL_曲面。在解除分配所有内容后,我们退出SDL并返回0以终止程序。

注:侵权删

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用SDL2创建窗口时,可以使用`SDL_CreateWindow()`函数来指定要在哪个显示器上创建窗口。具体做法是在调用该函数时,使用`SDL_WindowFlags`枚举类型中的`SDL_WINDOW_FULLSCREEN_DESKTOP`标志,并将其作为第二个参数传入。同时,还需要指定显示器的索引,可以使用`SDL_GetNumVideoDisplays()`和`SDL_GetDisplayName()`函数获取显示器数量和名称。 以下是示例代码: ```c #include <SDL2/SDL.h> #include <stdio.h> int main(int argc, char* argv[]) { // 初始化SDL if (SDL_Init(SDL_INIT_VIDEO) < 0) { printf("SDL初始化失败: %s\n", SDL_GetError()); return -1; } // 获取第二个显示器的名称 int numDisplays = SDL_GetNumVideoDisplays(); if (numDisplays < 2) { printf("没有检测到第二个显示器!\n"); SDL_Quit(); return -1; } const char* displayName = SDL_GetDisplayName(1); // 创建窗口并指定显示器 SDL_Window* window = SDL_CreateWindow("在指定显示器上创建窗口", SDL_WINDOWPOS_UNDEFINED_DISPLAY(1), SDL_WINDOWPOS_UNDEFINED_DISPLAY(1), 640, 480, SDL_WINDOW_FULLSCREEN_DESKTOP); if (!window) { printf("创建窗口失败: %s\n", SDL_GetError()); SDL_Quit(); return -1; } // 进入消息循环 SDL_Event e; bool quit = false; while (!quit) { while (SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) { quit = true; } } } // 清理资源 SDL_DestroyWindow(window); SDL_Quit(); return 0; } ``` 在上面的示例代码中,我们使用`SDL_GetNumVideoDisplays()`和`SDL_GetDisplayName()`函数获取第二个显示器的名称,并将其作为参数传入`SDL_CreateWindow()`函数中。最后,我们进入消息循环等待用户关闭窗口

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值