图书前言

前    言

本书适用读者

  本书适用于不同层次的读者,并涵盖了数学、物理学以及生物学等内容,以帮助程序员(特别是游戏程序员)理解此类内容的程序编写方式。即使读者关注的重点并非是游戏设计,相信也可从本书中获取有价值的信息。

  如果读者熟悉某种程序设计语言,例如,Java、JavaScript、Python、ActionScript、Lingo、C/C++、Visual Basic、Perl或C#,则阅读效果定会得到较大的改观,甚至可扩展至MATLAB、Mathematica或Maple等其他脚本语言。另外,本书代码示例均采用伪代码进行描述,因而相关内容适用于任何语言。

  本书主要讨论数学、物理学等知识于程序设计的应用方式,尤其是游戏环境。当然,相关内容同样适用于其他领域。如果读者对以下问题感兴趣,则有必要认真阅读本书:基于神经元集合或遗传基因学的应用程序如何应用于游戏中?迷宫理论以及细分操作如何执行?线性代数的含义以及如何使用向量和矩阵构建并控制图形对象?如何运用基本的运算知识并在高级程序设计环境中与3D对象协同工作?另外,读者也可对相关知识进行回顾。

本书内容

  顾名思义,本书针对程序设计讨论数学和物理方面的知识。需要说明的是,多数时候,相关内容并不会逐步予以介绍,读者可复制伪代码示例,经过适当调整后用于自己的项目中。本书编写的主要目的在于讨论游戏环境下数学和物理处理方案,进而从广度和深度方面重新认识某些  问题。

  本书内容可划分为4类,如下所示:

* 基本内容。此类内容多为日常生活所面临的话题,并反映出数学中的基本概念,其中包括数字、代数和几何学的基本原理。这一类话题多出现于本书的第1部分以及第2、3、4部分中的前几章中(涉及物理学和3D数学)。本书将对基本内容予以重点讲解,并包含相关推导过程和示例代码。

* 高级话题。此类话题源自数学和物理学的高级领域,并提供了某一话题的完整讲解,进而求解相关问题,而非日常见到的基础知识,其中包括:积分学(第6章)、高级物理概念(第3部分)以及3D数学,特别是与3D渲染器相关的内容(第4部分)。高级话题穿插于本书讲解过程中,包括原理和术语的解释、少量的示例以及某些重要结果的推导过程。

* 应用话题。相关内容考察基本概念于复杂环境下的应用方式,且主要分布于本书的第2部分以及第3部分和第4部分的某些章节中。应用话题主要讨论某一话题的特定示例并对其进行深入讨论。同时辅以详细的代码示例以及数学结果的推导过程。其中,对应示例有助于读者理解其他类似问题,进而采用不同的方法求解同一问题。

* 扩展话题。该话题涉及某些高级领域,并以此接触更为广泛的内容。扩展话题采用简单扼要的方式进行介绍,且出现于本书的第3、4、5部分中,其目的在于使读者了解某些基本概念和术语,且无须过分关注细节内容。对应的完整讨论则超出了本书的范围,读者可在此基础上阅读相关书籍以获取更多内容。高级话题涉及的章节包含了少量的代码示例和计算方程,以及大量的文字解析和图像示例。

  当然,上述分类方式在一定程度上存在交集,各章均包含彼此交叠的内容。本书的主要目标是理解程序设计中的数学原理和概念,因而并不会事无巨细地对每个专题进行讲解。这里,希望读者深入理解相关概念,并在遇到新问题时可做到有的放矢。据此,本书涵盖了数学和物理学原理、数学计算示例以及通用概念和术语。

  各章结尾提供了相应的编程练习,另外,本书合作网站也包含了大量的代码示例。多数时候,对应示例可在章节文件中找到,但某些较为冗长的示例则需要通过特定的名称得到,全部内容均在HTML文件中进行定位,以方便、直观地对示例予以访问。

如何阅读本书

  本书采用内容“累积”方式进行讲解,多数章节均会参考前述所讨论的知识。因此,建议读者先期快速浏览本书全部内容。即使读者对某些数学和物理学内容十分熟悉,但有时依然无法面面俱到。

  数学可视为一类实践项目,若非亲自解决某一问题,通常难以理解其真实含义。对此,读者应完成每章结尾给出的练习题。实际上,相关练习题并非独立存在,读者可思考如何将其整合至大型项目中,尝试将所学原理应用于游戏中,并整合新元素以改善现有游戏项目。作为一名程序员,应通过这一方式掌握所学知识背后的原理。

  人们通常对新生事物存在某种“恐惧感”,即使之前曾完美地解决了某些复杂任务。若读者难以理解相关内容,则可尝试再次阅读。若问题仍未解决,则可分析其中的原因——是否未曾理解相关术语?对此,读者可对相关知识进行适当回顾、阅读有关章节、考察示例、绘制图表并对其进行重新描述。如果全部工作均无效,则可暂时放弃该问题,以期待后续内容是否可提供相关线索。

