游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2385|回复: 2

Special.effects.game.programming.with.directx这书好

[复制链接]

125

主题

364

帖子

396

积分

中级会员

Rank: 3Rank: 3

积分
396
QQ
发表于 2006-11-17 17:35:00 | 显示全部楼层 |阅读模式
烂译文一篇,  想看还是看原著吧,不用忍受我的烂翻译。连我自己都看不懂。
但是 仔细看,还是能明白作者在说些什么,怎么制作的武器,
给武器加 几种效果等, 他主要说了制作简单的三种基本枪武器的方法。
机枪, 离子炮 和 激光。 说里讲的很详细。

但是作者的用词我不太习惯,而有的同样是英文技术文章则很容易读。
但主要原因是自己英语垃圾。完。不愿看的就别花时间看我发的了直接去看书,或看代码。
也许就有你想要的,但是不会做的。

Guns and Projectile 射击

在过去几天, every gun in every video game shot little wite dots.今天,然后,3D硬件提供给我们真正的全部射击资源。在本章,我们精选这些有趣的成果来分析。

本章教会你可以制作你的游戏武器。我们将看三个不同类型的武器- 枪,发射子弹,离子炮你可以看见,和闪电武器发射电波能量。
然而,在我们到那里之前,我们需要建立一个框架。如果你喜欢,可以看Ch21p1_FireingRange例子程序。
The Firing Range框架
这章的例子程序讨论你在沙漠中允许你试射武器。这里没有敌人目标。那么因为碰撞检测在本章之外)
TIP提示: 然后我不同意你进入这个复杂的话题。有许多你可以确定的更好的技术。如果子弹是看不见的,使用光线相交技术模拟我们将在下一章。如果子弹是可见的,你可以使用包围盒和包围球确定两个物体层叠。

The Gun Base Class
我设计这个例子框架程序起到使用多态现象,因为我认为多态似乎像直觉的方案。你有许多不同类型的枪,所以它自从你有基本的类后使用许多词源(CLaserGun, CMachineGun, CPlasmaGun). CGun包含许多所有类型枪的方法,你可以看这里:
CGun是一个抽象基类,谢谢将Render定义为纯虚的,Update , CanFire, 和 Fire这些方法在我们的公共的接口里-所有不同类型的枪必须实现这些方法。

CGun也包含一些所有枪的公共的数据元素。这些所有保护方法, AssembleWolrdMatrix, 我们看看后面。
Switching Weapons 交换武器
It’ s time to put this polymorphism to use. 切换武器更容易,我们知道所有我们将使用相同的接口, 在我们切换武器我们需要加载它们:

这段代码, 从RestoreDeviceObjects方法的 CMyD3DApplication, 你可以看我们是一个程序员,不是一个艺术家。我完成是想象不到的。我使用一些模型, Ch21p1_Gun.x, 所有的三个枪!如果你会3D建模, 我鼓励你创建不同的枪模以取代它们。现在,然而,我们使用同样的模型,但是使用不同的光颜色色彩和各种枪,所以机械枪是白的,离子枪是绿色的,闪电武器是红色的。
之后我获取所有的枪加载, 我设置它们的位置。你可以看这些位置进入 play a bit later. 最后,我设置m_pCurGun到 机械枪的地址(&m_MachineGun).我们使用m_pCurGun成员维持当前的枪。它没有更多指针指向到我们的基类:

切换武器,我们首先 需要监控适当的输入事件。因为我们有一个渴望FPS的爱好者,我选择使用一个两个三个 关键数来切换武器。我决定机械抢为1, plasma为2, blot枪为3。
当一个关键帧被处理的时, 我们需要下面这些大体上的序列事件:
1: Figure out, 基于所有的帧碰撞, 枪切换。如图如果枪切换合法(那么它们自己的枪,它们没有当前的武器)
2. 开始移动旧的枪, 外部场景。
3.一旦枪的图出去了,切换新的枪 ? 停止渲染旧的枪和开始渲染新的。
4. 把新的枪放到场景中来。
这些两个主要的用下面的代码来实现。首先,我们需要检测键盘按下。 我们在ProcessInput中处理。这里你可以看到逻辑。如果一个,两个三个键盘按下,我们调用BeginGunTransition使用单个参数。这个新的武器我们想使用。这里BeginGunTransition看
在这个函数,我们做两个东西。 两个线关系到它们来确定枪转变为合法的。注意typeid在这里玩。 我们使用typeid( C++中RTTI能力的一部分) 来自基类的pNextGun和m_pCurGun指针被指向。如果*_pCurGun等于pNextGun类型,那么我们的用户就无语了。他们输入切换武器类型, 我们忽视它们的需求。

