DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之1: 开场白

2023-11-09


    

在开场白之前的说明:

 

这是“DirectX 9.0c游戏开发手记”的第一部分,叫做“‘龙书’第二版学习笔记”,讲的是我做“龙书”第二版(原名Introduction to 3D GameProgramming with DirectX 9.0c —— A ShaderApproach)的习题的心得和疑惑。

注意:这系列博文并不是什么入门教程,其实说白了就是一个类似自我总结的东西,方便我随时回顾的。没有正在学习DirectX编程的读者可能完全看得云里雾里;然而对于正在学习DirectX编程(最好是正在学习“龙书”第二版)的那些读者来说,这系列博文确实是值得一看的。当然这里面会给出我学习过程中的许多疑惑,希望大家一起来探讨!

 

 

 

开场白:

 

这是本人这是“DirectX 9.0c游戏开发手记”的第一部分“‘龙书’第二版学习笔记”的第一篇,所以还是有必要做一点开场白的。为了便于阅读理解,我采用一问一答的方式来组织这部分文章。

 

Q:为什么要学习游戏编程?

A:这里我要开始讲述“阿毛的故事”了,没兴趣的可以直接跳到下面的问题,只要你对游戏编程有兴趣就行……

去年9月份我想找一款棋子造型很华丽的国际象棋游戏。其实在这之前已经有一款不错的符合要求的游戏了(叫做《战斗版国际象棋》(Battle VS Chess)),可是早就玩腻了,想换换新口味。然而找来找去都没有找到符合要求的。《中世纪国际象棋》是一款“类似”的棋子造型是人物、有打斗动作的游戏,可是操作太坑了,而且毕竟太老,画质是渣渣。后来又见到一款比《战斗版国际象棋》稍早的游戏《鲁克斯保卫战》(Rooks Keep),比《中世纪国际象棋》好多了,但是远远不如《战斗版国际象棋》(当然也有一些优点),最主要的体现在这几点:1、棋子造型难以与实际兵种相对应;2、人物太挤了,尤其是那个蜘蛛皇后,胳膊都跑到别人的地盘了;3、操作很不和谐,视角也很坑。后来再找,没有看到有这种以人物模型为棋子造型的国际象棋了。我彼时悲愤交加,遂决定自己开发一款能够载入人物模型的国际象棋软件!于是我便开始自学C++。


本来只是打算做一款类似于Win 7自带的国际象棋程序ChessTitan那样的小软件,不过去年十一假期看了国产3D巨制《建木传奇》后,我被它那华丽的特效(以及小狐狸精性感美丽的身躯……)所深深地折服和吸引,便有了更宏大的目标:那就是,做一款类似《战斗版国际象棋》那样的华丽的3D国际象棋游戏!


不过那时候什么基础都没有,C++才刚开始学(虽然很早以前学过C语言,而且2011年暑假也自学过C++,但是后来碰了壁,就荒废了),也不知道从何入手,所以那半年就专心于C++入门了。

到了今年寒假,自学了一本游戏编程入门书——JonathanS. Harbour写的《Beginning Game Programming》——的一半内容。这本书,像我后来浏览过的很多游戏编程书一样,对于Windows程序的介绍都是一带而过的,所以说一开始跟看天书一样——不过,游戏编程所需要用到的Windows编程知识是很少的,所以过了这一段后也没多大影响。这本书是用DirectX 9.0讲2D游戏编程的,对于3D部分几乎没有任何讲述。当时我也以为要学习3D游戏编程,要从2D游戏编程学起(后来发现这是错误的)。这本书是我从图书馆借的,没有源码(幸亏书上把源码都“原样”誊写了上去,尽管后来发现有一些小问题),而且是中译本,看得很是吃力(当然可能最主要的原因是这本书本身就不够初等)。寒假结束后,也没有获得很大的提高,几乎快要放弃游戏编程了。


后来想想还是老老实实地做一款国际象棋“软件”(而非“游戏”)好了。于是打算自学MFC,因为MFC是制作Windows应用程序最快的工具了。这样学了一个星期左右,倒也逍遥快活,直到某天半夜……

