使用Managed DirectX编写游戏(-)

2024-01-19 00:38

本文主要是介绍使用Managed DirectX编写游戏(-),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者:clayman
clayman_joe@yahoo.com.cn
仅供个人学习之用,勿用于任何商业用途,转载请注明作者^_^ 

 

 

        3D游戏编程,显然,这是一个很复杂的主题。首先,让我们来学习一些编写任何游戏都会用到的基础知识。把你的创意转变为真实的游戏是一种很有趣的经历。把你的想法雕琢为一个人们可以获得乐趣的游戏,是每个开发者的目标。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

         所有的一切都来源于创意,游戏也是如此。游戏创意可以来自于生活中所有地方。也许你看到了另一个很好玩的游戏,但总觉得稍做修改它将会更好玩。也许你昨晚的梦就能创造一个完美的游戏。无论你的灵感来自于哪里,都必须先有了灵感再编写游戏。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

         当然,对于我们即将要编写的游戏来说,你将使用我的创意。选择这几个游戏是有很多原因的,但主要原因还是和难度有关。无论如何,我们将会尽可能的覆盖所有你可能遇到的游戏类型。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

         第一种类型是益智游戏(puzzle game)。经典的Tetris(俄罗斯方块)就是这类游戏的代表。几乎所有学习游戏编程的人都克隆过这个游戏,因此,跳过它,编写一些特别一点的东西。游戏中将有一个可以在板子上跳动的角色。板子由一系列的立方体构成,类似一个棋盘。每个立方体都有一种特定的颜色,当角色跳到这些立方体时,他将会变为另一种指定的颜色。当所有方块都和这一关制定的颜色相同时,这一关就算赢了。

 

设计细节

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

         当游戏创意浮现出来之后,就应该花一些时间把它写为游戏方案。并确保对所有可能遇到的问题都有解决方法。对于这个游戏来说,我们列出了一下条目作为方案的细节。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

l          名字叫做Blockers的益智游戏

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

l          单人游戏

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

l          3D环境

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

l          基于完成每一关的时间来计算得分

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

l          每一关都由一系列相连的立方体构成,就像建立在棋盘上一样

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

l          每个立方体都是单独的实心颜色

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

l          当每一个立方体的颜色都和本关预定的结束颜色相同时,管卡结束

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

l          每个立方体都有一个颜色列表,这个列表最多包含6种颜色,最少2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

l          玩家通过调到另一个立方体来移动,同时,所跳到的立方体变为列表中的下一个颜色

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

l          游戏开始时,颜色列表中只有2种颜色

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

l          高级关卡通过增加颜色列表中的颜色来增减难度

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

l          如果玩家通关了,难度将回到一开始的状态

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

l          如果玩家不能在最大的制定时间完成本关,则游戏结束。

 

这是否是一份毫无遗漏的文档了呢?也许不是吧。但他回答了大部分我们将如何编写游戏的问题。明白在开发之前,你不可能把所有性

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

都设计好了是很重要的,随着开发和思考的深入,游戏将会需要越来越多的特性,但是,无论如何都不能贸然在没有考虑到底想完成些什么特性时就开始编码,这会导致更大的混乱。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

         有了方案,就可以开始设计游戏中的对象模型了。你将有一个神奇的游戏引擎,由他来维护玩家信息、当前关卡、以及渲染的设备。渲染的设备用来完成所有美妙的绘图工作。玩家总是需要一些直观的表示,渲染设备会处理好这个工作。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

         大多数的游戏都需要当前关卡的信息。当前的时间是最重要的,因为最终的得分和是否结束游戏都是由他来决定,因此,当前的管卡必须可以访问时间。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

         实际的关卡将被储为文件,保存在程序的media目录中。当前的关卡必须是所存在关卡中的一个,所以关卡必须能访问这些文件。实际上,关卡只要追踪组成每一关的立方体列表就可以了。每一关最少有两个立方体,当然高级别的管卡中将添加大量立方体。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

         虽然编写游戏不会很容易,但你看,要达到目标,所创建的对象并不多。另外,为了让游戏有具有可玩性,只要让高级关卡不会难到使玩家有挫败感就可以了。没有比让玩家苦恼的游戏更糟的东西。如果游戏不好玩,那么就不会有人玩它,就不会成为成功的游戏。

 

