游戏编程感想

时间:2024.4.13

游戏编程感想

9班 53080907 周杰

首先,通过游戏编程课程的学习,我了解了怎么用我们所学过的知识进行游戏编程,不过对于第一开始应该用什么语言,你有许多种选择,包括Basic、Pascal、C、C++、Java等等,而且在网上关于游戏制作新手应该选择哪门语言的讨论也很多。推荐选择C和C++做为开始写游戏的语言。一些人可能会说这两种语言对于没有编程经验的新手来说有点难度,我不同意这种说法,因为我就是刚开始的也是选择这两种语言。另外C/C++在今天是两种应用范围最广的语言,因此你才会更有可能得到更多的编程和学习资源以及其他人的帮助。 其次,如果要进行游戏编程,我们要对我们在大学期间学过的相关知识有个大概的了解,游戏编程设计到经济学,统筹学,物理学,机器人学,生物学,心理学,人工智能,计算机图形学,多媒体技术,虚拟现实等等。而且它也是一个团队的合作才能完成的工作,它所涉及的工作有策划、程序、美术、音乐等。只有每个方面的工作相互配合达到完美,所设计出来的游戏才是一款经典的游戏作品。

第三,作为游戏编程,它所设计的不单单是一款游戏,如果把它想成仅仅工人们娱乐消遣的工具,那就把游戏定义的有所狭隘。游戏只是人们日常生活中所能接触到的一部分应用,它更可以应用虚拟现实的技术把这个产品应用到人们生活的方方面面,比如军事模拟训练,仿真模拟等等。

最后,不要仅仅是积累知识,用它。除非你用它们,否则你不能真正的知道和理解它们。用你所学的东西制作一个小的Demo。认真的去做书里面每个章节后面留的练习。

尽量玩更多的游戏。这样做可以给你许多灵感并能帮助你把游戏做的更好一些。这也可以给你枯燥的编程工作减轻一些痛苦。

帮助别人。在教别人或者给别人讲解的过程中你将会更加的了解自己,学到很多东西。 有始有终。不要陷入“我知道我能完成这个游戏,但是我有更好的方法,因此我要继续想想我的那个方法。”如果你能完完整整的写完一个你从一开始要做的游戏,你将会学到非常非常多的东西,而且你也有东西可以证明你不是一个把什么东西都停留在嘴巴上的人。在你成为一个有经验的游戏程序员之前,请把你要做的游戏更简单更容易一些,不要贸然的去尝试写一些比较大或者很复杂的游戏。


第二篇:游戏编程


我们的精彩,全因您的参与 — 中国游戏开发者.CN

游戏编程101

作者:Bruno Sousa 翻译:傻马乱踢 前言

我曾经写过一些小的关于游戏初学者的编程指南,现在我决定把这些小文章组织一下,形成一个系列指南,当然了,是针对初学者的。(老鸟就不用看了)我一直怀疑游戏编程是否能给你带来财富,但是世事如棋,努力的工作加上一点想象力,你可能发大财呀!(我并没有想向你要钱的意思)。

最初,我考虑连同一个小游戏同时讲解,直到游戏完成,后来我放弃了这个想法,决定写一篇广泛一点的文章。只要我有时间,我就会写下去的。

阅读本篇文章,你学要有一些C和C++的基础知识,原因是我经常混合使用它们,因为有些部分用C表达好一些,而有些部分用C++表达好一些。如果你只熟悉其中的一种,我想不会影响你看懂这篇指南的。如果你真的遇到困难,你可以写信给我,,我将竭力帮助你。

当然了,我如果没能达到我所预期的目的,我也是同你一样的人,难免会出错。如果你发现任何错误,请告诉我,谢谢。

开始吧!

非常初级

实话实说,任何一个希望自己有一个光明前途的游戏程序员,至少要了解DirectX。当然,还有其它的工具,如图形工具OpenGL和最新的音频工具OpenAL,但是近期的工业标准是DirectX,所以我们就用它。你还需要一个编译器,能够编译成Win32可执行文件的。(这里我们将使用Microsoft Visual C++6.0,当然,其它的也可以)和一个DirectX SDK软件包。(我们将使用7.0版本)你可以从Microsoft的主页上下载。

我也假设你知道怎样编译普通的Win32文件和使用扩展库。使用DirectX前需要一点准备,下面我介绍一下在Visual C++6.0中的配置DirectX的过程:

