搜档网
当前位置:搜档网 › 游戏编程入门

游戏编程入门

游戏编程入门
游戏编程入门

游戏编程入门

2008年09月16日14:40:58【发表评论/查看评论】

经常有人问我,没有编程经验的人该如何开始开发游戏。在此之前,我总是一个个的尽力回答。然而,后来提相同问题的人数增长到难以处理的地步。我决定,是时候把我所有的建议写成文章,作为一个大概。

这篇文章是针对那些想要开发自己游戏,但几乎没有编程经验的人。事实上,我假设读者没有任何编程经验。我主要讨论游戏开发的程序和设计方面,而不是艺术性。我也不准备讲述如何进入游戏行业(这方面已经有足够的资料),而只是让你逐步的开始开发自己的游戏。最后,我所指出的这条道路也并不能作为唯一的,或是最好的路径来学习开发游戏,但至少对我和一些人很有用。

选择一门语言

你要做的第一件事就是选择一门开发语言。你有很多选择,包括Basic,Pascal,C,C++,Java,等等。也经常会有人争论对于初学者那一门语言是最好的。对于这一系列流行语言的讨论,你可以参看John Hattan的著作,What Language Do I Use?(我用什么语言?)

我的建议是以C和C++开始。有些人会说这些语言对初学者来说太高级了,但因为我自己就是学C++,我并不同意这一说法。而且,C/C++是当今使用最广泛的语言(译者认为应该是汉语。。。),所以你可以找到大量学习资料和帮助。你先学C或C++都无所谓,因为只要学了一个,再学另外一个就很容易。但是,如果你先学C++,请保证在学习面向对象编程之前能理解和使用过程编程(等编程熟练再去学习类)。(译者:C是过程性语言,C++是面向对象语言)

如果你开始学习C/C++,发现太难,那再学一个简单一点的也没关系,比如Basic或Pascal。但是我真的认为,如果你坚持努力,而且有好的资料,学C/C++应该没有太大问题。

你的下一个问题可能会是:“我该怎么学C/C++?”我很高兴你这样问。最好的办法是上课。有老师可以回答你的问题,帮助你产生很大进步,编程练习作业也可以保证你能用到所学的东西。

如果你不觉得上课是个好主意,那最好的办法就是买一些好书。不要花太多时间去选一本什么“超级宝典”或“万用全书”,因为你最终可能会买几本。我建议你去一家书店,然后拿几本比较入眼的C或C++书看,直到找到一本或几本你能看懂,并且可以拿来学习的。同时,你可能会想要一些

更深入的,或者一些材料,但是你一旦对于这门语言有了一些了解,我相信

你应该有自己更好的选择。

在这里,我有必要花一些时间,来说我看到很多初学者所关心的一个

事情,特别是年轻人:没有钱买书和其他东西。首先,有很多免费资源可以

