AAA级游戏开发领域
AAA级(游戏业界通常称其为“Triple-A”,即 3A)游戏是我们经常在评价一款游戏是否为大作的衡量标准,是游戏业界“酷”的代名词。
通常指的是游戏平台像XBOX360/Play Station或者 PC上的游戏作品。
通常团队规模50人以上,开发周期在2~5年之间,有着不菲的开发预算。
是成熟的商业作品,通常都有着精美的画质,好莱坞电影风格的过场CG动画,能将艺术与技术进行完美的结合,是会让玩家玩上几分钟就瞬间爱上然后大呼过瘾的游戏大作。
特质:
社交和休闲游戏开发领域
社交和休闲(Social and casual)类游戏与AAA级游戏相比,有着更小的开发团队(5 ~ 25人),更短的开发周期(4 ~ 8个月),更少的开发预算。
主要依附着社交网络(国内如QQ空间、人人网、新浪微博,国外如 facebook,twitter)而存在。
(老少咸宜的QQ农场就是一款在国内风靡一时的典型社交和休闲类游戏)
移动游戏开发领域
移动游戏市场包括普通移动手机,智能手机以及平板电脑。
目前该平台由 Android、iOS 以及Windows Phone这三大智能移动平台主导。
这个市场与社交和休闲类游戏市场有着很大的交集,与社交和休闲类游戏相比,有着更小的开发团队(甚至是个人),更少的预算以及更短的开发周期。
功能型游戏开发领域
功能性游戏(Serious game)是开发出来用于响应特定的企业或者机构的需求的游戏作品。
(比如,国外一款名叫《Remission》的游戏,就是用于帮助孩子们理解什么是化疗以及化疗的作用和重要性的)
(又比如,我国解放军开发的FPS大作《光荣使命》系列游戏,就是为我国的军队量身打造的,进行专门的高科技军事训练的一流游戏作品)
学术型游戏开发领域
学术型游戏开发领域是近年来新出现的游戏产业分支。
(现在越来越多的机构开始资助大学或者研究所的游戏开发团队,促进了这种新生的游戏开发领域的发展)
独立游戏开发领域
独立型游戏开发领域是游戏产业的命脉所在,随着近年移动平台与社交平台的火热崛起,独立游戏开发者们的舞台越扩越宽。
有着这样一群独立游戏开发者,他们视游戏开发为梦想,他们是独立游戏开发领域的主角。
独立开发者是一个游戏背后的唯一创造力量和经济力量。
没有外部的发行商为独立游戏提供资金,也没有其他的实体发挥对游戏内容的创造性控制。
独立游戏大多是自己发行的,但多数独立开发者也愿意与发行商一同协作。发行商不提供开发资金或者控制游戏的开发过程。在这种情况下,独立开发者将首先开发游戏,仅当游戏开发完成时或者快要完成时才让发行商介入。同时,通常独立开发者工作室都非常小,常常仅有1~2人。
RPG = Role-playing Game :角色扮演游戏
由玩家扮演游戏中的一个或数个角色,有完整的故事情节的游戏。
玩家可能会与冒险类游戏混淆,其实区分很简单,RPG游戏更强调的是剧情发展和个人体验。
一般来说,RPG可分为日式和美式两种,主要区别在于文化背景和战斗方式。日式RPG多采用回合制或半即时制战斗。
ACT = Action Game :动作游戏
玩家控制游戏人物用各种武器消灭敌人以过关的游戏,不追求故事情节。
电脑上的动作游戏大多脱胎于早期的街机游戏和动作游戏如《魂斗罗》《三国志》《鬼泣》系列等。
设计主旨是面向普通玩家,以纯粹的娱乐休闲为目的,一般有少部分简单的解谜成份,操作简单,易于上手,紧张刺激,属于“大众化”游戏。
AVG = Adventure Game:冒险游戏
由玩家控制游戏人物进行虚拟冒险的游戏。
与RPG不同的是,AVG的特色是故事情节往往是以完成一个任务或解开某些迷题的形式出现的,而且在游戏过程中刻意强调谜题的重要性。
AVG也可再细分为动作类和解迷类两种,动作类AVG可以包含一些格斗或射击成分。
而解迷类AVG则纯粹依靠解谜拉动剧情的发展,难度系数较大。
SLG = Simulation Game:策略游戏
玩家运用策略与电脑或其他玩家较量,以取得各种形式胜利的游戏。(或统一全国,或开拓外星殖民地)
策略游戏可分为回合制和即时制两种。
后又被细分出模拟经营,于是就产生了SIM (simulation)类游戏。
RTS = Real-Time Strategy Game:即时战略游戏
本来属于策略游戏SLG的一个分支,但由于其在世界上的迅速风靡,使之慢慢发展成了一个单独的类型,知名度甚至超过了SLG,有点像现在国际足联和国际奥委会的关系。
后来,从其上又衍生出了所谓“即时战术游戏”,多以控制一个小队完成任务的方式,突出战术的作用。
FTG = Fighting Game:格斗游戏
由玩家操纵各种角色与电脑或另一玩家所控制的角色进行格斗的游戏。
按呈画技术可再分为2D和3D两种。
此类游戏谈不上什么剧情,最多有个简单的场景设定,或背景展示,场景、人物、操控等也比较单一,但操作难度较大,主要依靠玩家迅速的判断和微操作取胜。
STG = Shooting Game:射击类游戏
这里所说的射击类,并非是模拟射击(枪战),而是指纯的飞机射击。
由玩家控制各种飞行物(主要是飞机)完成任务或过关的游戏。
此类游戏分为两种,一叫科幻飞行模拟游戏(Science-Simulation Game),以非现实的想象空间为内容。
另一种叫真实飞行模拟游戏(Real- Simulation Game),以现实世界为基础,以真实性取胜,追求拟真,达到身临其境的感觉。
FPS = First Personal Shooting Game:第一人称视角射击游戏
严格来说它是属于动作游戏的一个分支,但和RTS一样,由于其在世界上的迅速风靡,使之展成了一个单独的类型。
PZL = Puzzle Game:益智类游戏
Puzzle的原意是指以前用来培养儿童智力的拼图游戏,引申为各类有趣的益智游戏,总的来说适合休闲。
RCG ( RAC ) =Racing Game:竞速游戏
在电脑上模拟各类赛车运动的游戏,通常是在比赛场景下进行。
非常讲究图像音效技术,往往是代表电脑游戏的尖端技术。惊险刺激,真实感强,深受车迷喜爱。
另一种说法称之为“Driving Game”。目前,RCG内涵越来越丰富,出现了另一些其他模式的竞速游戏,如赛艇、赛马等等。
CAG = Card Game:卡片游戏
玩家操纵角色通过卡片战斗模式来进行的游戏。
丰富的卡片种类使得游戏富于多变化性,给玩家无限的乐趣。
TAB = Table Game:桌面游戏
顾名思义,是从以前的桌面游戏脱胎到电脑上的游戏。
如各类强手棋(即掷骰子决定移动格数的游戏),经典的如《大富翁》系列。棋牌类游戏也属于TAB。
MSC = Music Game:音乐游戏
培养玩家音乐敏感性,增强音乐感知的游戏。
伴随美妙的音乐,有的要求玩家翩翩起舞,有的要求玩家手指体操。
SPG = Sports Game:体育类游戏
模拟各种体育赛事的游戏。
Debug文件夹,当中存放着编译过程中的中间文件,以及最后的目标文件,.exe型的执行文件( Debug 文件夹的出现对应着我们在选择解决方案时选择的是 Debug 型,如果我们解决方案类型为Release型,那么这时工程文件夹下就出现的不是 Debug文件夹,而是名为Release的文件夹)。
工程文件夹(HelloVisualStudio文件夹),当中存放着我们工程相关的源文件,头文件以及若干和后缀名为.vcxproj的项目文件。这个文件夹的名称与工程名的名称一致,因为我们例子中的工程名为 HelloVisualStudio,所以这个工程文件夹名称就为HelloVisualStudio。
扩展名为 .sIn 的文件,它记录着关于解决方案中的信息,我们打开一个解决方案,就是通过双击它。
扩展名为 .suo 的文件,它记录着应用于该解决方案的用户的选项。
扩展名为 .opensdf 的文件,记录着关于项目的状态信息。此文件只在项目处于打开状态时才会有。
微软公司为了方便我们开发基于Windows 的应用程序,为我们提供了各种各样的函数。这些函数是Windows操作系统提供给应用程序编程的接口,即Application Programming Interface,简称API。
任何Windows应用程序与Windows本身之间的所有通信,都要使用Windows应用程序编程接口,也就是Windows API。
这个接口说白了就是几百个函数组成的一个集合,它们是Windows操作系统提供的标准函数,可以提供应用程序与Windows互相进行通信的方法。
因为Windows API是在C语言称王争霸叱咤风云的年代开发的,那时候C++还未发迹,所以我们可以发现,在Windows和应用程序之间传递数据的是结构体而不是类。
Software Development Kit,中文译为软件开发包。
SDK说白了就是一个开发所需资源的一个集合。
所以 DirectX SDK 就是用 DirectX 进行开发的一个资源的打包集合。
这里需要注意API和SDK都是IT业界广泛使用的术语,并不是专指某种特定的API或者SDK。
原型:
int WINAPI WinMain(
_In_ HINSTANCE hInstance,
_In_ HINSTACNE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nCmdShow
);
WINAPI 就是_stdcall,只是为了让我们清楚知道这里的_stdcall 表示的是一种调用约定,它让编译器知道了应当以Windows兼容的方式来产生机器指令。
如果我们在写WinMain函数的时候去掉这句WINAPI 而直接写:
int WinMain(),仍然是可以编译并运行的,只不过在编译期间会得到一条警告( warning)。
这里的_In_可以理解为一个宏,表示需要我们进行自行输入(input)的一个参数。与其对应的是_Out_,之后我们也会经常在函数定义的代码中看到,它表示指定的这个参数是函数本身向外输出(Output)的一个参数。
第一个参数,HINSTANCE类型的 hInstance,它表示该程序当前运行的实例句柄。
我们可以对这个类型HINSTANCE进行字面上的理解,h前缀表示这个参数的类型为handle,句柄的意思,而后面的Instance中文意思是实例,将两个意思结合起来,所以这个类型就是实例句柄。
hInstance其实就是一个数值。当一个程序在 Windows下运行时,它唯一对应一个运行中的实例。也只有运行中的程序实例,才有资格分配到实例句柄。
一个应用程序可以运行多个实例每运行一个实例,系统都会给该实例分配一个句柄值,并且通过hInstance参数传递给程序的入口点WinMain函数。
第二个参数,HINSTANCE类型的hPrevInstance,表示当前实例的前一个实例的句柄。
我们可以对这个参数进行字面上的理解: h表示参数类型为句柄(handle) , Prev代表先前的(previous)意思,Instance依旧表示实例,那么组合起来就是先前的实例句柄。
对于这个参数的用法,MSDN中明确表示在Win32环境下,该参数总是取 NULL,这就是说,在Win32环境下,这个参数没有存在感,不起任何作用,只是在进行WinMain函数书写时需要将它专门作为一个参数表示出来而已。
第三个参数,LPSTR类型的lpCmdLine,它是一个以空终止的字符串
指定传递给运用程序的命令行参数。
参数肢解:lp前缀表示这个参数为一个指针,Cmd表示 command,命令的意思,与Line组合起来就表示命令行。
(例如,在 Windows7操作系统下的E盘有一个叫ForTheDream.txt 的文件,我们用鼠标双击这个文件时将启动记事本程序(notepad.exe)。此时系统会将E:\ForTheDream.txt作为命令行的参数传递给记事本程序的WinMain函数
记事本程序在得到这个文件的文件路径后,就会在窗口中正确显示这个文件的内容)
第四个参数,int类型的nCmdShow,指定程序窗口应该如何显示,是最大化,最小化,还是隐藏等等。
这个参数可有如下取值:
函数定义:
BOOL PlaySound(
LPCTSTR pszSound,
HMODULE hmod,
DWORO fdwSound
);
必须在编译之前连接winmm.lib库文件。
第一个参数,LPCTSTR类型的pszSound,可以看到作为LPCTSTR类型的此参数为一个字符串,指定了要播放的声音文件。这个值设为NULL 的话,就会把所有当前播放的声音全部停掉。
第二个参数,HMODULE类型的 hmod,包含了在第一个参数中指定的声音文件作为资源的可执行文件的句柄。之后会详细介绍各种资源,这里把这个参数设为NULL就可以了。
第三个参数,DWORD类型的 fdwSound,是一个用来控制声音播放的一个标志。
下面是一些常用标识的列表。
(可以使用一个或者多个标识,标识之间用“|”连接)
每个Windows应用程序至少有一个窗口,称之为主窗口。
一个应用程序通常都包含 标题栏、菜单栏、系统菜单、最小化框最大化框,甚至滚动条。
Windows已经定义好了一个窗口所具有的所有基本属性。
WNDCLASSEX结构体 定义:
typedef struct tagWNDCLASSEX{
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX, *PWNDCLASSEX;
在WinMain函数中定义一个WNDCLASSEX:
#include
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//开始设计一个完整的窗口类
WNDCLASSEX wndClass = { 0 }; //用WINDCLASSEX定义了一个窗口类,即用wndClass实例化了WINDCLASSEX,用于之后窗口的各项初始化
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, _T("icon.ico"), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE); //用全局的::LoadImage函数从本地加载自定义ico图标
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); //指定窗口类的光标句柄
wndClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); //为hbrBackground成员指定一个灰色画刷句柄
wndClass.lpszMenuName = NULL; //用一个以空终止的字符串,指定菜单资源的名字
wndClass.lpszClassName = _T("ForTheDreamOfGameDevelop"); //用一个以空终止的字符串,指定窗口类的名字
return 0;
}
第二个参数:
常用样式取值:
第三个参数:
窗口过程函数是一个回调函数(不是由该函数的实现方直接调用的,而是在特定事件或条件发生时由另一方调用的,用于对该事件或条件进行响应)。
针对Windows的消息处理机制,窗口过程函数被调用过程如下:
1.在设计窗口类时,将窗口过程函数的地址赋值给lpfnWndProc成员变量
2.调用ResgisterClass(&wndclass)注册窗口类,那么系统就有了我们所编写的窗口过程函数的地址
3.当应用程序接收到某一窗口消息时,调用DispatchMessage(&msg)将消息回传给系统,系统则利用先前注册窗口类时得到的函数指针,调用窗口过程函数对消息进行处理
在Windows应用程序中,窗口都是通过窗口句柄(HWND)来标识的。我们要对某个窗口进行操作的话,首先就是要得到这个窗口的句柄。
句柄(HANDLE)
在Windows程序中,有各种各样的资源,比如窗口、图标、光标等。系统创建这些资源时会为它们分配内存,并返回标识这些资源的标识号,这些标识号就是句柄。
一款优质的游戏一般都会有着个性化的图标与鼠标光标,而为了在我们自己开发的游戏中使用这样个性化的图标与光标资源,我们就会与图标句柄(HICON)和光标句柄(HCURSOR)打交道。
Windows程序设计是一种基于事件驱动方式的程序设计模式,Windows程序与操作系统间的通信主要是基于消息的。
每单击一次鼠标或按键,操作系统就会感知事件,将事件包装成消息,投递到消息队列中,然后程序从消息队列中取出消息并响应。
在这个处理过程中,操作系统也会给游戏程序“发送消息”,即操作系统调用程序代码中专门负责处理消息的“窗口过程函数”。
Windows程序运行的机制:Windows将产生的消息依次放到消息队列中,而应用程序则通过一个消息循环不断地从消息队列中取出消息并进行响应。
定义:
typedef struct tagMSG{ //msg
HWND hwnd; //指定消息所属窗口
UINT message; //指定消息的标识符
WPARAM wParam; //指定此msg的附加信息
LPARAM lParam; //指定此msg的附加信息
DWORD time; //指定投递到消息队列的时间
POINT pt; //指定投递到消息队列中时鼠标的当前位置
} MSG;
第一个参数:通常一个消息都是与某个窗口相关联的。(例在某个活动窗口按下鼠标左键,产生的按键消息就是发给这个窗口的)
第二个参数:在Windows中,消息由一个数值来表示,不同消息对应着不同数值。由于数值记忆不方便,所以Windows将消息对应的数值定义为WM_XXX宏的形式。(其中WM是Windows Message的缩写,XXX对应某种消息的英文拼写的大写形式)