现今市面上充斥着各种成熟的游戏引擎,在某些程度上它们其实是降低了游戏开发的门槛,于此同时,各种相关的培训教程也充斥着网络的各个角落,特别是对于常见的如 Unity、Unreal Engine、CRYENGINE 等等,显然培训游戏开发也成为了一个暴利的产业链。

游戏开发并不是一件容易的事情,如果你在网络上搜索 如何开发游戏怎样做游戏 等内容,你搜到的结果肯定是让你学习一门语言,熟悉一种引擎、更多的是列书单,我敢保证,它列出的书单肯定比你显示器要长的多……

本教程的目的是帮助新手快速上手 SDL 开发库,能够为接下来的 C语言小游戏开发教程 打下基础。SDL 本身就是一组简单的 API,因为源码用 C语言写成,所以你也可以简单的认为学习 SDL 本质上就是学习一组函数的相关用法。事实上,你只要掌握了相关流程,并不一定选择 SDL,你也可以选择其它类似的第三方库。

教程并不会详细介绍 SDL 的每一个函数用法,而是根据最小知识栈原则,围绕着 2D 游戏开发 这个主题,介绍游戏开发过程中必须掌握的相关函数,这对初学者来说非常重要,当你接受一个新知识点的时候,先做减法,在做加法能让你快速掌握相关的知识内容,帮助你更好的建立编程信心。

1. SDL 简介

按照套路,我们先介绍一些 SDL 的相关概念,然后在接下来的文章中,依次介绍最小知识栈的每一部分内容,确保在学习整套教程之后,可以让你对游戏开发的前置知识有一个简单的了解。

SDL 本身是跨平台的,它是对各个平台特有 API 的抽象。

SDL 按照 API 的类型可以分为几个部分:

  • Basics ,用于系统初始化、错误处理、日志打印等基本功能。
  • Video,用于窗口管理和显示、像素纹理渲染等功能。
  • Input Events,用于处理各种事件,包括键盘、鼠标、手柄等外设。
  • Force Feedback,主要用于各种“力反馈”的设备支持。
  • Audio,用于音频设备管理,包括播放、录制等操作。
  • Threads,用于多线程、原子操作以及线程管理等功能。
  • Timers,用于定时器的支持。
  • File Abstraction,文件系统相关操作。
  • Shared Object Support,用于动态库的加载以及函数查找等相关操作。
  • Platform and CPU Information,主要用于平台检测、CPU检测、字节序、位运算等功能。
  • Power Management,电源状态管理。
  • Additional Functionaliy,平台相关的附加功能。

除了上述子系统外,SDL 还基于这些功能开发了几个扩展组件:

  • SDL_image 用于支持额外的图片格式,包括常见的 PNG、BMP、WEBP、GIF、JPEG、TIFF 等。
  • SDL_mixer 用于支持额外的音频格式,包括 MP3、OGG、WAV 等。
  • SDL_ttf 用于 TrueType 字体的渲染。
  • SDL_rtf 用于简单的 RTF 渲染支持。
  • SDL_net 用于网络相关的支持。

2. 游戏开发基本模块

虽然上面的模块看起来很多,但是真正的需要学的的知识并不多,个人觉得制作简单的2D游戏大致需要掌握下面几个部分:

  • 窗口部分。制作一个游戏最基本的就是显示一个窗口,所有的有些画面都是在窗口之内。在历史的文章中已经介绍过直接使用 Win32 API 搭建窗口的方法,但是对于 SDL 来说,它已经对这些步骤进行的二次封装,如果创建窗口可以直接使用 SDL 窗口管理的相关 API 即可。

  • 事件部分。事件处理对于游戏来说非常重要,因为游戏中涉及大量的鼠标、键盘、手柄的外设交互,这些外设都可以看作一种事件产生装置,每种操作都会产生与之对应的事件,你可以在游戏中捕获这些事件,从而执行你游戏中对应的逻辑。

  • 显示部分。游戏画面对于游戏的重要性无需多言,而显示部分主要的功能就是用来渲染游戏画面的,在不同的平台,可以使用不同的显示接口,SDL 已经将这些差异性进行了封装,在使用 SDL 过程中,你无需关注不同平台的差异性,不过在这份教程中并不会过于关注跨平台的问题,重点还是围绕 Windows 平台,关注 SDL 游戏开发的基本过程。

  • 声音部分。生意对于游戏也非常重要。教程中主要会使用 SDL_mixer 扩展库实现对声音的播放,当然你也可以使用 音频播放教程 中的方式进行声音播放,只不过那些 API 只能在 Windows 平台使用而已。

