
本书讲述了如何使用Visual C++来开发Windows平台游戏的基础知识,主要针对想学习游戏设计以及希望进行Windows程序设计的初学者。全书分为4篇共14章。第1篇为Windows编程基础,除了基本的概念和工具的使用外,还介绍了窗口与消息机制、Unicode编程、GDI编程等内容;第2篇为游戏编程基础,介绍了库的编程技术、设计模式、帧的基本概念,并搭建了一个Windows下游戏编程的框架;第3篇的射击游戏综合运用前面两篇的所有知识,完成了一款射击游戏,并讲述了XML的基本编程以及关卡设计;第4篇为进一步学习打下基础,讲解了最基础的Windows核心编程,包括进程管理、多线程编程、互斥访问和同步,以及Direct X应用于2D编程的内容。本书介绍了在Windows环境下进行游戏编程所用到的各种基础知识,而并非局限于Windows API本身的编程。本书每个章节都以简单的实例辅助对知识点的理解,力求深入浅出,并且逐渐递增难度。 读者对象:本书面向本科院校、高职院校的数字媒体技术专业、软件工程、软件技术等相关专业以及数码艺术设计爱好者。
笔者从事游戏程序设计专业的教学工作已五六年了,也经历了游戏行业从一夜爆红到理性发展的阶段。很多学校都开设了程序设计专业,从不同的角度、使用不同的开发平台来培养程序员,大多数都侧重于B/S模式的开发,包括使用Java、.NET、PHP等,还有侧重于嵌入式、C/C++开发的。根据TIOBE公司2011年3月最新的调查统计发现,从编程语言这个角度出发,全世界的程序员使用Java的占19.7%,C的占15.3%,C++的占8.8%,然后依次是C#、PHP、Python、VB和Objective-C。 游戏开发平台包括家用游戏机(微软XBOX、索尼PlayStation、任天堂NDS)、手机游戏平台(微软WinPhone、诺基亚Symbian、苹果iPhone、谷歌Android)以及PC游戏。其中PC游戏,特别是网络游戏,始终占据了很大的份额。对于一个渴望进入游戏行业的读者来讲,PC平台下使用Visual C++开发Windows游戏是门槛最低、上手最快的选择。 很多学校都开设了游戏设计专业,名字五花八门,有本科的,也有专科的;有侧重于游戏美工的,也有侧重于游戏编程的。侧重于编程方向的在本科层次可以是软件工程专业、计算机科学与技术专业、数字媒体技术专业,在专科层次可以是计算机多媒体技术、软件技术等。在各种各样程序设计专业中,无论叫什么样的专业名字、课程体系有什么变化,C/C++、数据结构、Windows程序设计、DirectX程序设计这几门课都是必不可少的,开课顺序往往也是这样的。 就拿最基本的C语言来讲,仅仅一门课程是学不好它的。用C语言可以做系统级别的开发(操作系统的大部分代码都是用C语言写的)、嵌入式应用开发,也可以开发游戏的客户端、服务器端和游戏引擎。不同的开发目标,学习C语言的侧重点也有所不同。某些教材基本上忽略了这种差别。Windows程序开发也是这样,仅仅从Win32 API或者MFC的角度来讲这门课,这对于游戏程序设计专业的同学来讲是不够的。我心目中理想的游戏程序设计专业的“Windows程序设计”这门课,不仅仅是以Win32 API作为主要内容的。作为一门入门课程,重要的应该是在Windows平台下如何编写一个入门级的游戏,能够做到麻雀虽小五脏俱全。在整本书中强调游戏的开发理念(例如帧的概念)以及软件工程的理念(包括面向对象和设计模式等),而且还要为同学的后续学习打下基础(包括Windows核心编程、Direct3D应用于二维开发)。 作为一名游戏程序员,不仅仅应该只会造句(C语言、数据结构、Win32 API),更应该懂得如何写文章。 本书是集体智慧的结晶。本书的整体规划和编写由秦海玉、何武(四川师范大学)、付一君、肖康负责,其中秦海玉完成了第1~4章的编写以及所有的编码工作,肖康完成了第5~6章的编写,何武完成了第7~8章的编写,张洁完成了第9~10章的编写,罗艳完成了第11~12章的编写,文武完成了第13~14章的编写,李勇对全书进行了审核。其他执笔者还有秦莉、柳静、宋祥波、敬菲菲、张钰、张华英、王方方、乔付军。在此书的编写过程中还得到了成都东软学院许多老师和同学的支持,在此一并表示感谢! 由于作者水平有限,加之创作时间仓促,不足之处在所难免,欢迎广大读者批评指正。如有疑问,可通过cdqhy@qq.com与作者联系。 笔 者 2011年5月20日 于成都东软学院
第1篇 Windows编程基础 第1章 引言 2 1.1 电子游戏产业 2 1.1.1 概述 3 1.1.2 游戏产业价值链 3 1.1.3 电子游戏的历史 4 1.1.4 电子游戏产业的游戏分类 5 1.2 Windows的发展历史 7 1.3 Windows应用程序开发 9 1.4 一些说明 11 1.5 习题 12 第2章 学习使用Visual C++ 13 2.1 Visual C++安装和使用 13 2.1.1 Visual C++的版本信息 13 2.1.2 创建Win32应用程序 14 2.2 Win32控制台应用程序设计 17 2.2.1 预编译头文件 17 2.2.2 Unicode编码 18 2.2.3 TCHAR 19 2.2.4 Debug和Release 20 2.2.5 基本的调试方法 21 2.3 良好的编程习惯 21 2.3.1 使用正确的代码格式 21 2.3.2 采用匈牙利命名法 22 2.4 Win32 API中的常见数据类型 22 2.5 习题 24 第3章 创建窗口与消息响应 25 3.1 Windows应用程序的基本概念 25 3.1.1 窗口 25 3.1.2 入口函数 26 3.1.3 消息和窗口函数 28 3.1.4 进队消息与不进队消息 29 3.1.5 使用MSDN来学习窗口消息 30 3.2 创建窗口 30 3.2.1 包含头文件 33 3.2.2 定义类名和标题字符串 33 3.2.3 注册窗口 33 3.2.4 窗口类的风格 34 3.2.5 创建窗口 35 3.2.6 窗口风格 35 3.2.7 显示窗口 36 3.2.8 更新窗口 37 3.2.9 消息循环 37 3.2.10 窗口函数 38 3.2.11 应用程序的退出 40 3.3 关键在于应用 41 3.4 习题 42 第4章 Windows程序设计基础 43 4.1 GDI的各种概念 43 4.1.1 什么是GDI 43 4.1.2 图形设备上下文 43 4.1.3 WM_PAINT消息 44 4.2 GDI版本的Hello,World! 44 4.2.1 BeginPaint和EndPaint 45 4.2.2 输出文本 45 4.3 打字程序 47 4.3.1 按键消息 47 4.3.2 字符消息 49 4.3.3 强制刷新 49 4.3.4 简陋的打字程序 50 4.4 涂鸦程序 51 4.4.1 GDI函数 51 4.4.2 涂鸦程序1.0 52 4.4.3 鼠标消息 55 4.4.4 GetDC与ReleaseDC 56 4.4.5 设置字符串 56 4.4.6 画线与填充 57 4.4.7 涂鸦程序2.0 60 4.5 时钟 62 4.5.1 获取系统时间 64 4.5.2 生成和销毁定时器 65 4.5.3 获取按键的输入状态 67 4.5.4 WM_NCHITTEST 67 4.5.5 使用右键菜单 68 4.6 使用资源 70 4.6.1 使用图标资源 72 4.6.2 使用鼠标指针 73 4.6.3 使用菜单 74 4.6.4 加速键 77 4.7 文件内核对象 80 4.7.1 CreateFile 80 4.7.2 文件大小和文件位置 81 4.7.3 读/写文件 82 4.7.4 与文件相关的通用对话框 83 4.7.5 实现涂鸦文件读/写 85 4.8 习题 88 第5章 进一步提高Windows编程 89 5.1 图像文件的格式 89 5.2 位图 91 5.2.1 位图的概念 91 5.2.2 加载位图 92 5.2.3 设备DC与内存DC 92 5.2.4 BitBlt 93 5.2.5 绘制位图文件的基本流程 94 5.2.6 完整的代码 95 5.2.7 改变窗口的位置与尺寸 96 5.3 内存DC的应用 98 5.3.1 镂空图 98 5.3.2 一个小程序 100 5.3.3 为什么会有屏闪 103 5.3.4 背景滚动 105 5.4 俄罗斯方块 107 5.4.1 设计思路 107 5.4.2 设计BLOCK 110 5.4.3 CGame的设计 111 5.4.4 CGame的实现 113 5.5 习题 121 第2篇 游戏编程基础 第6章 库与CxImage库 124 6.1 库的基本概念 124 6.2 编译、链接、执行 125 6.3 静态库的基本编程 126 6.4 动态库编程 128 6.4.1 动态库基本编程过程 128 6.4.2 使用统一的头文件 130 6.4.3 再次审视编译链接执行 130 6.5 使用CxImage库 131 6.5.1 生成CxImage 132 6.5.2 通过DLL使用CxImage 133 6.5.3 使用CxImage显示图片 133 6.5.4 旋转图片 134 6.5.5 封装CxImage 135 6.6 习题 136 第7章 常用设计模式的介绍 137 7.1 面向对象程序设计 137 7.1.1 面向对象程序设计的三大机制 137 7.1.2 面向对象程序设计的原则 137 7.2 设计模式概论 139 7.3 模板方法模式 139 7.4 策略模式 141 7.5 习题 144 第8章 搭建Windows游戏程序框架 145 8.1 分析Win32项目的基本代码 145 8.2 游戏循环 147 8.3 “糟糕”的消息机制 148 8.3.1 同步函数与异步函数 148 8.3.2 实现游戏循环 149 8.4 利用模板方法模式搭建Windows游戏程序框架 150 8.5 使用并完善框架类 155 8.5.1 使用cApplication 155 8.5.2 实现双缓冲技术避免屏闪 156 8.5.3 计算并显示帧率 157 8.6 查询按键及退出游戏的实现 159 8.6.1 获取按键状态 159 8.6.2 Escape退出 160 8.7 游戏暂停功能的实现 160 8.7.1 单击空格键暂停游戏 161 8.7.2 是否当前窗口判断游戏暂停 161 8.8 六字真言:输入、计算、输出 163 8.9 习题 163 第3篇 射 击 游 戏 第9章 图像显示与背景 166 9.1 必要的数学运算 166 9.1.1 坐标和角度运算 166 9.1.2 敌机的旋转角度 167 9.1.3 边界检测 168 9.2 管理器的概念 168 9.2.1 怪物 169 9.2.2 怪物管理器 169 9.2.3 怪物仿真程序的逻辑 171 9.3 图片资源的管理 172 9.4 实现背景的滚动 173 9.4.1 背景类cBackground的声明 174 9.4.2 背景类cBackground的实现 174 9.4.3 背景类cBackground的使用 175 9.5 可移动对象接口类IMovable 176 9.5.1 可移动对象 176 9.5.2 可移动对象管理器 178 9.6 实现云彩 180 9.7 习题 181 第10章 飞机和子弹 182 10.1 总体设计 182 10.2 飞机 182 10.3 实现战机 183 10.4 敌机 184 10.4.1 整体设计 184 10.4.2 敌机类cEnemy 186 10.4.3 敌机管理器 186 10.4.4 敌机与战机的碰撞 189 10.4.5 使用敌机管理器类 189 10.5 敌机飞起来 190 10.5.1 敌机与策略 190 10.5.2 匀速策略类 192 10.5.3 策略管理器 192 10.5.4 直线型策略 194 10.5.5 让敌机具备跟踪功能 195 10.6 子弹 196 10.6.1 总体思路 196 10.6.2 子弹管理器 196 10.6.3 碰撞检测 198 10.6.4 发射 199 10.7 习题 204 第11章 实现关卡 205 11.1 XML编程基础 205 11.1.1 XML的基本概念 205 11.1.2 XML文件示例 207 11.1.3 使用XML Notepad 208 11.2 通过XML实现关卡 208 11.2.1 使用TinyXML 208 11.2.2 XML实现敌机类型 209 11.2.3 XML实现子弹类型 210 11.2.4 XML实现战机子弹 211 11.2.5 XML实现关卡脚本 212 11.3 习题 214 第4篇 知 识 拓 展 第12章 Windows体系结构 216 12.1 多任务的操作系统 216 12.2 Windows的体系结构 216 12.2.1 核心态 217 12.2.2 用户态 218 12.3 抢先式多任务工作方式 219 12.4 Windows内存管理机制 221 12.5 多线程 223 12.6 习题 223 第13章 Windows高级编程 224 13.1 内核对象与内核对象句柄 224 13.1.1 内核对象 224 13.1.2 创建内核对象 225 13.1.3 使用计数 226 13.1.4 进程间共享内核对象 226 13.1.5 触发/未触发状态 226 13.2 进程 228 13.2.1 进程与线程 228 13.2.2 通过任务管理器查看程序的信息 229 13.2.3 创建子进程 230 13.2.4 终止进程 233 13.3 多线程编程 233 13.3.1 进程与线程 233 13.3.2 引入线程的好处 234 13.3.3 如何使用多线程 234 13.3.4 创建线程 235 13.3.5 多个线程使用同一个线程函数 237 13.3.6 线程的调度 238 13.4 互斥访问共享资源 239 13.4.1 提出问题 239 13.4.2 互锁函数 241 13.4.3 关键段操作 242 13.4.4 使用内核对象保证互斥访问 243 13.5 线程同步 248 13.5.1 单向的同步关系 249 13.5.2 循环的同步关系 250 13.6 习题 253 第14章 使用DirectX完成二维游戏绘制 254 14.1 DirectX概述 254 14.2 初始化Direct3D 255 14.2.1 获取IDirect3D9接口 256 14.2.2 构造D3DPRESENT_PARAMETERS结构体 256 14.2.3 创建IDirect3DDevice9对象 258 14.2.4 创建Direct3D窗口 258 14.3 显示图形 260 14.3.1 页面切换 260 14.3.2 在响应WM_PAINT消息的代码中进行绘制 261 14.3.3 顶点与FVF(灵活顶点格式) 263 14.3.4 三角形 264 14.3.5 绘制二维三角形 265 14.4 使用DirectGraphics进行2D图像处理 268 14.4.1 纹理 268 14.4.2 创建并使用纹理 269 14.4.3 常用渲染状态 271 14.5 把Direct3D融入框架中 272 14.5.1 纹理类 272 14.5.2 渲染系统类 274 14.5.3 使用渲染系统 276 14.6 习题 276 附录A Visual C++编译常见错误 277 附录B ASCII码表 281 附录C 标准模板库的使用 285 C.1 STL概述 285 C.1.1 要点 285 C.1.2 头文件 286 C.1.3 名字空间 286 C.1.4 迭代器 286 C.2 常用数据容器与数据结构 287 C.3 vector 288 C.3.1 插入数据 288 C.3.2 遍历 288 C.4 list 288 C.4.1 list的迭代器 289 C.4.2 遍历 289 C.4.3 删除元素 289 C.5 map 290 C.5.1 数据的插入和修改 291 C.5.2 数据的遍历 291 C.5.3 数据的查找 292 C.5.4 数据的清空与判空 292 C.6 使用标准模板库(STL) 292 参考文献 293
http://www.hxedu.com.cn/hxedu/fg/book/bookinfo.html?code=G0145870