进化,HTML游戏!
感谢来看这篇教程的大家,虽然这些文字实际上就是用来自娱自乐的,但自己写的文字受到他人注目真的很叫人开心。
衷心希望这篇教程能帮到大家的忙,另外这篇教程属于电子文档,所以我大概会时常来更新。
本教程面向各种水平的游戏开发者,包括但不限于前端开发者。建议掌握一些网页开发的基本知识,但即使没有相关的知识,你依旧可以学习文章中讲述的一些理念,然后(如果可能的话)在你擅长的领域运用它们。
在浏览器技术高速发展的当代,你或许已经见识过了各种各样的炫酷网页,然而,你可能会有一个疑问:为什么网页游戏那么少?随着我们熟悉的Flash技术被HTML5的浪潮所淹没,各式各样的Flash游戏就慢慢地退出了我们的视野,虽然从技术上来说Flash游戏并不属于网页游戏,但结果就是,失去Flash的现在,网页上几乎没有什么游戏可玩。
以HTML5技术为基础的游戏并没有如大家所预想般地蜂拥而出,其实原因在于网页程序并不能很好封闭自己的代码和运行时环境,只要打开控制台,一切就昭然若揭。然而,在除此以外的方面,前端正慢慢发展为游戏开发的最佳平台之一:无需编译,史无前例的跨平台统一性,强大的开发辅助工具,在所有语言中最为统一的开发接口,完全开源所带来的交流机会,ASM等技术所带来的相似于原生游戏的处理速度,WebGL等技术所带来的图形处理能力……
现在,如果你和我一样是游戏开发的爱好者的话就会发现,不能闭源这点问题又算的了什么呢?重点是在你面前现在摆着的,是一个集强大,方便,易学,跨平台,自由等优点于一体的游戏开发平台。那么还有什么需要犹豫的呢?
虽然上面讲了许多关于前端的事,但这仅仅是对还没有熟悉任何一种开发方式的读者的一些建议,如果是已经习惯了某一种开发平台的读者,完全没有必要在意,因为只有熟悉的东西才是最适合自己的。
在该教程中,我将提及视频游戏开发的方方面面,同时对个方面可能存在的问题给出一些解决方案。然而,我能想到的终究是有限的,就像完成一个程序有许多方式一样,解决一个问题同样有许多途径,你从这个教程学到的,除去一些问题的某些解决方式以外,更应该有足以产生这些解决方式的奇思妙想。
总之,我想告诉大家的是,游戏开发或许是很困难的,但途中发现的问题,解决问题的过程,以及完成所带来的喜悦,是很难得的。
本教程的各章之间没有强制的前后关系,如果是对某一块比较熟悉的开发者可以自行选择跳过内容。
以玩家的角度而言我是很喜欢沙盒的,把地图的边边角角都挖个遍的那种感觉还是十分不错的。但作为开发者,我可以确定地说,几乎没有哪个游戏公司会乐于开发沙盒游戏,问题太多太多了。
当游戏的地图是来源于静态内容时,我们有许多许多种方法对其进行渲染优化,譬如阴影烘焙、多级纹理等等,这些技术都拥有比较好的显示效果,并且由于许多是预处理技术,所以运算开销普遍非常小,你可以相较简单地实现那种将景色尽收眼底的壮阔效果。
然而,当来到动态的世界,情况就复杂得多了,首先,你需要一种比较合理的地图生成算法,保证完全随机性的同时也不会产生一些奇奇怪怪的地形;接着,你需要一个将地图模型渲染到屏幕的方式,来保证准确的同时也有比较好的性能曲线;最后,你还需要一个后处理引擎,来给你的用户提供一个足够好的视觉效果。
显卡的处理能力,这常常是一个比较大的考验,作为一个我常用的计量标准,一个中低端计算机显卡推荐的三角面数量是低于30k个,极限的三角面数量是100k个。但这是比较粗略的计算,实际的处理极限取决于需要渲染的顶点和的像素面积。
虽然你可能会告诉我,沙盒不一定就是随机的,但请不要计较这些问题,事实确实如此,但是我们希望在教程中涵盖更加通用的情况。
现在有好多随机生成地形的游戏,如Minecraft,但其中大部分是以随机生成为主的,如使用柏林噪声生成随机地形。但是我们所要研究的并不是这样的生成过程,并不是说柏林噪声有什么问题,而是由于,纯粹噪声生成的地形过于杂乱无章了,在其中找不到逻辑产生的美。因此,让我们来看一些更复杂的生成方法,其中之一便是渐进式生成。
在研究渐进式生成之前,我们需要一个随机生成的地形数据。这里,你可以和大多数游戏一样使用柏林噪声来完成这个任务,但除此以外,还有一个或许更好一点的方法:随机中点位移法。