为什么需要3D游戏

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

         你需要认识到这个游戏(实际上是所有游戏)根本不“需要”作为全三维的场景来渲染。考虑到所有显示器都是平面的,再好看的3D场景都要映射为2D的图片。完全可以把游戏中所有可能的场景设置为一组2D的精灵(sprite),当然,这样需要更多的美工操作。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

         假设你安装了DirectX SDK的任何版本,打开DirectX Sample Broeser,确保只选择了左边的C#选项,点击左上的Direct3D标题,找到Empty Project项目,并安装它。之后,在VS中打开项目。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

         这样我们就创建了一个“空白”项目。(实际上它还绘制了一些UI控件,但先忽略他们)。但是,这里还没有任何3D 的物体,这一部分的内容是告诉你为什么我们需要编写3D游戏,因此,来绘制一些东西吧。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

         添加几行代码来显示一个缓慢旋转的茶壶。添加如下变量

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

private Mesh teapotMesh = null;

 

 

 

private Material teapotMaterial;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

         接下来创建茶壶和材质,在 OnCreateDevice 方法的最后添加如下代码:

 

 

 

 

teapotMesh = Mesh.Teapot(e.Device);

 

 

 

teapotMaterial = new Material();

 

 

 

teapotMaterial.DiffuseColor = new ColorValue( 1.0f, 1.0f, 1.0f, 1.0f);

 

 

 

 

 

 

 

 

 

 

 

 

为了让茶壶更好看,接下来添加灯光,在 OnResetDevice 方法中添加代码:

 

 

 

 

e.Device.Lights[0].DiffuseColor = new ColorValue( 1.0f, 1.0f, 1.0f, 1.0f);

 

 

 

e.Device.Lights[0].Direction = new Vector3(0,-1,0);

 

 

 

e.Device.Lights[0].Type = LightType.Directional;

 

 

 

e.Device.Lights[0].Enabled = true;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

准备工作到这里就结束了。找到 OnFrameRender 方法,在 BeginScene 方法之后添加代码:

 

 

 

 

e.Device.Transform.View = camera.ViewMatrix;

 

 

 

e.Device.Transform.Projection = camera.ProjectionMatrix;

 

 

 

e.Device.Transform.World = Matrix.RotationX((float)appTime);

 

 

 

e.Device.Material = teapotMaterial;

 

 

 

teapotMesh.DrawSubset(0);

 

 

 

运行程序,可以看到一个渲染的茶壶。茶壶在3D世界里有一段悠久的历史。在那个建模软件还不发达的时代,获得一个真实的3D模型相当困难,而茶壶就是最早供人们免费使用的模型之一。另外,茶壶有许多不错的特性适合于用来做测试:它有圆滑的曲面,可以显示光影渐变的效果,并且容易识别。

 

 

 

 

 

 

 

 

 

 

 

 

需要注意的是,虽然茶壶是这个程序里唯一的模型,但我们并没有使用任何额外资源来省城模型,而是使用了Mesh类的一个静态方法。我们使用了最少的资源得到了一个不错的茶壶。

 

 

 

 

 

 

 

对于3D版本来说,我们可以从任何角度观察茶壶。但是假设我们需要在2D世界里实现同样的效果呢?我们需要为茶壶旋转的每一个角度保留一张位图(就是360张图),如果还想让茶壶沿任意轴旋转,那么就需要4664600张不同的位图。那么对于虚幻竞技场这样的游戏来说,就算他什么都不干,只绘制2D精灵,也至少需要一张DVD来保存数据,同时还要有一大群艺术家花上几年时间来创建这些东西。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

如果你的艺术家可以创建高质量的3D模型,显然,你就可以使用相对很少的资源更加自由的创建场景 。可以用许多不同方法来渲染一个简单的模型,比如不同的灯光、缩放比例、位置、角度等等,而这一切使用2D来实现都是不切实际的。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3D程序的这种自由性需要强大的处理能力来实现,为了满足这种处理能力,甚至形成了一整个产业。nVidiaATI就是这个产业中的领导者。现代的图形卡有了飞速的创新,甚至在处理能力上超越了CPU

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

现在的图形卡(支持DirectX9的图形卡意味着他至少支持shader model2.0)每秒能渲染数百万三角形。不要担心,我们稍候会讨论关于着色器(shader)的内容。如果你想知道为什么需要那么多三角形,那么你需要知道三角形是构成3D模型的基本多边型。以下就是线框模式之下的茶壶模型。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你看,整个茶壶都是由三角形构成。为什么使用三角形呢?因为它是唯一能够保证共面的闭合多边形,这样,在渲染时更容易计算。任何3D图形都可以用三角形模拟出来。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

至此,我们的游戏需要是3D的吗?当然不需要,你可以完全使用精灵来编写游戏,但这还有什么乐趣呢?大部分游戏编成的书籍都只涉及2D部分,但3D世界才是真正让游戏精彩的地方。我们即将开始三维之旅。

 