第二如果检测到线看,如果转换时间运行。If it is, 那意味着我们已经在切换两个武器,所有我们忽略拥护的需要。
下两个线关系到它们使用实际上的设置转变。首先,我们存储枪到我们的m_pNextGun成员。第二, 我们开始我们转换时间。从这里, FrameMove方法实现这个逻辑:
之后我们更新当前枪, 我们检测是否看见转换时间运行。转换时间意味着我们转换武器,我们进入主要的逻辑部分。

整个转换时间要半秒。 半秒是更长的决定进入两片段。 在开始的0.25秒, 我们移动当前枪到屏幕下。 从0.25到0.5秒, 我们移动新的新到当前场景。在每个检测移动,我们使用timer’s函数真实的看枪的位置。

当我们发射时(超过半秒, 我们停止timer然后m_pNextGum为NULL, 渲染我们完成这个 转变。 那么,武器切换!

位置和渲染枪的模型。
在我们讨论切换武器期间, 我们有几分躲避的重要问题, 是什么, 怎样我们渲染第一个地方? 秘密的渲染武器第一人称射击风格转换视矩阵, 作为目录CMachineGun::Render说明:
这里你可以看到overarching渲染方法的结构。 我截取了开始的两个片段, 创建白色的光和渲染机枪的闪光。我们等会再讨论。现在,虽然焦点在注意渲染武器这段代码。
大部分好的片段隐藏在AssembleWorldMatrix. 那个方法属于CGun)吸受在摄影机里,向前有一偏移值, 发射出世界矩阵需要渲染枪适当的渲染。 第二秒参数AssembleWorldMatrix实际上在涉及, 那么AssembleWorleMatrix将存储连接到矩真。这里你可以看这个代码。转换围绕设置矩阵。 然后设置一些渲染状态, 然后调用渲染m_pMesh方法, 抽取这些三角形。所以,现在你获取在视口外, 让我们看AssembleWorleMatrix:
这里一些数学控制。 我们开始从摄影机抓取视矩阵。这里是原理的核心:如果你设置世界矩阵的逆矩阵你的视矩阵, 本地坐标(0,0,0),当运行时世界矩阵, 将移动精确的求你的摄影机的位置(我邀请你检验一些实际的数字!)

所以,视矩阵的你当心我们的枪在我们摄影机外。在下个片段,我们转换平移向量, 我们的枪的位置, 通过平移矩阵。 它理解如果设置m_vPos到 (0,0,1),你说,”hey, 我想枪将从前面摄影机的一个单元, 不管哪里的摄影机的方向趋势事实的。“ 想象我们的爬上摄影机的枪。
会议下在我们的RestoreDeviceObjects方法在CMyD3DApplication, 我们设置所有枪的位置(0.5, -0.6, 1.0). 这个位置枪半个单位右边, 0.6单位, 然后一个单元在摄影机的前面。那么数据看到枪的真实的位置右手的人。如果我是左撇子, 0.6个单元 那么我换为-0.5到0.5取代之。
现在,让我获取后AssebleWorldMatrix. 之后我们创建我们的平移矩阵, 我们创建更多的矩阵 - matScale和matRot ? 按比例减小我们枪模型和旋转目的是为了装入点内。The numbers I’ve plugged into these matrices have no significance; 我简单的玩绕着我们的直到我获取枪的大小和方位我想的。
最后线代码所有整合到一起。 我们增加所有我们的矩阵到一起。记住,这个顺序很重要。 
提示: 如果你烦恼下面的数学, 最后的方式的所有的工作以大的乘法链为中心。然后合并,允许你可视化的继续。
我们看渲染模型和缩放它。 在这点上, 我们有世界矩阵位置和枪, 但是移动它世界坐标(0,0,0), 平移枪到基于枪位置关联摄影机。最后,我们乘以所有的逆矩阵, 移动枪和摄影机的位置和方向。
发射子弹 Firing the Gun
  我们现在知道怎样渲染枪了,怎样切换武器。但是我们仍然缺少重要的部分,给枪子弹。
当ProcessInput检测鼠标按钮按下时,就发射弹药:
 这里你可以看处理输入读鼠标, 检测如果左边按(rgbButtons[0])被按下。如果压下,我们调用CanFire方法在当前的枪检测是否可以开火。如果CanFire返回真, 我们调用火焰方法当前枪。