那天半夜我百度了一下用MFC制作游戏,结果发现有人说用MFC制作Windows应用程序还可,但是用来做游戏不靠谱,因为游戏需要快速反映,而MFC的封装太多,运行效率不够快。那天夜里,我想了一阵子,便咬咬牙,准备从Windows程序设计开始学起了。咳!谁让到现在为之还没有出现比《战斗版国际象棋》更加华丽的国际象棋游戏呢?

我找到了《Windows游戏编程大师技巧(第二版)》,然后打算用我之前下载的DirectX SDK (June 2010)版本学习。这本书先详细讲述了Windows程序设计,终于让我对其有了感觉。不过当学习DirectX部分的时候,我又陷入了深深的困惑之中。


一方面是这里讲COM的时候太抽象了,简直是外星语言啊!好容易过了这道坎,然后发现了更恐怖的事实:书里给出的程序没法编译!虽然书里用的是DirectX 8,我用的是DirectX 9,但是不是说DirectX是向后兼容的吗?这不是说只要把里面的8都改成9就行了吗?(后来我才发现我的想法太天真了。)后来终于知道问题所在了:书上的程序用了DirectDraw,但是这种东西在DirectX 9中已经不存在了!郁闷啊!

于是我只好放弃了这本1000多页的书。后来找到了一本神书,叫做《Programming Role Playing Games with DirectX》,作者是名不见经传、但是很牛的Jim Adams,同样是用DirectX 8进行游戏编程的,但是没有用DirectDraw!这让我大喜过望,于是便学了起来,津津有味,而且这书讲得特别有意思,以至于我将我的志向又提高了一个层次:我要做一款值得一玩的3D RPG!


然而学到后来又出现了问题了:一个函数那里的参数出现了错误!仔细研究了一下,发现这个函数的DX 8版本和DX 9版本的参数数目竟然是不一样的!坑啊!这绝对不是个例!看来即使没有用到DirectDraw,DX 8和DX 9的区别还是大大的呀!

真是“山重水复疑无路,柳暗花明又一村”!正当我心灰意冷之际,我找到了传说中的“龙书”( Introduction to 3D GameProgramming with DirectX 9.0)!晕死,既然DX 8对我无情,那就休怪我无义了!我就从此走上了学习DX 9的路途。


学起来还是挺顺利的。不过我发现这本书的例子都很简单,没有特别激动人心的示例程序。后来偶然发现“龙书”的第二版,用的是DirectX 9.0c版,而且里面的很多例子都挺激动人心的,感觉比前一版提升了好几个档次,便学了起来。PS:到了这里,我才发现,其实即使同样是DirectX 9.0c版本,有一些地方也是有细微差别的,所以幸亏我选对了教材,否则又不知道要走多少冤枉路了。


再补充一下:《ProgrammingRole Playing Games with DirectX》有一个第二版,是用DX 9进行编程的,但是里面的很多代码还是过时了,毕竟年代比较久远了。


这上面说了很多废话,其实要点就两个:一个是一定要有学习游戏编程、做出一款好玩游戏的强烈愿望!二是一定要选择一本编排合理、内容新近、适合初学者学习的游戏编程教材!


Q:为何要用DirectX学习游戏编程?用游戏引擎不是更快吗?

 

A:确实用虚幻3、Unity等游戏引擎开发游戏速度很快,而且现在大部分游戏公司都是用市面上出售的或者自制的游戏引擎制作游戏的。那么为何我们要用DirectX学习游戏编程呢?因为用DirectX还是比较底层的,能够实现更多的自由,能够让我们更加理解3D游戏的本质。而用游戏引擎制作,虽然速度快,但是并不是万能的,有一些功能靠游戏引擎是难以实现或者根本做不到的;况且由于游戏引擎比较注重通用性,一般来说优化并不是很好。此外,即使要用游戏引擎开发,掌握一点DirectX编程的知识还是挺有用甚至是必要的。


Q:为何用DirectX9.0版本?

 

A:现有的最新的DirectX版本是DirectX 11。不过这几年比较出名的3D游戏基本还是基于DirectX9的(这就是玩某些3D游戏需要你安装DirectX 9 Runtime的原因)。之所以这样,因为DirectX 9是面向Windows XP系统的,所以XP系统和它以后的系统都可以正常运行基于DirectX 9的程序(只要安装了DirectX 9 Runtime);而DirectX 11是面向Windows 7系统的,基于DirectX 11的程序只能用于Windows 7及其以后的系统。显然,游戏厂商们希望自己的客户群尽可能广大,所以就选择DirectX 9了。