首先点击Tool菜单,选择Options,然后点击Directories,在Show Directories for 组合框下拉菜单中选择Include files,增加一个新的目录。将你的DirectX的路径填入。(例如:C:\DXSDK\include)然后将它移到列表的第一位,使编译时第一个寻找它(防止寻找老版本)。然后选择Show Directories for组合框下拉菜单中的Library files,方法同前,只是把\include改成\lib。现在,你已经设置完了DirectX。你仍然需要手动增加一些库文件到你的项目中,但先不急,我将在下一部分讲它。

我们将着手第一个游戏Pong Clone(不知道怎么翻译,惭愧),你有很多途径去编写游戏,我将介绍我喜欢的一条途径,如果你喜欢其它的,随便你了。我坚持用它是因为我当学徒期间一直用它。

我的编写游戏过程是:

1. 设计完整的游戏

2. 建立所有的游戏资源、游戏引擎和游戏必备的工具。

3. 在测试平台上开发各个部件。

4. 组合各个部件为一个完整的游戏

5. 测试和更正。

6. 定草稿

7. 让公众测试

我喜欢用以上步骤完成游戏的制作;如果你有自己的,最好用自己的。

提醒注意:第三条可以理解为边开发各个部件边测试各个部件。

第 1 页 共 8页

我们的精彩,全因您的参与 — 中国游戏开发者.CN

▲第一个设计

当我最初编写游戏时,我从来没有事先设计过,我认为这是一项乏味的工作,我不喜

欢它(现在我也不太喜欢)。因为我认为游戏在我的头脑中,设计或者是不设计,根本就不会影响我编写程序代码。现在,我知道我错了,完全的错了。事先设计好游戏,可以使你全面的考虑好整个游戏,不至于有大的纰漏,更不至于当你写完500行代码后,发现这个结构就不应该这么定义,这个周末的工作被扔进了垃圾箱。尽管我们所要编写的这个Pong游戏是一个十分小的游戏,但我们仍然先在纸上把它勾画出来,而不是只在头脑中勾画。当然,如果你有自己的设计模板,用你自己的好了,萝卜青菜各有所爱吗!我习惯于自己的方式并且它可以使我更舒服的设计自己的游戏。

◎ 简介

这是一个简单的游戏介绍。该游戏运行在Windows平台,需要DirectX插件。进

入游戏后,游戏者控制的飞船要反击另一个游戏者或电脑,目的是使球通过目标

区域。

◎ 最小的说明书

你可能想忽略设计文档的这一部分,但是它的确是组成完整游戏设计文档的必备

部分。

奔腾166以上CPU

16M以上显存

3M以上硬盘空间

与DirectX完全兼容的显示卡

Windows 95,98或者2000

◎ 游戏规则

这一部分是必不可少的,即使再小的游戏也需要。大游戏可能要把这部分分解成

好几部分。

本游戏的规则十分直接和容易,游戏的目的是得分。游戏操纵者要使球通过目标

线,而对手(另一个游戏者或电脑)不让球通过。优秀者控制的飞船只能在固定

的区域移动。【我没有玩过,所以只能翻译成这样,领会精神】

◎ 菜单

这一节可以分成几个部分,当然,小游戏可能写在一个或者两个部分里面就OK了。 主菜单由四个部分组成:新游戏、最高记录、积分榜、退出游戏。背景你可以放

上一张图,任你行。

#新游戏:弹出另一个菜单,你可以选择难易程度和单人游戏或双人游戏。

#最高记录:显示最高的得分

#积分榜:所有的或者前十名的分数

#退出游戏:问是否真的要退出,选择后退出或者返回游戏

当你暂停游戏时,会弹出一个菜单,由三个选项组成:继续游戏、重新开始游戏、退回到主菜单。

#继续游戏:就是继续游戏

#重新开始游戏:就是重新开始游戏

#退回到主菜单:可以重新选择难度及其它

◎ 图形

所有的图形都将从SpriteLib库产生。所有的背景图片你可以找一些星空图片代替。 ◎ 图形引擎

有时这一部分同设计文档分开。

第 2 页 共 8页

我们的精彩,全因您的参与 — 中国游戏开发者.CN

这里将制作一个图形引擎Ping,它可以从磁碟导入图片,渲染和平滑移动。

文字部分将用GDI(Graphics Device Interface)实现。

◎ 游戏的操纵

通常游戏都允许操作者自己设置操纵键,但是这里我们就武断一点,已经定义好了。

控制飞船相当容易,第一个游戏者只需要控制两个键,UP和Down(就是上下键),另一个游戏者控制A和D键,飞船只能上下移动。(不要失望,我们只是在学习) ◎ 人工智能