编写文档

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

         接下来,我们将来到编写游戏最重要的一个环节,编写文档。在一行代码都没有编写的情况下,我实在无法强迫你花一点时间来考虑可能遇到的问题。事实上,我遇到的所有年青游戏开发者在开发第一个游戏时都是直接开始编码。慢慢你才会明白快速的开始编码会带来很多麻烦。对于这个游戏,需要解决什么问题?当然,需要一个游戏引擎作为游戏的大脑。一个玩家对象,一个用于渲染的设备,以及一个维护关卡信息的方法。最常见的现实开发文档就是UML。如下图所示:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

         如果你熟悉UML,那么各熟悉之间的关系应该是很明显的。如果不熟悉,就需要花点时间来看看这篇文档在说什么。首先,他把问题分成了组成游戏的几个逻辑组件。这里,四个对象分别是游戏引擎、玩家、关卡、方块列表,以及单独的方块。每个对象的属性和方法都列在了对象盒里,这样就可以快速的对每个对象有一个总揽。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

         把图放到一边,我们到底需要做些什么呢?显然,需要有一个控制中心来控制所有操作。在这里,就是游戏引擎。注意看UML图,游戏引擎包含了用于渲染的device(从InitializeGraphics方法可以看出来)。游戏引擎需要知道以下东西:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

l          玩家对象

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

l          当前关卡

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

l          游戏是否结束

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

l          如果是,那么玩家是否赢了当前关卡

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

l          如果是,那么玩家是由通关了

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

游戏引擎还需要保存其他信息,比如渲染的设备,以及一些其他对象,但这些都是私有方法,因此,不现示在UML中。接下来的对象是玩家,这是一个相当简单的类,我们只需要知道它的位置,同时,让他可以渲染它自己就可以了。在我们的引擎里,玩家更像一个抽象的概念而不是实际对象。这个对象主要是为了控制任何现实玩家。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

游戏引擎所需的其它信息都来自于levels对象。实际上这也是一个很简单的对象,他也只包含了几个其他对象,比较重要的就是blocks集合。每一个方块包含了在不同层次如何控制它自己的信息,包括可能的颜色列表,以及是否需要翻颜色。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

好了,有了这最最简单的文档,可以开始编码了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

这篇关于使用Managed DirectX编写游戏(-)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/620764

相关文章

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

Lipowerline5.0 雷达电力应用软件下载使用

1.配网数据处理分析 针对配网线路点云数据,优化了分类算法,支持杆塔、导线、交跨线、建筑物、地面点和其他线路的自动分类;一键生成危险点报告和交跨报告;还能生成点云数据采集航线和自主巡检航线。 获取软件安装包联系邮箱:2895356150@qq.com,资源源于网络,本介绍用于学习使用,如有侵权请您联系删除! 2.新增快速版,简洁易上手 支持快速版和专业版切换使用,快速版界面简洁,保留主

如何免费的去使用connectedpapers?

免费使用connectedpapers 1. 打开谷歌浏览器2. 按住ctrl+shift+N,进入无痕模式3. 不需要登录(也就是访客模式)4. 两次用完,关闭无痕模式(继续重复步骤 2 - 4) 1. 打开谷歌浏览器 2. 按住ctrl+shift+N,进入无痕模式 输入网址:https://www.connectedpapers.com/ 3. 不需要登录(也就是

Toolbar+DrawerLayout使用详情结合网络各大神

最近也想搞下toolbar+drawerlayout的使用。结合网络上各大神的杰作,我把大部分的内容效果都完成了遍。现在记录下各个功能效果的实现以及一些细节注意点。 这图弹出两个菜单内容都是仿QQ界面的选项。左边一个是drawerlayout的弹窗。右边是toolbar的popup弹窗。 开始实现步骤详情: 1.创建toolbar布局跟drawerlayout布局 <?xml vers

C#中,decimal类型使用

在Microsoft SQL Server中numeric类型,在C#中使用的时候,需要用decimal类型与其对应,不能使用int等类型。 SQL:numeric C#:decimal

探索Elastic Search:强大的开源搜索引擎,详解及使用

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选,相信大家多多少少的都听说过它。它可以快速地储存、搜索和分析海量数据。就连维基百科、Stack Overflow、

flask 中使用 装饰器

因为要完成毕业设计,我用到fountain code做数据恢复。 于是在github上下载了fountain code的python原代码。 github上的作者用flask做了fountain code的demo。 flask是面向python的一个网站框架。 里面有用到装饰器。 今天笔试的时候,我也被问到了python的装饰器。

mathematica的使用

因为做实验用到Bloom filter这一技术,Bloom filter里面的数学公式可以用来画图。 那么用什么画图软件比较好呢? 当然是Mathematica啦。 利用代码Plot[{y=x},{x,0,100}] 就可以画出比较好的图 简直nice