它单独的枪的责任是确定是否或者它不发射。 这允许我们设置充电或者重新加载时间,和所有各种各样的枪片段。同样的, 它的枪职责实际发射当我们的调用Fire方法的时候。不同的枪将不同的东西, 我们将检测它们不同的behavior行为在下个片段。
机枪
 现在你知道框架怎么运行了, 我们可以看接近的每三个不同的枪类型,开始旧的喜爱,机枪。
这个主要特殊效果的机枪喷嘴 - 你知道, 这个闪光或者火眼在枪桶外。
机枪实现这个效果使用喷嘴和一些创造性的缩放和位置代码。
让我们开始看类定义和机枪。
短的美好的- 你可以看到这里引出从CGun, 加上有生气的序列和精灵成员。现在让我们看现在填充这些成员。加载一个喷醉闪光精灵。
在我们可以制作喷嘴之前,加载一个精灵。这里的代码。
注意right off the bat 那么我们将调用基类实现RestoreDeviceObjects。这样我们的基类加载枪模型。之后,我们创建新的动画序列,和 单个的帧延迟 0.025秒(真快). 我们然后绑定它动画到我们的火焰粒子上(21.2)
机枪发射火焰
我们刚刚完成学习怎么调用我们射击方法。 现在让我们看看从机枪的透视。它已经告诉火焰, here’s what it does:

这里你看到机枪的开始的时间和, 开始时间的喷嘴精灵。 它然后分配随机的颜色和旋转精灵, 刚刚它一些多样变化。如果精确的同样的精灵被使用,需要一些同样的大小和旋转,它可以恰当的原始转换。然而,各种变化大小和渲染,我们可以创建许多不同的喷嘴和一些图形内存。
 那很酷, 你大概觉得怎么我们获得机枪喷嘴闪动关闭, 模拟许多每秒子弹。要回答它,我们必须看和更新方法。 让我们开始看CanFire:
好, 很容易。 我们火光时间不在运行。现在让我们更新:
Ah-ha! 这是诀窍。 我们运行0.05秒后再停止。然二,重新调用动画下列,那帧仅仅才0。025秒。
 那么现在,喷嘴, 让我们假设玩家有鼠标按扭。在第一帧, 机枪将秒年个 “ 确定,我而已射击“, 我们的框架调用机枪方法。在那点,机枪时间,精灵时间。然后0.025将直到我们的枪到达0.05然后我们再发射火焰。- 如果我们精灵显示0.05秒更长,我们将不改变喷嘴,它关闭真实。
提示: 记住因为我们的时间注册它们,我们的框架将调用CTimer::UpdateAll, 枪和精灵将没有运行调用它们更新方法。
绘制喷嘴闪光
 你现在已经看到后面机枪闪光的逻辑 。There is only one thing left, and that’s code that 实际上渲染喷嘴动画在屏幕上。
Earlier I snipped out an excerpt from CMachineGun::Render. 这里的缺少片段:
其次, 秘密的这些代码 是转化为视矩阵。 注意在这个代码和AssebleWorldMatrix之间 ? 在两个地方, 我们将整合视矩阵用一些其他的变化到这个公告牌代码没有精灵。
另外, AssembleWorldMatrix, 有一些数据在代码里完全的基于我的看法。 这个(0.0, 0.0, 2.8)转换喷嘴。 我察觉到机枪桶内。没有缓役更多指定 ? 你将大概确定模型或者事物的顶点- 但是简单的例子程序眼球值将刚刚工作。我同意更多高级的代码一些练习给你。
  Recoil ? 缩回
这个点,我们机枪几乎要完成了。我们的闪光渲染发射。然后没有缺少。当真实的机器枪火, 它退回来。让我们学习怎样模拟。

回退的秘密就是我们通过AssembleWorleMatrix来控制。 这里检测代码。 看最后的AssembleWorldMatrix参数。 混乱的有条件的操作(问题标志和冒号)被共同的说,如果时间云殉国, AssembleWorldMatrix一个向量使用x和y组件, 但是Z组见在0.0和0.5之间。如果时间不运行, 我们  AssembleWorldMatrix在向量(0,0,0).
让我们看关于几分钟。如果时间运行,这意味着枪是火焰。 AssembleWorldMatrix将转换为翻译向量我们将提供它,然后添加它的枪的位置当它被创建世界矩阵的时候。所以在基本的代码是随机的做减法从枪的位置, 导致移动一点。 没帧完成, 这创建了说明回退。 很完美!