另外,对于DirectX 9.0c,它能够实现的效果已经很华丽了,大家可以参看《古墓丽影8》等基于DirectX 9的游戏。


至于DirectX 10,由于它是面向WindowsVista系统的,并且在它出现后没多久就出现了DirectX 11,所以我还没有见过基于DirectX 10的游戏。

现在能够下载到的最新版的DirectX SDK(software development kit,软件开发包)是DirectX SDK (June 2010)版本。这个版本集成了DirectX 9.0c、DirectX 10和DirectX 11。我们暂时就只关注其中的DirectX 9部分了。之所以后面带有一个c,是因为DirectX 9也有几个小版本,最古老的是a,最新的是c(其实即使是DirectX 9.0c,也有更细的小版本,前面也提到过的)。


当然,不可能再去管DirectX 8或者更老的版本了,前面的故事中我所得到的惨痛教训想必大家已经清楚了。


Q:为何不写一个教程类的博文?

 

A:首先,我没有那么大的本事来写一个自创的DirectX编程入门教程;其次,“龙书”第二版已经是不错的教程了,尽管有一些地方还是不太好理解。本人最近在对“龙书”第二版进行“修正”,会在每更新完一章的时候给大家分享。这个修正版除了页面编排更美观、修正了网上流传版本的错误以外,还增加了很多脚注,对于书中不太好理解的部分进行了注释。这些不太好理解的地方本人会在今后的博文中适当提及,不过还是推荐大家把电子书下载下来仔细研究,顺便提供宝贵意见!

 

附:

龙书 Introduction to 3D Game Programming with DirectX 9 0c 着色器版彩图注释修正版1.3

