SDL 2 游戏编程(一)第一个图形界面

本文介绍如何使用SDL库创建一个简单的图形窗口,并填充白色背景。文章详细讲解了代码每一部分的功能,包括初始化SDL、创建窗口、获取窗口表面、填充颜色及更新窗口等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接Hello SDL: Your First Graphics Window

//Using SDL and standard IO
#include <SDL.h>
#include <stdio.h>

//Screen dimension constants
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;

在源文件的开始我们需要包含SDL的库,要不然怎么使用SDL提供的函数和数据类型呢。同时也要包含C语言的标准IO,这是为了在控制台输出错误信息的。当然用iostream也没什么问题,但是使用printf函数会使程序更加的线程安全。你们爱用啥用啥吧。

包含了头文件之后,声明窗口的大小。

int main( int argc, char* args[] )
{
    //The window we'll be rendering to
    SDL_Window* window = NULL;

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

    //Initialize SDL
    if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
    {
        printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
    }
Here's the top 

这段代码是main函数的开头部分,注意(敲黑板),main函数的参数有两个,是一个int类型,紧接着就是一个char*数组,返回值的类型是int,如果使用其他类型或者参数数目不对那么会导致编译错误。

在main函数中,我们先声明了SDL window, 这是一会儿我们要创建的窗口,然后声明了SDL surface,SDL surface仅仅是一个2D图像,它可以是从文件中读取的图片,也可以是窗口中显示的图像,在这里,它是window窗口中显示的图像。

下一步,我们需要初始化SDL,在初始化SDL之前,SDL提供的任何函数都是不可用的。由于我们只想初始化视频子系统,所以只给初始化函数传递SDL_INIT_VIDEO标志作为参数。

当发生异常的时候,SDL_Init函数将会返回-1,当发生异常的时候,我们希望在控制台显示有关异常的信息。

SDL_GetError是一个非常好用的函数,当程序发生错误,它会告诉你哪个SDL函数出错了以及出了什么错误。

    else
    {
        //Create window
        window = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
        if( window == NULL )
        {
            printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
        }

如果SDL成功的初始化了,我们希望通过SDL_CreateWindow函数来创建一个窗口。第一个参数是窗口的标题名称。第二第三个参数是定义了窗口出现的位置,分别是x坐标和y坐标,反正我们不关心它出现在哪儿,所以使用SDL_WINDOWPOS_UNDEFINED作为参数。

第四第五个参数是窗口的宽度和高度,最后一个参数是creation flags,SDL_WINDOW_SHOWN确保了窗口被创建的时候是可见的。

如果创建窗口发生了错误,那么SDL_CreateWindow将会返回NULL。如果窗口没有被创建,我们希望在控制台显示错误信息。

        else
        {
            //Get window surface
            screenSurface = SDL_GetWindowSurface( window );

            //Fill the surface white
            SDL_FillRect( screenSurface, NULL, SDL_MapRGB( screenSurface->format, 0xFF, 0xFF, 0xFF ) );

            //Update the surface
            SDL_UpdateWindowSurface( window );

            //Wait two seconds
            SDL_Delay( 2000 );
        }
    }

窗口被成功创建的话,我们需要得到指向窗口的surface的指针,这样才能在上面绘制图像。SDL_GetWindowSurface函数就是用来做这个的。

为了使这个教程尽可能的简单,我们需要做的就是用白色的方形覆盖整个surface,这里我们用到SDL_FillRect函数,这里不需要关心这个函数的作用和参数,用就是了。这一章的目的就是弄个窗口而已~。

关于渲染还有个很重要的事情,就是,即便你在surface上绘制一个图形,你也不一定能看得见它。在你绘制完所有的图形之后,你需要更新窗口你才能看见你绘制的图形。SDL_UpdataWindowSurface函数就是用来更新窗口的。

在我们做了以上步骤之后,你能看见的只不过是一个窗口闪了一下就没了。要让窗口保持一段时间我们需要调用SDL_Delay函数(参数是毫秒)。

还有就是,当SDL_Delay函数被执行时,这个程序无法接受任何从键盘或者鼠标的输入。

    //Destroy window
    SDL_DestroyWindow( window );

    //Quit SDL subsystems
    SDL_Quit();

    return 0;
}

在窗口出现两秒后,我们需要析构这个窗口来释放内存。SDL_DestoryWindow函数可以完成析构的过程,同时它也会析构我们创建的surface。之后退出SDL并结束整个程序。

完整代码如下所示:

/*This source code copyrighted by Lazy Foo' Productions (2004-2015)
and may not be redistributed without written permission.*/

//Using SDL and standard IO
#include <SDL.h>
#include <stdio.h>

//Screen dimension constants
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;

int main( int argc, char* args[] )
{
    //The window we'll be rendering to
    SDL_Window* window = NULL;

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

    //Initialize SDL
    if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
    {
        printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
    }
    else
    {
        //Create window
        window = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
        if( window == NULL )
        {
            printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
        }
        else
        {
            //Get window surface
            screenSurface = SDL_GetWindowSurface( window );

            //Fill the surface white
            SDL_FillRect( screenSurface, NULL, SDL_MapRGB( screenSurface->format, 0xFF, 0xFF, 0xFF ) );

            //Update the surface
            SDL_UpdateWindowSurface( window );

            //Wait two seconds
            SDL_Delay( 2000 );
        }
    }

    //Destroy window
    SDL_DestroyWindow( window );

    //Quit SDL subsystems
    SDL_Quit();

    return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值