除了上面的部分,其实还有网络模块、碰撞模块、动画模块等功能,但是这些并不是必须的,你不使用它们仍然可以制作一些游戏。当我们真正使用它们的时候再去了解显然比你一下子学习很多暂时用不上的知识要好的多。

3. Let's go

通过上面的介绍,你应该对接下来需要掌握的内容有了一个大致的了解,接下来就开始我们 SDL 最小知识栈的学习之旅吧!

SDL2 游戏窗口搭建详情
使用 SDL 和使用原始 Windows API 创建的过程基本一致,不同之处在于 SDL 做了一定程度上的简化。例如,注册窗口和创建窗口的过程合并为一个 SDL_CreateWindow 函数,消息循环 也从 GetMessage、DispatchMessage 变为了 SDL_PollEvent 函数,原有的窗口过程也被封装成了事件消息,接下来就简单的介绍一下 SDL 创建窗口的基本过程。
SDL2 游戏开发之事件处理
本篇内容我们来学习一下 SDL 的事件处理。在常规的 Windows 开发中,一般的键盘、鼠标等事件都被封装为一个个的消息,这些消息都可以在窗口过程函数中被捕获,并执行开发人员想要运行的逻辑。SDL 中已经将这些内容全部进行了二次封装,换了一个叫做“事件”的名称。
SDL2 游戏开发之渲染设备
本章内容我们来讲解一下在 Windows 窗口上如何使用 SDL 渲染图像。在原来的文章中我曾介绍过如何使用 Direct2D 进行图形渲染SDL 内部原理和它类似,只不过 SDL 经过二次封装,使用起来更加的简单。
SDL2 游戏开发之图形渲染
本章内容我们来讲解一下绘制图像的具体方法,上一篇文章中我们讲了 SDL 渲染设备相关的知识,这一篇是在前文的基础之上,因为所有图像显示相关的接口,都需要用到上篇文章中提到的渲染器,也就是 SDL_Renderer 结构体。接下来的内容分为两个部分,主要介绍游戏中经常用到的两个功能,图形渲染和文字渲染。
SDL2 游戏开发之音频处理
音乐对于游戏来说绝对是画龙点睛之笔,不过音乐的编写需要有专业的人员才可做到,特别是在什么场景下播放什么音乐的策划方案都有很高的艺术门槛。在本文中我们并不想讨论怎样制作一首音乐,而是简单了解一下,当我们手上已经有了合适的音乐,在程序中如何播放的问题。
SDL2 游戏开发之时间和帧率
当然今天我们并不准备讨论时间的哲学概念,而是想研究研究游戏中的时间是怎样计算。要想计算游戏中的时间,首先我们要有一个基准时间,只有这样才有参考的依据,这里可以直接选用现实中的时间作为参考。
SDL2 游戏开发之资源加载
如何管理这些资源其实是游戏引擎的工作,只不过对于小游戏来说,这个问题其实很容易被忽略,因为小游戏使用的多媒体素材很少,一般只有图片素材和简单音频文件,如果在程序中使用,直接载入使用即可。今天这篇文章主要讲一讲使用 SDL 开发小游戏过程中可能预计的两个资源加载问题。
SDL2 游戏开发之框架搭建
通过前面的 SDL2 相关知识的学习,现在你已经具备了搭建一个基本游戏框架的能力,而这篇文章就准备从零开始,运用我们之前所讲解的知识,搭建一个开发小游戏使用的基本框架,为以后的小游戏开发做好准备。
SDL2 游戏开发之中文渲染
在游戏开发过程中,经常遇见显示中文的问题,如果你使用图形渲染中介绍的方法,会发现显示的文字是乱码,之所以是这样是因为 SDL 文字显示接口的用法决定的,这篇文章就简单的介绍一下 SDL 显示中文的具体过程。