点击打开链接


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之1: 开场白 的相关文章

  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • pthread_cond_timedwait() 和 pthread_cond_broadcast() 解释

    因此 我在堆栈溢出和其他资源上进行了大量搜索 但我无法理解有关上述函数的一些内容 具体来说 1 当pthread cond timedwait 因为定时器值用完而返回时 它如何自动重新获取互斥锁 互斥锁可能被锁定在其他地方 例如 在生产者
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 当操作繁忙时,表单不执行任何操作(冻结)

    我有一个使用 C 的 WinForms 应用程序 我尝试从文件中读取一些数据并将其插入数据表中 当此操作很忙时 我的表单冻结并且无法移动它 有谁知道我该如何解决这个问题 这可能是因为您在 UI 线程上执行了操作 将文件和数据库操作移至另一个
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐

  • .NET诞生20周年 .NET 7有什么新东西?

    首个预览版已发布 NET 7 有什么新东西 随着第一个预览版发布 NET 7 渐渐浮出水面 NET 高级项目经理 Jeremy Likness 在官方博客中介绍了 NET 7 的主要发展方向 俺整理给大伙做一下介绍 NET 7 建立在 NE
  • 实训二十二:交换机标准 ACL 配置

    一 实验目的 1 了解什么是标准的 ACl 2 了解标准 ACL 不同的实现方法 二 应用环境 1 ACL Access Control Lists 是交换机实现的一种数据包过滤机制 通过允许或拒绝特定的数据包进出网络 交换机可以对网络访问
  • Uoj 33 树上GCD (树分治)

    include
  • RabbitMQ:Queue的介绍和使用

    1 声明 当前内容用于本人学习和使用当前的Queue 当前内容为RabbitMQ中对Queue的介绍 当前内容来源 RabbitMQ中的Queue 2 Queue的官方介绍 首先先分析以下前面的Queue的使用 其实这个东西就是一个队列 一
  • Qt项目中头文件无法找到的几个解决办法

    项目场景 在新建项目中引用头文件 问题描述 头文件无法找到 系统提示错误 file not found 原因分析 可能是头文件写错 也可能是路径有问题 解决方案 三种解决方法 1 检查头文件是否写错 注意新旧版本的差异 2 检查路径是否为全
  • Windows下Python加载VLC的方法

    从网上看到一篇文章 Python 流媒体播放器 基于VLC 其中提到windows下开发VLC需要首先安装VLC 否则就需要设置环境变量PYTHON VLC MODULE PATH 但是我尝试了一下 没有成功 但是 这篇文章给了我一个思路
  • 剑指 Offer 25. 合并两个排序的链表

    题目链接 25 合并两个排序的链表 思路分析 利用归并排序的归并思想 Definition for singly linked list struct ListNode int val ListNode next ListNode int
  • 2021中国WMS市场发展趋势和特点

    仓储行业经历了30多年的发展 正在由手工仓向数字仓 智能仓转变 而在这个过程中 作为指挥硬件设备的 大脑 WMS起着不可或缺的作用 WMS系统通过数字化仓库作业过程管控 借助条码化和智能化技术手段 实现仓库作业条码化 作业过程透明化 库存管
  • 【满分】【华为OD机试真题2023 JS】红黑图

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 红黑图 知识点枚举 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 众所周知红黑树是一种平衡树 它最突出的特性就是不能有两个相邻的红色节点 那我们定义一个红黑图
  • shardingsphere引发 java.lang.String cannot be cast to java.lang.Integer异常

    错误描述 mysql数据库查询sql在数据库连接工具中可以正常运行 在加入了shardingsphere的jar包的项目中抛如下异常 java lang ClassCastException java lang String cannot
  • shell脚本循环传值_Shell 脚本的循环控制(for/while/until)

    熟悉其他高级语言的伙伴们肯定了解循环控制语法是编程中非常基础的内容 今天就介绍Shell 中设计循环控制的语法 for while until 等内容 for 命令 for 命令是最简单的循环控制语句 它的格式为 for var in li
  • SyntaxError: Cannot use import statement outside a module

    Node 生态包含两个不同的模块系统 ESM ECMAScript 模块 和 CommonJS 两个模块系统彼此不兼容 其是 SyntaxError 无法在模块外部使用 import 语句 错误 错误 SyntaxError 无法在模块外部
  • C++ 好用的格式化库--fmt

    背景 fmt 库是一个开源的 C 格式化库 它提供了一种简洁 安全和高效的方式来进行字符串格式化 该库的设计目标是提供与 Python 的字符串格式化语法类似的功能 同时保持 C 的类型安全性和性能 下载与安装 官网下载 fmt 官网地址
  • springboot+jsp教育机构OA系统(源码免费获取+论文+答辩PPT)

    技术架构 springboot mybatis springmvc jsp mysql 功能模块 整个系统分为三种角色 1 系统管理员 2 上级角色 3 普通教师 其中系统管理员需要的功能 部门人员管理功能 档案信息的添加 工作管理功能 上
  • python爬虫案例-跳过百度验证,接口调用实现百度搜索功能

    需求背景 我们有自己的平台 但是希望在我们的平台上面想要实现一个百度搜索的接口 输入想要搜索的内容 模拟百度搜索 将返回的内容再展现在我们自己的平台中 提供给用户查看 coding utf8 import hashlib import ra
  • QT自定义类型作为槽函数的参数

    QT自定义类型作为槽函数的参数 正常情况下信号与槽之间只能传递通用数据类型 如 int 像QVector
  • 数据结构——小白入门篇

    数据结构 小白入门篇 浅谈学习心得 我为什么想要学数据结构 在计算机界有这样一个万能公式 数据结构 算法 程序 在如今这计算机引领风骚的时代 不学数据结构 你凭什么想要做时代的弄潮儿 所以我毅然决然的提前自学了数据结构 学习数据结构前的我是
  • vue3 中使用 element UI 3 (vite 和 webpack)

    Element Plus官方文档 一 安装 NPM npm install element plus save Yarn yarn add element plus pnpm pnpm install element plus 如果您的网络
  • 15个高清壁纸网站推荐

    15个高清壁纸网站推荐 给大家推荐个人比较喜欢的几个壁纸高质量壁纸网站 给大家推荐个人比较喜欢的几个壁纸高质量壁纸网站 极简壁纸 推荐 WallpaperCave CGWALLPAPERS 游戏壁纸 H128壁纸 Magdeleine Up
  • DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之1: 开场白

    在开场白之前的说明 这是 DirectX 9 0c游戏开发手记 的第一部分 叫做 龙书 第二版学习笔记 讲的是我做 龙书 第二版 原名Introduction to 3D GameProgramming with DirectX 9 0c