若是大一点的项目,我会单独拿出一个文档讨论它的。但这里就不必了。

本游戏有四个难度级别:容易、一般、难、你疯了。

电脑将根据选择的难度级别利用不同的计算公式和循环判断来反击游戏者。

◎ 进度表(时间表)

这是编写游戏最可能出现问题的部分。几乎没有人能够精准的为游戏创作制定时间表,但游戏每一部分的生成需要一个时间表。

这里我就不做时间表了,因为我只能利用业余的时间为大家写文章。

这就是全部的计划文档,当然了,是按照我的喜好作的,你可以有自己的。

▲开动吧!

§前言

我回来了,带来了一些好消息和一些坏消息。坏消息是我们可能不能继续进行上篇文章所说的立即编写程序,原因是我们还需要介绍一些前提的工作,尤其是Win32构架和错误处理,学会了这些后,我想我们能更容易应用DirectX。好消息是文章的结尾处将要给一个完整的源代码。它可能不是很好,但它能工作。(至少我希望如此)

废话少说,让我们干吧。

§错误处理

在我们介绍Win32架构前,我们先应该创立一个错误处理系统。由于用GDI在DirectX里显示文本不是很快,我们用自己的出错文本文件代替。我们还要建立一个必要的退出功能,当文件编译出错时,我们不希望死机。我们将建立Cerror类来处理所有的出错信息。类的原形将是下面的样子:

class Cerror

{

public:

FILE *fErrorLog;

Bool bQuit;

LPSTR lpzMessage;

CError(LPSTR,bool);

~CError();

ProcessError(DWORD);

};

现在我们来为每一个变量做一个简短的解释。FErrorLog是一个指向所有出错信息的指针;bQbuit是一个布尔变量,通过被赋值true或false来决定程序出错时是否退出;lpzMessage是实际的错误信息,系统将分配适当的内存给它;CError是构造函数,它有两个参数,字符

第 3 页 共 8页

我们的精彩,全因您的参与 — 中国游戏开发者.CN

串参数和布尔参数,当程序出错时,相对应的出错信息将传递给字符串参数,代表是否退出程序的true或false将传递给布尔参数。~CError()是析构函数,将释放我们所占用的内存。

对于C语言程序员来说,类就相当于结构的功能,当然,类有更广泛的应用,但我们将不涉及它。

下面我们将开始错误处理程序的编码。首先我们必须编写构造函数和析构函数。

CError::CError(LPSTR lpzFileName,bool bQuitOnError)

{

fErrorLog = fopen(lpzFileName , “wt”);

bQuit = bQuitOnError;

}

CError::~CError( )

{

}

构造函数的内容很简单,首先以文本模式打开了一个以wt命名的文件,并把文件内容赋值给了fErrorLong,然后把退出标记赋值给了bQuit。

目前,析构函数是一个空函数。

下一部分是错误处理的核心。现在,它是非常基础的,不过我们会不断增加内容的。 CError::ProcessError(DWORD dwError)

{

DWORD dwMsgSize;

Switch(dwError)

{

default :

dwMsgSize = strlen(“Unkown error”);

lpzMessage = (LPSTR)malloc(dwMsgSize + 1);

strcpy(lpzMessage,”Unkown error”);

break;

}

if(fErrorLog != NULL)

{

fprintf(fErrorLog, lpzMessage);

}

if(lpzMessage != NULL)

{

free(lpzMessage);

}

if(bQuit == true)

{

if(fErrorLog != NULL)

{

fclose(fErrorLog);

}

PostQuitMessage(dwError);

}

第 4 页 共 8页

我们的精彩,全因您的参与 — 中国游戏开发者.CN

return 0;

}

让我们仔细的看这段程序,我们首先声明了一个变量存放字符串的长度;然后用switch检测程序正在哪个错误上。马上,我们发现只有default(默认)状态,它处理了三件事:1、检查了字符串的长度;2、分配足够的内存空间给它;3、把它拷贝给类的成员变量lpzMessage。然后我们检测是否有必要把消息传送给文件并且显示出来。然后我们释放字符串占用的内存,最后检测是否应该退出程序和关闭文件。

我想加入下面两项功能:1、无论我们想要加入一个什么样的错误检测,都应该在default之前,我们将稍后做它。2、我们没有作任何检测错误检测功能的本身是否正确,这是你的作业。试着检测一下内存是否分配正确,文件是否被成功打开等等。自己试一试,若有问题可以给我写信 akura@crosswinds.net (英文的),我将尽力帮助你。