离子炮 Plasma Cannon
接着, 我们到了讨论机枪的最后。 现在让我们看下个武器,我们的。
子弹和子弹数组。
主要的离子炮和机枪的不同可以看离子炮的子弹。这是最大的不同,但是你看,它有大量必要的改变。
作为初学者,这个问题是自己的子弹。明显的,我们需要一些其他种类的数组盛放所有的子弹。但是,将这个成员叫做CPlasmaGun类?
我踢掉围绕位和最终决定子弹数组存在依赖枪类。 这主要原因是我决定这个因为有许多解决我们操纵枪, 但是, 基于性能的原因, 我们也想设置些限制,整个子弹的数量。 这些子弹同枪分离, 我们可以维持一些主要的(然后有固定的大小), 有许多离子枪我们想当他们的火焰的时候。
这意味着我们的CPlasmaGun类需要一些附加的片段。
另外, 刚刚的CMachineGun, 你可以看 :public CGun “ 短语出色的CPlasmaGun类继承自CGun. 注意, 然后,我们获得了新的成员, m_pBulletArray, 而且一新的方法, SetBulletArray. 另外,这些链接在plasma枪它的子弹数组。
作为代码实现, CPlasmaBulletArray指正的赞扬了CRecyclingArrayDyn. 这个类封闭装了访问循环数组,和 提高它的子弹指定功能。这些数字确定为NUMBULLETS常量(记住, 你初始化静态成员变量从类定义)。 也在类的必须重新设置和InvalidateDeviceObjects, 加上UpdateAll和RenderAll方法,移动和绘制所有的子弹。 最后的成员, AddBullet, 允许我们添加子弹到它的最初的位置, 它的速度。
一个个别的子弹没有引入其他的。
这仅仅有趣的东西是CPlasmaBullet包含粒子(绘制真实的子弹) 和 CPlasmaBullet继承自CBullet基类。 这里CBullet看起来像:

基类提供了每个指定子弹类型(CBullet引出) 使用位置和速度, 一起一些手边的构造函数和辅助函数。

更新和渲染子弹。
这是一个容易的话题。 渲染子弹需要没有什么精灵位置等于子弹位置。更新子弹意味着添加它们的速度在它们的世界位置移动它们在子弹方向。 所以,UpdateAll和RenderAll方法使用CPlasmaBulletArray非常短, 所以短的实际上我不能在这里列出它们。但是, 我将展示给你纹理使用plasma子弹。
TIP(提示) 这仅仅子弹有在生命期。我硬编码这个五秒; 一旦子弹到达它的五秒, 子弹数组将更新杀死。 你也可以,然后,我想改变这子弹死亡当它们指定远离用户或当它们装墙的时候再死亡。
Firing a Bullet 发射子弹
 现在我们知道怎样绘制和移动子弹了,让我们学习怎样创建它。 这里的代码。CPlasmaGun::Fire:
正确的发射子弹,我们需要知道它的位置和它的速度。我们可以获取位置(0,0,0)向量和运行它 世界矩阵, 转换我们(0,0,0)点到枪的世界位置。
 我们可以获得我们的速度开始在(0,0,1)向量 - 因为玩家发射子弹到场景- 和运行我们转化到视矩阵。 然后, 轻微的捕获。 当我们计算子弹速度时,我们不关心实际摄影机的位置,因为我们获取转化到向量位置。 所以,我们设置底部转换视矩阵为0, 刚刚像做天空盒在最后的章节。这意味着我们的矩阵可以转换我们的关系的方向 -----(0,0,1),或者 直接在前 - 进入完全的方向基于在摄影机的角度。所以,如果我们的摄影机向后转(更确切的说, 在负的Z轴上), 这个矩阵将转换到我们的(0,0,1)点到(0,0,-1)。 漂亮!
   之后我们双方在位置和速度向量上,我们可以调用AddBullet 创建子弹和添加它到数组。注意我增加速度到50到(0,0,1)向量 - 同样的不同,it’s just a question of whether你想先乘或最后乘。
