现在的互联网行业从事Windows游戏开发的人实在是太少了。一是因为门槛较高,游戏行业本来就是互联网行业最尖端的领域,要想从事游戏开发,不仅要掌握一门过硬的语言,尤其是对C++的精通,还要对算法非常精通,深刻掌握计算机图形学等知识。熟悉以后还得掌握一些重要的图形库(OpenGL和DirectX)以及一些强大游戏引擎(Unity3D,Cocos2d-X等)。这些书籍光是看完就要花很久的时间,更别说在项目中熟练运用了。这条路漫长而艰辛让许多想从事游戏开发的初学者们望而却步。并且市面上关于游戏开发的好的书籍实在是少之又少,绝大部分又都是外文书籍,这更加阻挡了许多人迈入游戏领域的大门。
但是我相信一定有很多同学和我一样对游戏开发领域无比向往。下面是网上的大神们推荐的一条游戏开发进阶之路,如果你可以将下面的东西全部掌握,想必你在游戏领域也算是登堂入室了。
编程语言类书籍类
1.《C++ Primer》
2.《Effective C++》
3.《More Effective C++》
4.《Exceptional C++》
5.《More Exceptional C++》
6.《Essentional C++》
7.《Advanced C++》
8.《STL 源码剖析》
10.《C# 从入门到精通》 (Unity 3D 需要用到)
11.《Lua》 强大的脚本语言
Windows游戏编程书籍
《Windows 游戏编程之从零开始》 适合初学者入门,我看的就是这本书
《DirectX 9.0 3D 游戏开发编程基础》 红龙书(游戏开发首选)
《Ultimate Game Programming With DirectX》
《Introduction to 3D Game Programming with DirectX9.0c A Shader Approach》
图形类书籍
《计算机图形学》 电子工业出版社
《3D游戏与计算机图形学中的数学方法》
网络书籍
《网络游戏服务器端编程》
《网络游戏客户端编程》
《网络游戏开发》
下面再介绍一下,你应该掌握的一些理论知识:
3.游戏服务器编程
3.1内存管理(游戏服务器24*7运行的,根本容不得内存泄漏)。
3.2对象池,线程池(提高服务器性能)。
3.3异常捕获,堆栈跟踪。(不要指望在VC的工程中一步一步debug来测试服务器程序)
3.4数据结构。(栈,队列等都必须自己实现,这是游戏编程的必须,否则无法做深入的跟踪和调试,以及无法捕获跟踪栈和队列中发生的错误)
3.5高效socket,完成端口的编程
游戏引擎
4.Unity3D,Cocos2d-x
5.对C++的模版的高级用法要了解的比较深入
6.对C++的内存管理的各种解决方案要非常熟悉并亲手实验过
7.对AI的各种算法要有了解:比如博弈论中的极大极小算法,A*算法的优化等等
8.对C++的装载链接过程和Lua的虚拟机的一些底层实现要有了解
9.对VS或者Xcode这两种IDE需要可以熟练的应用
10.对OpenGL或者是DirectX要有了解,做过一些Shader和Renderer
11.了解过一些游戏公司的后端框架,例如网易的Pomelo
哈哈哈,看完你要学的东西以后是不是觉得一阵头大,没关系,慢慢来。学习知识是一个漫长的过程。等你全部掌握以后,你会发现你的世界会与别人大不一样。
介绍完这些以后,下面贴个小程序激励一下大家。
在VS2012上面创建一个完整的窗口(代码来源于Windows游戏编程之从零开始)
#include<Windows.h>
#define WINDOW_WIDTH 800 //窗口宽度
#define WINDOW_HEIGHT 600 //窗口高度
#define WINDOW_TITLE L"[致我们永不熄灭的游戏开发梦想]程序核心框架"
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);//声明窗口过程函数
//WinMain函数,Windows应用程序的入口函数,我们程序从这里开始
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_PAINT:
ValidateRect(hwnd,NULL);
break;
case WM_KEYDOWN:
if(wParam==VK_ESCAPE)
{
DestroyWindow(hwnd);
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR lpCmdLine,int nShowCmd)
{
//窗口创建四部曲之一:设计一个完整的窗口类
WNDCLASSEX wndClass={0};
wndClass.cbSize=sizeof(WNDCLASSEX);
wndClass.style=CS_HREDRAW|CS_VREDRAW;
wndClass.lpfnWndProc=WndProc;
wndClass.cbClsExtra=0;
wndClass.cbWndExtra=0;
wndClass.hInstance=hInstance;
wndClass.hIcon=(HICON)::LoadImage(NULL,L"icon.ico",IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);
wndClass.lpszMenuName=NULL;
wndClass.lpszClassName=L"FortheDreamOfGameDevelop";
//窗口创建四部曲之二:注册窗口类
if(!RegisterClassEx(&wndClass))
{
return -1;
}
//窗口创建四部曲之三:创建窗口
HWND hwnd=CreateWindow( L"FortheDreamOfGameDevelop",WINDOW_TITLE,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,WINDOW_WIDTH,WINDOW_HEIGHT,NULL,NULL,hInstance,NULL);
//窗口创建四部曲之四:窗口的移动、显示与更新
MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true);
ShowWindow(hwnd,nShowCmd);//显示窗口
UpdateWindow(hwnd);
//消息循环过程
MSG msg={0};
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,0,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
//窗口类注销
UnregisterClass(L"ForTheDreamOfGameDevelop",wndClass.hInstance);
return 0;
}
很简单的程序,这就是我们后面学习GDI和DirectX游戏编程时用到的基本框架。