第一章 认识SDL

SDL_Game_Development全英.7z

《SDL Game Development》电子版,Discover how to leverage the power of SDL 2.0 to create awesome games in C++。

立即下载

第一章 认识SDL

👉SDL 2.0 Roadmap

SDL 2.0 Roadmap中可以获取到SDL2当前的规划路线以及功能支持情况。

👉Migrating SDL 1.2 extensions

以下的SDL扩展库已经支持SDL2版本:

  • SDL_image:一个图片文件加载库,支持BMP、GIF、PNG、TGA、PCX等。(SDL2的库似乎只支持BMP格式的图片文件。)
  • SDL_net:一个跨平台的网络库。
  • SDL_mixer:一个音频渲染库,支持MP3、MIDI以及OGG。
  • SDL_ttf:一个让SDL程序支持TrueType字体的库。
  • SDL_rtf:一个RTF字体渲染库。

另外一些可能不支持 SDL2 的库集合:链接

👉获取 SDL2

官方网页中可获取到当前稳定版本,包括源码、运行二进制文件以及开发库。

SDL2 源码编译请看这里

下载开发库解压后可看到三个文件夹:docs、include 以及 lib,将其引用到开发项目中就能正常使用。

👉Hello SDL

创建一个空项目,配置好 SDL2 的头文件和库的引用,接着创建一个 main.cpp 文件,将以下代码复制到 main.cpp 文件中,编译运行。

#include<SDL.h>

SDL_Window* g_pWindow = 0;
SDL_Renderer* g_pRenderer = 0;

int main(int argc, char* args[])
{
    // initialize SDL
    if(SDL_Init(SDL_INIT_EVERYTHING) >= 0)
    {
        // if succeeded create our window
        g_pWindow = SDL_CreateWindow("Chapter 1: Setting up SDL",
        SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480,
        SDL_WINDOW_SHOWN);

        // if the window creation succeeded create our renderer
        if(g_pWindow != 0)
        {
            g_pRenderer = SDL_CreateRenderer(g_pWindow, -1, 0);
        }
    }
    else
    {
        return 1; // sdl could not initialize
    }

    // everything succeeded lets draw the window
    // set to black // This function expects Red, Green, Blue and
    // Alpha as color values
    SDL_SetRenderDrawColor(g_pRenderer, 0, 0, 0, 255);

    // clear the window to black
    SDL_RenderClear(g_pRenderer);

    // show the window
    SDL_RenderPresent(g_pRenderer);

    // set a delay before quitting
    SDL_Delay(5000);

    // clean up SDL
    SDL_Quit();

    return 0;
}

解剖 Hello SDL

1.首先,包含头文件:#include<SDL.h>

2.第二步,创建一些全局变量:一个是 SDL_Window 变量,另一个是 SDL_Renderer 变量。前者是SDL2窗口对象,后者是SDL2渲染器对象。

SDL_Window* g_pWindow = 0;
SDL_Renderer* g_pRenderer = 0;

3.现在,可以初始化SDL2库:SDL_Init(SDL_INIT_EVERYTHING) 。参数 SDL_INIT_EVERYTHING 是代表初始化全部子系统,当然,可以选择用到的那些子系统进行初始化。

4.接下来,就是创建SDL2的窗口,使用 SDL_CreateWindow 函数。

g_pWindow = SDL_CreateWindow("Chapter 1: Setting up SDL", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480,SDL_WINDOW_SHOWN);

5.假如SDL2的窗口创建成功,就将在其上面创建SDL2渲染器,调用 SDL_CreateRenderer 函数。

// if the window creation succeeded create our renderer
if(g_pWindow != 0)
{
 g_pRenderer = SDL_CreateRenderer(g_pWindow, -1, 0);
}
else
{
 return 1; // sdl could not initialize
}

6.假如SDL2渲染器创建成功,就可以在该窗口上使用该渲染器进行绘图等操作。

// everything succeeded lets draw the window
 // set to black
SDL_SetRenderDrawColor(g_pRenderer, 0, 0, 0, 255);
// clear the window to black
SDL_RenderClear(g_pRenderer);
 // show the window
SDL_RenderPresent(g_pRenderer);

7.最后就是释放资源,反初始化。

SDL_Quit();

👉SDL initialization flags

Flag Initialized subsystem(s)
SDL_INIT_HAPTIC Force feedback subsystem
SDL_INIT_AUDIO Audio subsystem
SDL_INIT_VIDEO Video subsystem
SDL_INIT_TIMER Timer subsystem
SDL_INIT_JOYSTICK Joystick subsystem
SDL_INIT_EVERYTHING All subsystems
SDL_INIT_NOPARACHUTE Don’t catch fatal signals

可以使用(|)符号来初始化多个子系统。如:

SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO);

可以用 SDL_WasInit() 函数来检查某个子系统是否初始化完成。如:

if(SDL_WasInit(SDL_INIT_VIDEO) != 0)
{
    cout << "video was initialized";
}

👉SDL renderer flags

当初始化一个SDL_Renderer标识的时候,可以改变渲染器的渲染行为。

Flag Purpose
SDL_RENDERER_SOFTWARE Use software rendering
SDL_RENDERER_ACCELERATED Use hardware acceleration
SDL_RENDERER_PRESENTVSYNC Synchronize renderer update with screen’s refresh rate
SDL_RENDERER_TARGETTEXTURE Supports render to texture

👉SDL_WindowFlags

SDL_CreateWindow函数的最后一个参数是表明SDL窗口的行为。

Flag Purpose
SDL_WINDOW_FULLSCREEN Make the window fullscreen
SDL_WINDOW_OPENGL Window can be used with as an OpenGL context
SDL_WINDOW_SHOWN The window is visible
SDL_WINDOW_HIDDEN Hide the window
SDL_WINDOW_BORDERLESS No border on the window
SDL_WINDOW_RESIZABLE Enable resizing of the window
SDL_WINDOW_MINIMIZED Minimize the window
SDL_WINDOW_MAXIMIZED Maximize the window
SDL_WINDOW_INPUT_GRABBED Window has grabbed input focus
SDL_WINDOW_INPUT_FOCUS Window has input focus
SDL_WINDOW_MOUSE_FOCUS Window has mouse focus
SDL_WINDOW_FOREIGN The window was not created using SDL

👉游戏的基本流程

在这里插入图片描述

游戏的基本流程在于中间那三个步骤:获取输入、物理计算、渲染输出。然后以固定每秒循环n次执行,这也是游戏的帧数本质所在。当然,由于每一个步骤执行也是需要时间的,为了稳定帧数,还得做一些其他的操作。


欢迎关注个人公众号,阅读更多的原创文章
欢迎关注个人公众号,阅读更多的原创文章。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读