不可错过的网游开发盛宴
技术与开发
编者按:网络游戏太火!面对这么一个高速增长的行业,而我国的网游开发人才却存在巨大的缺口。面对机遇,还在彷徨的开发者们何不试着加入呢?为此,我们特别策划了“走近网游开发”系列文章,将系统、全面地将你带进网游开发的殿堂!
巨大的人才缺口
网络游戏在中国起步得比较晚,作为一种新兴的行业,近几年来可谓抢尽风头了。盛大在2001年春以30万美元拿下了韩国网络游戏《传奇》的代理权,从此盛大走上了网络游戏的道路,网络游戏也曾经把盛大的陈天桥推上了中国大陆首富的位置。与盛大不同,网易一直主张自主研发,它的《梦幻西游》已深入人心。网易在2006年第四季的财报显示出,有80%左右的收益都来自于网络游戏。每年网络游戏行业的总收入都比上一年增长不少,从有关机构的分析数据上看,网络游戏可真是“钱”途无量了。
虽然从数据上看网络游戏行业的收入是很可观的,但国内的网络游戏却处于一种非常尴尬的局面。国内受欢迎的网络游戏里有很大一部分都是从国外引进回来的,如《魔兽世界》、《奇迹》等等。国内三大网络游戏巨头,有两家都主要是代理国外游戏的。这一局面产生的原因是代理游戏比自主研发的成本和风险都要低很多;另一个原因是国内的游戏开发人才缺口巨大。所以近年网络游戏开发被公认为是高薪的职业,也由此出现了许多游戏开发的培训机构,而这些培训机构都打着“高薪就业”的旗号。
这里有一点要提醒大家,虽然现在出现了很游戏开发的培训机构,但并不适合所有的人。我不敢说这些培训机构都是骗人的,但想在短短的几个月内,从初学者达到专业级的水平,是不可能的,除非你是传说中的天才。所以我认为这些培训机构只适合一些有一定基础的人。
游戏开发的利剑
虽然网络游戏开发确实“钱”途无量,但是你想要吃这块蛋糕,也要付出相应的代价。网络游戏开发被认为是高薪的行业,并不仅仅是因为近几年国内网络游戏的火爆,还有一个原因是因为网络游戏开发的技术含量高。
游戏开发是一门综合的艺术,它综合了策划、编剧、美术、音乐、程序等等。实事上,电子游戏已被誉为一个美称——第九艺术。在本系列文章里,我们仅仅讨论网络游戏开发的程序部分。下面分别讨论编程语言、算法、图形库。
工善欲其事,必先利其器。如何选择开发工具呢?下面为大家详细介绍。
1.选择高效的编程语言
现在的编程语言林林总总,有C/C++、Basic、Java、Delphi等等。我们如何从中选择一种适合游戏开发的呢?一般来说,游戏开发的首选语言是C++。C++语言是一种面向对象的开发语言,适用于游戏,而且用C++开发出来的程序比起Basic、Java、Delphi等语言的执行效率要高。大部分网络游戏的实时性要求都很高,所以程序的执行效率显得尤其重要。现在市面上大多数网络游戏都是用C++开发的,如《魔兽世界》、《梦幻西游》等。
2.利用最优的算法
把算法单独作一节来讲,是为了告诉大家,算法在游戏开发中的重要性是举足轻重的。算法在游戏开发中应用得很广泛。举一个有趣的例子,有一点游戏开发基础的读者应该听说过A*(读作“A星”)算法的大名。大家不知有没有玩过《魔兽世界》,如果你玩的猎人,按下“Ctrl+1”组合键,你的宠物就会找一条最短的路径向目标杀过去。这就是A*算法的威力,A*算法用于寻找最短的路径。
当然,网络游戏编程涉及的算法远不止A*一种,我们在这里举例主要是为了告诉大家算法的重要性。算法的好坏,也与程序的执行效率紧密相关。
3.熟练掌握图形库
在图形库方面主要有DirectX与OpenGL。许多初学者都会有不知选择哪一个进行学习的烦恼,其实到底选择哪个并不太重要,并不存在一个什么事情都能做得到,而另一个不能做到的情况。选一个,然后学下去,当你掌握了其中一个图形库,要学习另一个也是很容易的事情。所以,在本系列中,我们仅对DirectX进行讨论。
DirectX在设计上处于应用程序与硬件之间,如果硬件能完成某个功能,DirectX会调用驱动程序来完成。如果硬件不支持这个功能,DirectX会用软件来模拟,当然这样画面就不会太流畅。我们这里所说的图形库是DirectX的两个重要组成成员——Direct Draw(用于2D图形编程)与Direct 3D(用于3D图形编程)。微软从DirectX8.0版本开始就放弃了继续更新Direct Draw,即使你用的是DirectX9.0,其中的Direct Draw还是7.0版本的。
Direct3D用于3D图形编程。Direct3D使用的是左手坐标系,想象你直立站着,X坐标向你右手方向伸延,Y坐标向你上方伸延,Z坐标向你前方伸延。在3D的世界里,所有的物体都是由三角形组成的,如一个四边形可以由两个三角形组成。用三角形组成3D世界的所有物体,并给它们赋予不同的材质,有必要时可加上贴图,最后打上灯光,这就组成了我们的3D游戏世界了。
正确的学习顺序
很多人都认为做游戏开发“很好玩”,老实说,我赞成。但你必须忍受一定的艰辛,然后你才能从中享受到快乐与成就感。学习游戏开发的过程也是一样,你必须先有心理准备,游戏开发比一般的应用程序开发要难得多,开发的过程常常也是枯燥泛味的。如果你忍受不了请在这个时候离开,只有具备一定勇气的勇士才能进入游戏开发的大门!
假设你是一位初学者,首先需要掌握C++语言(推荐书籍《C++ Primer》),C++语言入门不会太难,但如果要深入理解的话就需要好几年的时间了。花三个月左右的时间好好学习C++语言,然后是数据结构与算法,这是比C++更枯燥的一门课程,但你必须忍受,这是一条必定要走的路,花三个月左右的时间好好啃一啃吧。通过半年左右时间的学习,相信你对C++程序开发已有了一定的基础。但你还不懂得开发Windows程序,而目前的网络游戏大多是运行在Windows平台上的。Windows程序开发是你的另一座高山(推荐书籍《Windows程序设计》),拿好道具,花三个月左右时间往上爬吧。
之后,也许你已经可以开发一些简单的小游戏了,但相信不久后你就会对游戏画面有所不满,这时是DirectX登场的时候了!不要打算一下就拿3D来试刀,你会大受打击的,还是先从2D开始吧(推荐书籍《游戏编程大师技巧(第二版)》)。在平面的游戏世界里行走了三个月时间后,如果你还是向往着3D的世界,好吧,花四个月时间好好研究一下Direct3D吧(推荐电子书《Introduction to 3D Game Programming with DirectX 9.0》)。现目前为止,你所做的都是些单机的游戏,想进入网络游戏世界还要学习Socket编程(推荐书籍《Windows网络编程》),你还要在网络世界里游走三个月左右的时间。
通过以上的学习,你已经有能力可以自己开发一些非常简单的网络游戏了。在学习的过程中大家不要把大部分的时间花在书本上,应该多上机动动手,在开发的过程中肯定会发现不少问题,那时再从书中寻找解决方法。就这样不断重复学习你才会学得更快更好。
如果你还想更深入学习,可以对汇编语言、计算机组成原理、数学、物理学、图形学进行研究。
对于上面提到的重点内容,我们会在系列文章中逐一为大家安排。本期,我们就从“敲门砖”——C++开始讲起吧。
用C++编一个最简单的网游
在这么短的篇幅里把C++讲解清楚是不可能的。下面给出一个C++小例子,让初学者对用C++进行网络游戏编程有初步的认识。这是一个控制玩家角色的例子,玩家给出指令,游戏角色便执行动作,如行走、谈话、战斗等等。
#include <iostream>
using namespace std;
class Player
{public:
Player() {}
~Player() {}
void Walk() { cout<<"Walk"<<endl; }
void Talk() { cout<<"Talk"<<endl; }
void Fight() { cout<<"Fight"<<endl; }
};
void main()
{ Player p;
int nSel = 1;
while( nSel != 0 )
{ cin>>nSel;
switch( nSel )
{
case 1:
p.Walk();
break;
case 2:
p.Talk();
break;
case 3:
p.Fight();
break;
default:
cout<<"Nothing"<<endl;
} }
}
第一段程序定义了一个Player类。C++是面向对象的编程语言,类在C++里占据非常重要的地位。不懂得类,根本谈不上懂得C++。Player是“玩家”类的抽象,定义一个类的关键字是“class”,这个类里面有一个构造函数Player(),构造函数在类对象被实例化的时候调用。~Player()是析构函数,析构函数在类对象被销毁的时候调用。可以看出,构造函数与类名相同,析构函数是在类名前加一个“~”符号。Walk、Talk、Fight是Player类的成员函数,或者称之为方法。如我们要玩家角色在游戏场景里行走,就执行Player类的Walk方法。在这里为了简单化,所有的方法都只是打印字符串。
main()为主函数,是C++程序的入口。函数的第一句程序实例化了一个Player类的对象。接下来的是一个循环,只要变量nSel不等于0,这个循环就会一直执行。在循环里,程序根据玩家的输入而决定执行Player对象的哪个方法。输入“1”执行Walk()方法,输入“2”执行Talk()方法,输入“3”执行Fight()方法,输入其它值便什么也不做(打印字符串“Nothing”)。
附:学习书籍推荐
《C++ Primer(第三版)》
本书是学习C++必备之书,它讲解了泛型编程,C++面向对象技术、模板、标准C++程序设计等等,可谓面面俱到。而且给出了许多有价值的例子与练习,由浅入深。
《Effective C++(第三版)》与《More Effective C++(第三版)》
这两本书介绍了许多条有价值的C++编程准则,它们将会让你少走许多弯路。看完后你会发现对C++有了新的了解。
《深度探索C++对象模型》
这本书的门槛相对比较高,但通过阅读此书你的C++水平肯定会提高不少。它专注于C++对象导向程序设计的底层机制,当你了解了这些,你写的程序的执行效率将大大提高。
下期,我们将向大家介绍网游编程中的算法设计,比如,《魔兽世界》中,如何让猎人的宝宝跑向敌人的路径最短。