我们现在需要一个类的实例:

CError ErrorHandling(“errors.log”,true);

它是做错误处理的。

现在让我们进入Windows的世界。

▲Win32的框架

据我所知,很多游戏程序员都没有系统的学习过Windows编程基础,他们往往从别的程序里拷贝窗口的框架,当然,这并没有什么错。我也并不是想教你Windows API的编程,但我将教你一点建立窗口的必备知识。

char szClassName [] = "Chapter2";

char szWinName [] = "Chapter2";

LRESULT CALLBACK WndProc(HWND,UINT, WPARAM, LPARAM);

头两个变量是类的名称和窗口的名称,我们将马上用到。第三行实质上是消息处理。 对于DOS和UNIX的程序员来说,C/C++程序总是从void main()开始,在Windows里,从WinMain开始,并且含有几个参数,你必须需要window.h这个头文件。

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpCmdLine, int nCmdShow)

{

MSG msg;

HWND hWnd;

WNDCLASSEX wcl;

bool bRunning;

ZeroMemory (&wcl, sizeof (WNDCLASSEX));

wcl.cbSize = sizeof (WNDCLASSEX);

wcl.hInstance = hInst;

wcl.lpszClassName = szClassName;

wcl.lpfnWndProc = WndProc;

wcl.style = 0;

wcl.lpszMenuName = NULL;

第 5 页 共 8页

我们的精彩,全因您的参与 — 中国游戏开发者.CN

wcl.cbClsExtra = NULL;

wcl.cbWndExtra = NULL;

wcl.hIcon = LoadIcon (NULL, IDI_APPLICATION);

wcl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);

wcl.hCursor = LoadCursor (NULL, IDC_ARROW);

wcl.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);

WinMain返回的类型是int APIENTRY。接下来有四个参数(括号里的):第一个是当前的实例句柄;第二个在Windows98、95、NT中已经不用了,通常设置为NULL。第三个是一个指向字符串的指针。反正很少用它,先不理它。第四个参数决定了窗口在初始显示时的状态。

我们还需要四个变量。第一个是消息变量msg,该变量保存有对于执行代码而言非常重要的信息。每当接收到新的消息时,消息变量的值就被重新装入。第二个变量hWnd指的是实际的程序窗口。第三个变量wcl将掌握窗口类的信息。第四个变量bRunning指明程序是否运行。

剩下的就是窗口类的信息。就不多说了。【若不懂,参看《Windows图形编程》。译者按】

if (!RegisterClassEx(&wcl))

{

ErrorHandling.ProcessError (ERROR_REGISTER_CLASS);

return (-1);

}

上面这一小段儿是说:进行窗口类注册,若有错,调用错误处理功能。你需要把#define ERROR_REGISTER_CLASS加入到Error.h头文件中,并把下列代码加入到ProcessError的default:前面。

case ERROR_REGISTER_CLASS :

dwMsgSize = strlen ("Chapter 2 - Error log file\nCould'nt register

class...\n");

lpzMessage = (LPSTR) malloc (dwMsgSize + 1);

strcpy (lpzMessage, "Chapter 2 - Error log file\nCould'nt register

class...\n");

break;

这将增加一个“Couldn’t register class”(不能注册类)的错误处理。

回到WinMain,我们还需要创建和显示窗口。我们来设置类的名称,窗口的名称和窗口的类型,窗口的坐标和大小(0,0,640,480),父窗口,没有默认得菜单,当前的实例和最后赋值为NULL的参数。最后我们显示窗口。如下:

hWnd = CreateWindow (szClassName, szWinName, WS_OVERLAPPEDWINDOW,0 , 0,

640, 480,

HWND_DESKTOP, NULL, hInst, NULL);

ShowWindow(hWnd, nCmdShow);

现在我们来到WinMain的最后一个环节,创建一个消息循环。程序在此处不断检测消息或命令的输入,并将相应的消息发送出去,传送给消息处理部分。

第 6 页 共 8页

我们的精彩,全因您的参与 — 中国游戏开发者.CN

while (bRunning)

{

if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))

{

if (msg.message == WM_QUIT)

{

bRunning = false;

}

TranslateMessage(&msg);

DispatchMessage(&msg);

}

else

{

}

}

return 0;

}

最后,我们return 0,来让程序知道一切正常。

完了吗?还没有,我们还需要谈谈信息的处理部分。

▲信息的处理

LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM

lParam)

{

switch (msg)

{

case WM_DESTROY:

PostQuitMessage(0);

return 0;

default:

return DefWindowProc (hWnd, msg, wParam, lParam);

break;

}

return 0;

}