关于伪代码

  本书目标旨在引入必要的数学知识,且并未介绍相关的编程风格。此处,读者无须纠结于程序语言的编程规范、实现方式、用户接口,相应地,本书较少涉及变量、对象、数组以及精灵(sprite)对象。相反,读者可关注执行相关任务的函数和算法。本书涵盖了丰富的数学特征,并可方便地在任何语言中予以实现,其具体过程可视为一个黑盒。另外,通过适当整合(与代码其他部分)以及程序设计语言中的简便方法,相同的数学操作可更好、更快地予以实现。实际上,这一情况时有发生。

  为了有效地避免编程风格的干扰,本书全部示例均采用伪代码表示,进而可将使用不同语言的程序员区分开来。本书代码关注细节问题,且采用易读方式加以编写。从本质上讲,伪代码针对解释程序加以编写,而非计算机设备。

  少数时候,代码的部分内容予以省略,进而着重强调某些重要问题。其中,省略内容采用“||”标记,代码中的注释则采用“//”标记。

  本书辅助网站中的大多数代码采用Lingo语言编写,作为一类非编译型语言,该高级语言采用无类型变量,且兼具灵活性,适用于面向对象以及过程式语言。

  本书尽量避免与变量、数组等内容相关的规范,尽管此类内容在某些时候较为重要。本书采用Lingo语言风格,例如,数组的首个元素定义为A[1]而非A[0]。

如何定位代码示例

  如前所述,代码示例采用伪代码编写,因而无法直接将其复制、粘贴至编译器中并运行相应程序。

  大多数代码示例用HTML文档表示,并通过下列两种方式进行组织:

* 章节文件夹。若代码仅与某一章的主题相关,则可找到与该章具有相同名称的文件夹,进而访问一个或多个对应的HTML文件。多数时候,读者将会得到与该章具有相同名称的文件,例如Chapter 7.html。有些时候,读者则会搜索具有不同名称的文件,对此,可通过浏览器对其进行定位,进而获取与当前章节相关的程序。

* 主索引。该方案更为有效且予以优先推荐。对此,可在名为Indexed Programs的文件夹中访问index.html文件。该文件可帮助读者访问特定的章节主题,并对全书的不同主题进行有效的组织。通过这一方式,读者可深入理解特定主题,并了解相关内容的组织   方式。

  当首次打开index.html文件时,对应内容可能稍显空泛,对此,下列内容提供了相关链接:

* Castlib?tileScroller。该链接与本书最后几章所讨论的程序有关,其中包括贴图(第23章)以及搜索和优化方案。

* Castlib math。该链接与本书前18章讨论的程序相关,并涵盖了其中的数学运算。

* Castlib mazes。该链接与本书第23~25章讨论的程序相关,并用于处理迷宫和AI问题。

* Castlib?pool。该链接包含了与撞球游戏相关的文件。该游戏首次出现于第11章,并在后续章节中多次被引用。

* Castlib?simple3D。该链接提供了与3D图形相关的程序。对应程序首次出现于第17章,后续章节则在不同环境下多次对其加以引用。

  需要注意的是,Castlib?表示分组项。其中,Cast引用了与普通任务相关的、游戏中的对象组。也就是说,示例代码根据相关主题进行分组。另外,在查看过程中,读者可能习惯于打开index.html文件,但在一段时间后,读者还可能根据单词项访问示例代码。

错误、遗漏和意见反馈

  鉴于本书的篇幅和讨论范围,错漏之处在所难免。对此,读者可向出版社提供相应的意见反馈,我们将会在第一时间对其进行处理。

本书辅助网站

  读者可访问www.courseptr.com/downloads下载代码示例文件,需要说明的是,该网址将直接转向Cengage Learning网站。

本书作者

  作为本书作者和多部书籍的联合作者,John Flynt的作品涉及程序设计、数学、软件工程和游戏开发,其中包括Software Engineering for Game Developers、In the Mind of a Game、Perl Power!: The Comprehensive Guide、Java Programming for the Absolute Beginner,Second Edition、Beginning Math Concepts for Game Developers以及Java ME Game Programming,Second Edition。

  Danny Kodicek就职于英国的Sunflower Learning公司,负责科学仿真以及相关工具的研发。他所开发的软件已被翻译为15种语言,并在世界范围内广泛销售。他的另一个身份是一名自由作家,其客户包括BBC和英国皇家空军。除此之外,他也是获奖网站TimeHunt的联合开发者。

  

  

  

  

  

游戏中的数学与物理学(第2版)

  

前    言

  

·VI·

  

·V·