离子炮 Miscellany和简介。
最难的部分是渲染离子炮获取子弹后我们的行为是正确的。我们讨论它,然后,因为这些新其他的细节我不想知道错过:
CanFire . 离子枪的CanFire方法强制用户等待发射十分之一秒。它那样做,枪的时间,开始在火眼方法。
Recoil ? 定时器也使用模拟回退的枪。我们实现机枪回退使用随意的Z修改,然而plasma枪我想微小的不同效果。 我想发射跳跃快速的当子弹出火焰的时。然后慢慢的返回原点。所以,plasma枪的回退函数计算z修改基于枪的时间。它开始是-1,然后添加时间到时间值。这样,在我的看法下,创建漂亮的真实的看回退。播放如果你喜欢。
And with that, 我们可以在讨论离子枪后结束。当然,你可以确定所有的不同的枪基于这些同样的枪, 子弹,速度和位置算法。 例如,替换速度使用加速,添加些烟粒子, 改变子弹粒子, 你自己的一些漂亮的火箭。
闪电武器
 讨论第三和最后的武器 - 激光武器。 这种枪是唯一从两种离子炮和机枪只直的能量带。我决定用这个效果来进行分离。首先最重要的,我决定花真实的激光当枪发射的时,第二,我想使用粒子系统创建一些特别的能量粒子,从子弹当开火的时候。是的,我知道完成不科学的任何人头上有真实的激光 能量? 但是我想它看起来很酷。 检测合格的看如果同意我的观点。
The CLaserGun Class 激光枪
之后我们加上激光纹理, 下个逻辑步骤定义我们的CLaserGun类:
立刻你可以发射一些有趣的东西在类里。例如,我们事业能够两个顶点和索引缓冲。我们使用粒子系统, 一些奇数原因我们存储世界矩阵在类内。所有对于我们是神秘的,将一会解决掉它 - 继续读吧!

Firing the Laser 发射激光
如果你可以发射它? 这里代码获得工作完成。
大部分代码涉及到它自己的创建附加的世界矩阵,但是注意在两个线我们设置了计时器和我们启动了粒子系统。另外注意 我们存储世界矩阵 - 我们这么做是因为我决定之后发射一个光波,它可以移动,甚至如果玩家仍然在移动的时候。存储世界矩阵在m_matWorld创建beam中指地方,他们的淡出。

绘制激光
现在我们有世界矩阵, 我们很容易绘制漂亮的激光:
这个技巧来绘制激光,制作一个长的,模状的四边形。
注意,当我们设置四个顶点的时候,我们制作四边形有技术在0.30单元, 没有高度, 但是长度是98个单位!那是很长的,and it is that trick that makes the laser appear to be firing off into the distance.
另外注意我们弄乱了alpha值在最近的两个值内。设置alpha值在减去两倍的时间值,我们创建激光淡入淡出之后在一半秒。

整合粒子系统
最后接触的激光效果的是粒子系统。在激光发射方法的内部,我们设置粒子系统结束枪的桶。我们然后告诉它执行脚本先前的编译。
这个脚本看起来像这样:
简单的脚本传送许多小的,明亮的粒子(看图21.8)然后收缩直到最后垂死。我创建脚本基于我自己的想法; 我鼓励你编辑它出现在你自己的唯一的效果。
本章简介
我希望你喜欢武器的效果!
明显的, 有一些更多的技术你可以使用提高你的武器效果质量。动态的光发射重要的任务是武器- 火箭和光墙作为飞跃走廊。武器也可以代表性的标志当他们交叉到墙壁时——弹火箭的弹坑, 发光的离子的能量,and that sort of thing.这些附加效果可以有些意思不同的在使各种武器大吃一惊, 所以确定填充当一创建你游戏的时候加入细节。
关于例子程序
 代替每个枪有它自己的例子程序,我决定整合所有的成一个大的例子。
这个程序说明了不同类型的武器- 一个简单的机枪, 离子炮和激光。

练习:
1.        提高 Ch21p1_FiringRange例子程序所以它显示瞄准器在屏幕中心。大概容易使用这些用途,屏幕的坐标,宁愿使用 trying to fiddle with the z coordinate
2.        曾经, 硬编码是可以的。然而,它也可以改变,被砍掉。这个例子程序工作更大的枪的模型,但是它将火眼。如果你使用一个不同的模型,因为距离不同, 不正确。治疗这些,看如果你可以算出怎样移出硬编码和坐标, 替换它们的值用枪的模型。
3.        制造四个武器 —— 火箭发射——基于离子枪。 添加19章的粒子系统到烟效果。提示:最初的旋转火箭Mesh将基于旋转摄影机, 所以使用逆矩阵。
4.        这个一个容易的:添加检测ProcessInput,到当前枪如果在两个枪切换的时候。

33

主题

544

帖子

554

积分

高级会员

Rank: 4

积分
554
发表于 2006-11-17 19:26:00 | 显示全部楼层

Re:Special.effects.game.programming.with.directx这书好

这书确实瞒好的,以前看过这书里模拟水的那个例子,挺漂亮的

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2006-11-17 20:29:00 | 显示全部楼层

Re:Special.effects.game.programming.with.directx这书好

.....
这个,这个是用软件翻译的吧
汗-_-#
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 22:13

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表