所有的消息处理多是如此样子,不用太深究参数部分。Switch部分才是重要的。最简单的就是如上:只有一个case WM_DESTROY,它的地作用就是接收到关闭窗口的命令(消息)时,执行PostQuitMessage。所有不是程序需要处理的消息,都通过default下的DefWindowProc 处理了。

▲ 结论

就到这里吧。我希望你能了解我们所讲到的,如果你有问题或建议,写信给我。

第 7 页 共 8页

我们的精彩,全因您的参与 — 中国游戏开发者.CN

(英文的)谢谢你有耐心读完这篇文章。下载源代码请到

第 8 页 共 8页

更多相关推荐:
就业与维权感想

大学生就业与维权感想随着高校招生规模的不断扩大,每年需要面临就业的毕业生也呈快速增长的趋势,大学生面临着难就业、就业难的这样一个不争的事实。由于大学生自我维权意识的淡薄等各方面原因,大学生合法权益受到侵犯的案例…

用心做事心得感想

用心做事有感《用心做事》老子说:天下难事,必做于易;天下大事,必做于细。这句话精辟的指出成就事业必须从简单的事情做起,从细微之处入手。难如何做于易,大如何做于细,是要讲究方法、技巧,要靠责任心、耐心、热心,一句…

化工实习感想

化工实习感想校外实习对我们来说还是第一次,第一天感觉也挺轻松的,先由师傅给我们讲解了一下安全知识以及大概工艺流程之类的,接连几天便由员工带领我们按分好的小组参观整个工艺流。别看原理很简单,可实际上远比我们想象的…

焊接工艺实训感想

焊接工艺实训感想经历了一下午对电路板的焊,我觉得自己学到了很多东西,虽然大一的时候自己也在金工实习的时候学过电焊,但是那时的电路板好简单,而且元器件的管脚都分的好开,没有像这次的电路板,元器件的管脚都特别精细,…

工作总结感想

工作总结感想一年真的很快,转眼我就快成了所谓的学长了,欣喜中又有些怀念,经过在院学生会科创部一年的工作,我对科创部本身有了更深入地了解。要想做好新学期的工作就需要对一年的工作进行总结,才有助于新学期工作的展开。…

考试考不好的感想

考试考不好的感想短短两天的其中考试结束了,随之而来的翘首企盼的成绩也揭晓了。我以二分之差与每一名失之交臂。这成绩给我留下的则是深深的思索。总结经验教训,我觉得自己太马虎大意了,还有就是平时努力程度不够。痛定思痛…

图书馆实习感想

图书馆实习感想一、读书的重要性我国历史悠久,文化源远流长。虽历经战火、朝代更迭,五千余年的文明亦不曾中断。维系中华文明血脉,使之薪火传承、生生不息的正是书籍从古到今的积累和流传,正是这些散发墨香的纸张酝酿了我国…

学习感想

我认真学习了总裁在管理大会上的讲话研读数遍感触多体会深收获大并有了如下心得总裁在大会上的讲话以20xx年工作纵深开展指导思想为要高屋建瓴读来令人振奋我自豪的看到现在的集团公司正如一架列车沿着又好又快的轨道高速行...

新员工工作感想的发言稿

新员工工作感想的发言稿在座的各位同事大家下午好很感谢xxxx办及此次总结会筹委会给我此次发言的机会光阴似箭展转间进入xxxx已一年多时间这一年来自我检讨句说是在迷茫懵懂中度过现回想刚进公司再到办事处然后稳定在佛...

近期工作感想

近期工作感想最近在公司领导组织下检修班组在宁东电站进行为期一个半月的检修工作听到这个消息我们也是很惊讶这就意味着我们在这一个半月的时间里没有了休息在这次检修的时间内也是学到了对安全生产与安全责任的全新认识和一些...

工作感想

工作感想20xx年1月8日我来到了三希科技股份有限公司里担任寒假临时工作虽初来咋到并不感到生疏及陌生而是对即将工作的的环境憧憬着怀着无比忐忑的心情最后终于开始工作了每天十二个小时的工作时间按时起床上班吃饭及睡觉...

做主持人的感想

做主持人的感想今天对我来说是一个特别的日子也是我第一次扮演公司主持人的角色所以对我而言印象很深刻终生难忘从中也学到了不少东西在这个金秋的季节在这个凉风习习的夜晚由我们郭总率领全体员工相聚在这里隆重地举办了今晚这...

感想(488篇)