利用,图书馆,Macmillan Computer Publishing(https://www.sodocs.net/doc/2a7009325.html,/personal),

有成千上百的编程书籍。但是如果你真的想要成为一个好的程序员,还是应

该投入一部分资金。应当想方设法(合法的)帮助你弄到一些钱。

网上也有很多C/C++的学习指南。但是我认为那只能作为补充而不是

你自学的主要资源。

选择正确的编译器

你写的程序,或者代码,是以文本方式储存的,你甚至可以用记事本写C/C++程序。但是总需要有东西把他们转换成为可执行文件。对于C和C++,那就是编译器。

可用的编译器有好多种,包括很多免费的。选择一款自己适合的编译器很重要,免费的编译器就有这样的好处,你可以把它们试个遍,然后从中选择自己最喜欢的。然而,免费编译器比起商业版,可能会缺失一些功能和大部分服务。幸运的是,多数商业版编译器也兼售介绍版或学习版,这要便宜得多,通常功能却不见得少,唯一的限制是你不能发布用它编译的程序(短时间内你也根本用不着)。

总之,选择编译器取决于你能花多少钱,用什么操作系统,和为什么平台开发。如果要为windows开发,我强烈推荐Microsoft Visual C++。他强大的开发环境使得很多事做起来更方便,毫无疑问没有其他编译器更适合开发windows应用程序。如果你是个学生,你还可以折价买到。(译者:爽!)如果你在DOS平台开发,你最好的选择可能是DJGPP,免费的哦~。

选择开发平台

尽管最终你很可能为好几个平台开发,总要先选择一个来学。当你在学这门语言,还没有接触到图像的时候,你可能会想使用非图形用户界面的操作系统,比如DOS,Unix.这样可以避免接触高层,比如windows编程,让你集中精力学习语言本身。

一旦你做好开发游戏的准备,那么,应该考虑是否改变平台,让我们来看看每个选项的特征。

windows:如果你想成为游戏行业的专家,或者如果你想让许多人来玩你开发的游戏,那么,这就是你要选择的平台。因为多数你的用户使用windows,而且现在我也看不出有什么改变的迹象。当今大多数的windows游戏都是由一种你可能听说过技术---DirectX---开发的。你可以DirextX这个库直接访问硬件,这意味着你可以开发高性能的游戏。

DOS:DOS过去是占统治地位的游戏平台,但是已经一去不复返了。尽管可能有一些特殊爱好者还在为DOS开发游戏,现在没有一个为DOS开发的商业游戏,他也将继续衰落,直到微软不再支持。如果你只是想开发游戏,还是不要选择DOS,如果你非要这么做,也不要太久。记住:由于存在大量DOS游戏开发的书,可能还有人辩护从这些书中学习DOS游戏开发。但是,windows游戏开发的书越来越多,那些辩解也变得越来越无力。

Linux:Linux是Unix的一种,由于很多原因后来变得流行,包括稳定性,价格,和反微软情绪。尽管Linux用户还是相当少,但是围绕着他的热情和不断增长的市场潜力使其也成为不错的选择。

Macintosh:MAC有大量忠实粉丝并不能说明什么,几乎每一个和我讨论的MAC狂热者都需要更多更好的游戏。我没有见过多少MAC游戏开发资源,但我相信还是有的,因此这也是一个选择。

consoles:console(就是PS,N64,DC等等)的游戏市场十分巨大,当然console游戏开发的前景也不错。然而以非商业的形式开发console游戏,出于各种原因,在现在似乎行不通。如果你开发console,很可能是在被商业游戏开发组雇用之后。

开始进入主题

现在是时候讨论开发游戏了。简单起见,我假设你选择用C/C++在windows平台开发,可能你选择别的,但大多数我说的还是有用的。

首先,甚至在你打算开始开发游戏之前,你必须很好掌握C和C++.你应该懂指针,数组,结构体,函数,可能还有类。如果你精通他们,就可以开始做游戏了。

这篇文章可能不能教会你所有关于开发游戏的东西。幸运的是,也没有这个必要。这方面有很多书,网上也有很多指南。https://www.sodocs.net/doc/2a7009325.html,应该有所有你想要的东西,这里我建议你怎么开始:

找一本或几本书。对于windows游戏开发初学者,Tricks of the Windows Game Programming Gurus是个完美的开始。除此之外,还有许多好书.读透这些书,试试所有的例子,不懂得部分多读几遍。

网上指南作为补充。除了弄清书上读到的,他们还涉及一些书上没有谈及的主题。

向专家寻求帮助。如果你不能在书上或指南找到问题的答案,好好利用我们的论坛和聊天室。那里有好多专家愿意帮助别人。

这并不是要你按照顺序执行的,而是可以同时并且不断的重复执行。

光学习还是不够的,你必须运用你所学到的。从一个小游戏开始,然后在这个基础上前进。你可以看一下Geoff Howlands的著作:How do I Make Games?

A Path to Game Development.

开始,自己独立工作。不要急着加入团队,那样只会减缓学习过程。而且一旦你有了自己的几个游戏,你可以为团队做出更大的贡献。

还有关于书,你应该不仅仅看游戏开发的书。为了能够开发出你看到商店出售的游戏,你应该钻研比大多数游戏开发书籍更高级的一些主题。有一些可以在网上找到,但你也应该选一些图形学,人工智能,网络,物理学等方面的书。计算机科学学位看来唾手可得,但因为你被迫上这些课的时候可能认为他们和游戏开发无关----你错了!

包装

这里有一些提示很有用

不要只积累知识,用它:你永远不会知道会理解一些东西知道你是用他们。用你学的东西作些演示。做作书上的练习。

经常玩游戏:这样做会使你做出更好的游戏。而且可以减轻编程的枯燥。

帮助别人:能帮别人的地方尽量帮助别人,教别人的过程中自己会学到更多。

有始有终:不要有这样的想法“我能够完成这个游戏了,但是我又有一个新的想法,那就直接做下一个。”你可以学得更多如果你完成他,你也可以用事实证明你不是只会空谈。所以,尽量不要做很大很复杂的游戏,直到你有了一定经验。

开始吧!你现在可以开始准备QUAKE4了。可能你不是不是很了解,但是至少应该知道如何开始这条道路,找多些资料,加上多年努力工作,他一定会实现!

很长时间以来,游戏产业不允许新的血液加入,因为每个职位都要求申请人有2年以上的经验。但是现在是加入游戏产业的最好的时机。因为研发队伍的急剧增长,有经验的人很难找了,所以越来越多的公司从大学里招人。不管你上的是什么大学,你都有机会在游戏产业里找到一份工作。你需要熟悉以下领域。

数学-对于视频游戏开发,这个非常重要。不,你不需要去记如何求一个绕x轴旋转的曲面的表面积。你需要有很好的线性代数技能。如果你不知道点乘的公式(a dot b=a.x*b.x+a.y*b.y+a.z*b.z)和它的几何意义(|a|*|b|*a和b夹角的余弦),你是不可能获得工作的。你需要知道如何把一个向量投影到另一个向量上(a到b的投影=(a dotb)/|b|^2*b)以及一个平面上。你需要知道向量积(叉乘)是什么(a x b=[a.y*b.z–a.z* b.y,a.z*b.x–a.x*b.z,a.x*b.y–a.y*b.x]),以及它的几何意义(一个和两个向量都垂直的向量,长度等于原来两向量的长度乘以两向量的夹角的正弦)。我记忆向量积公式的方法是把i,j,k放在矩阵的第一行,然后是第一个向量,最后一行是第二个向量,然后计算这个行列式。如果你不知道什么是行列式或者如何计算一个行列式,这可不是个好的信号!你应该知道一个矩阵的逆以及如何计算,你应该知道如何转置一个矩阵。你应该知道什么是正交矩阵以及求它的逆的简单方法(求它的转置就行了)。熟悉各种坐标空间之间的转换是很重要的。碰撞检测函数背后的数学原理也很需要学习。你如何找到一条光线和另一条光线的碰撞点?一个平面呢?一个球面呢?什么是四元数(quaternions)?你如何对它们做一些常见的操作?如果你的数学已经不那么熟了或者不知道如何开始,我推荐"3D Math Primer for Graphicsand Game De velopment"。我读过以后发现它很好地覆盖了所有的基础知识。我没有读过别的书来做比较,但是这本书肯定会给你打下很好地基础,同时它也是很多游戏开发中常见数学运算的参考资料。

物理-你需要对各种抛物体的公式非常熟悉。如果你不能记住或推导出d=v0*t+0.5*a*t^2,你肯定会在面试或编程测试中遇上麻烦。你应该能轻松解决任何涉及到抛物体和重力的问题。不论未知量是重力加速度,发射角,y方向速度,xz方向速度,时间,距离,或其他任何可解的组合,你应该能没有任何困难的求出解来。你应该熟悉弹性和非弹性碰撞下的动量和动能变化。滑动和摩擦力也是你应该理解的概念。

C++-虽然一些地方还在用c多过c++,但是C++已经是游戏编程中向被广泛接受的几乎标准的语言。C++的知识是非常重要的。因为如果用的不好,你会写出非常糟糕的代码。首先,你应该知道什么是虚函数,以及如何使用它。理解虚函数表是如何工作的也同样重要,这样你就能够理解当你调用虚函数时需要的额外步骤,这些步骤会降低性能(每个对象都有一个隐藏的虚函数表指针[具体在哪取决于编译,并且对指针做类型转换时,this会有变化],这样调用一个虚函数,你需要根据这个指针找到那个函数表,然后跳到它所包含的函数指针所指的函数里,这会降低cache的效果)。知道如何有效地使用模板和操作符重载也很重要。关于C++,好的OO设计是最重要的。最常用的一些类层次很深而且很费解,你最后需要做可怕的虚拟继承或者为一些不需要的变量浪费内存。

人工智能-我在大学里学习了标准的人工智能课程,但是这些东西没有一点在游戏AI中是可接受的。教的很多算法很难实现或者对游戏而言不现实。你知道什么是有穷状态机就够了。绝大部分游戏使用有穷状态机,而那些不用这个的游戏,使用的是简单的基于规则的系统。"白与黑"(包括它的续集)是我能想到的唯一的使用了其他东西(神经网络)的例外,而且很多玩家对它的结果并不满意。如果你想找本书,我推荐"AI Game Programming Wisdom3 "。里面有两篇特别优秀的文章,一个是关于有趣的游戏AI设计,另一个是关于行为合成。严肃的说,虽然书会很有帮助,但是学习游戏AI的最好的方法是实际做一个。

图形学-这是一个重要的领域。如果图形是你的主要感兴趣的方向,那么你应该知道的比这里说的多。但是,不论你想要在这个产业里做什么职位,你应该知道一些基础。你需要知道什么是渲染状态以及通常都有哪些渲染状态? (cull,z write,ztest之类的)。什么是标准的光照方程?(I=ka*Ia+Ii*(k d*(L dot N)+ks*(R dot V)^n))。材质映射是如何工作的?材质的wrapping 和clamping有什么区别?如何高效的渲染程序中一组几何体?(按照渲染状态组织你的几何体,按照你的硬件最快的primitive分批,饭后发给图形卡)。你需要知道skinning是如何工作的。如果你对书感兴趣,我推荐"3D Computer Graphics"。这个不是专为游戏写的,多以它包括了一些在游戏中不现实的技术。但是,我想一个总体的了解是有帮助的,而且,随着游戏硬件的发展,那些现在看来不现实的技术会变的普通的。

工具开发-C#看来在游戏业界获得了不少地位。所以你也应该让你熟悉一下C#。C#在加快工具的开发上表现出不少优势。很多人说工具可以制造下一代的游戏,我同意这一点。拥有的工具越多,团队花在可以被轻易自动化的工作上的时间就越少。可能你的团队有10个美工,花程序员的一个人年来开发一个可以给美工每天省15分钟的工具并不值得,但是如果你有50个美工,那这就肯定值得了。C#可以快速的创建GUI,而且和其他一些能简化创建GUI的方法不同,这些GUI很好理解和使用,因为他们是标准的windows组件,允许你方便的设定快捷键,就像其他Windows程序一样。Visual Studio里的Form D esigner真的很好用,而且C#的metadata和event驱动的设计使得工具的开发轻而易举。你最好也对mfc有基本的了解,因为可能面试你的开发人员会有点落后与时代。如果你有兴趣学习很多关于这些技术是如何工作的(这会让你写出更好的C#代码),我强烈推荐"Applied Microsoft。NET Framework Programmin g",我在空闲的时候读这本书,然后我就不能放下了。我一章一章不停的读,因为我是那么激动的像学习下一章的话题了。记住,这本书不会教你各种fram ework里的类和这些类是干嘛的。它讲的是这个语言的核心机制,它是如何工作的。这本书也不是专门为C#写的。它告诉了你如何用VB。net做一些在C#里不能做的是,它还提供了用MSIL(MicrosoftIntermediate Language,所有。n et语言的编译器都会编译出这种字节码)写的例子,实现一些不被任何一种。ne t语言支持的功能。

操作系统-虽然这个看起来和这个和游戏开发相对而言不是太相关,但是我很高兴我在大学学习了操作系统的课程,因为我经常会用到从这门课学到的知识。关于操作系统的知识非常重要,因为它在幕后为程序处理着很多重要

的工作。特别是由于下一代的游戏终端和双核PC上的多核特性,多此案成的知识是至关重要的。对虚拟内存的了解当然是很有用的。关于文件系统,内核态和用户态切换,分页的知识对PC游戏开发更为有用,不过随着一代代的发展,终端也在变的越来越像PC。所以,知道这些东西没有坏处。

编译器-虽然知道如何写一个分析器可能并不重要,但重要的是知道你的代码是如何编程汇编代码的。这样你就能明白如何写出更优化的代码。你显然必须熟悉把你写的程序变为可执行文件的4个步骤:预处理、编译、汇编和链接。编译器如何处理常量的?很好的理解宏和知道如何用它来简化一些常用的操作是很重要的。知道你正在用的编译器的调用约定,因为参数超过一定数目的时候,会导致它们被放在栈上而不是在预留的寄存器里。调用约定的知识在你用汇编写函数的时候也是有用的。

这些只是一个作为一个游戏程序员,你应该具备的各种知识和技能的入门介绍。对每个领域,根据你的工作类型,总会有更多的你需要学习的东西。知道一些实际使用的知识之外的东西总是没有坏处的。

游戏技术划分为如下几个模块:游戏构架、图形图像、图形特效、游戏逻辑、游戏界面、人工智慧、声音音效、网络连接、系统优化等

相关主题