这一篇我们主要讲Android游戏开发中涉及到的数学、物理、AI知识,有了这些基础我们能更好地进行游戏的开发。
一、数学
两点间的距离
在人工智能程序中,智能体可以通过判断敌人与自己的距离来决定发动攻击的时机。
2D场景中的距离公式:
设点P1(x1, y1)和P2(x2, y2)分别为线上的点,他们的距离d的计算方法如下:
3D场景中的距离公式:
在碰撞检测中的应用
可以在游戏中利用圆或球的边界进行碰撞检测。当然也可以利用其他图形。不过圆和球都可以方便地进行数学计算,它们在检测的速度上也优于其他图形。虽然精确度不高,但是可以作为外围检测。
两圆之间,如果两圆心的距离小于两圆的半径和,即发生碰撞。
设两圆方程分别为:(x – h1)2 + (y – k1)2 = r12和(x – h2)2 + (y – k2)2 = r22。如果:
,则两圆发生碰撞。
由于开方运算会占用大量的处理器资源,所以建议使用平方进行比较。
利用圆边界进行碰撞检测是一种较快的方法,但是极有可能会产生错误的碰撞检测结果,所以避免错误的方法是寻找一种更适合的图形来检测。只要这个图形可以用数学公式表示出来。也可以使用多重圆形进行多重检测,先检测外面的圆,如果发生碰撞则检测内部的圆,减小错误判断的几率。但多重检测会消耗更多的CPU时间。
三角函数
所有的三角函数都是直角三角形中定义的。
常用角度的三角函数值
(角度) | (弧度) | sin | cos | tan |
0 | 0 | 0 | 1 | 0 |
30 | /6 | 0。5 | = 0。866 | = 0。5774 |
45 | /4 | =0。7071 | =0。7071 | 1 |
60 | /3 | = 0。866 | 0。5 | |
90 | /2 | 1 | 0 | 不可算 |
120 | 2/3 | = 0。866 | -0。5 | - |
180 | 0 | -1 | 0 | |
270 | 3/2 | -1 | 0 | 不可算 |
360 | 0 | 0 | 1 | 0 |
在真正进入游戏主循环之前,可以建立一个三角函数的查找表,这样在游戏中需要用到三角函数值的时候就不用重新计算,只需进行查表工作就可以,大大加快运行速度。
角的正弦值在第一、第二象限是正值;
角的余弦值在第一、第四象限是正值;
角的正切值在第一、第三象限是正值;
对于所有的反三角函数,如果传入的参数是正值,那么它们的返回值都是正,即意味着该角位于第一象限;如果传入的参数为负数,那么反正弦asin()和反正切atan()的返回角度将位于第四象限,而反余弦acos()的返回角度位于第二象限。
二、物理
一维空间运动
物体只要移动就会有速率,速率是用来表示物体运动的快慢。相应的,如果一个物体有速率,那么它就会有速度,速度是速率的向量形式。即速度是有方向的速率。
匀速运动的公式:
位移 = 速度 × 时间 (D = v * t)
路程 = 速率 × 时间 (S = v * t)
平均速度:
加速度
加速度用来衡量速率的变化快慢程度。
vf表示末速度,vi表示初速度。
tf表示末速度对应的时间,vi表示初速度对应的时间。
如果a的方向和v一致,那么表示加速运动,如果相反,表示减速运动。
力
当我们准备用程序来模拟物体的运动时,首先要对我们所要移动的物体进行受力分析。物体所受力的总和决定了它的运动模式。
重力
物体运动的竖直分量加速度为-g或-9。8m/s2。我们可以利用重力加速度和物体的质量求出物体所受重力。重力是一个向量,方向指向地心。
重力公式:
w = mg 其中m是物体质量,g是重力加速度。
如果在游戏编程中,在不同星球之间切换,要考虑各个星球的不同重力加速度。
重力的单位是牛顿,记为N,1N = 1kg×m/s2。
支持力
支持力作用在物体表面,抵消重力并保证它不向下落。支持力是正交的,总是垂直于物体表面。
对于斜面上的物体,支持力减小了物体竖直方向的加速度。
摩擦力
摩擦力分为两种形式,静摩擦力和滑动摩擦力。
静摩擦力可以使物体保持稳定的状态,而滑动摩擦力则可以使物体减速。
如果物体所受的其他力总和小于静摩擦力,那么物体保持静止。一旦其他的力大于静摩擦力,物体开始运动,静摩擦力就变成滑动摩擦力。两种摩擦力都取决于它们的接触面。接触面越光滑,摩擦力越小。
要计算摩擦力,就必须知道摩擦系数。
静摩擦力:
其中N为支持力。
滑动摩擦力:
其中N为支持力。
牛顿定律
牛顿第一定律:当物体所受合力为0时,它将保持原有的运动状态不变。
牛顿第二定律:Fnet = ma。F是合力,m是物体质量,a是物体的加速度。
即,① 一个物体受到合力越大,速度改变得越快。
② 如果两个物体受到的合力相同,那么质量小的物体速度改变更快。
牛顿第三定律:对于每个力,都有一个与之方向相反、大小相同的反作用力。
动量和碰撞
跟静止物体的碰撞
和静止物体的碰撞可以用向量反射来研究物体的运动,这种运动存在着一种对称性,球射入的角度必然等于它射出的角度,即入射角等于反射角。
向量的轴平行反射
如果边是竖直方向的,则vf = [-vix, viy];
如果边是水平方向的,则vf = [vix, -viy];
入射向量:vi = [vix, viy]。
向量的非轴平行反射
如右图:球的入射方向为vi,求射出方向vf
先给公式:vf = 2·P + vi
其中vi是初速度,P为-vi基于分界线法线的发射向量。
- 写出边界B的矩阵[Δx Δy];
- 求出边界的垂直向量N = [Δy -Δx];
- 将N单位化得N' = [Δy / ||N|| -Δx/||N||];
- 求发射向量P,P=(-vi·N')·N'
- 计算反射向量vf,vf = 2·P + vi
动量和冲量
动量
P = mv,其中m是物体的质量,v是物体的速度。
如果物体的速度用矩阵表示,那么物体的动量也用矩阵表示。
冲量
冲量 = Ft = Δp,其中F是合力,t是时间,Δp是动量增量。
碰撞建模
动量定理的变形:
m1v1i + m2v2i = m1v1f + m2v2f
下标1表示第一个物体,下标2表示第二个物体。
每个碰撞的情况都介于弹性碰撞和非弹性碰撞之间。弹性碰撞是一种没有动量损失的碰撞。但现实中的碰撞往往伴随着能量损失,因此可以用还原系数ε来表示能量损失的大小。
(v1f – v2f) = -ε(v1i – v2i) 0<ε<1
三、AI
AI的定义
首先我们需要明白AI是什么,AI全称是Actificial Intelligence人工智能。其实这一词汇并非为游戏制作而产生,对于它的研究是广而且深的,它包含着机器视觉到专家系统等一大系列,当然我们没必要去细细了解它,我们仅仅需要了解的就是它对游戏制作有关的着一部分。
游戏规则分为三大部分,规则对象,规则事件和相应规则。而我们所述说的对象主要是玩家控制的角色,当然非控制角色也有着自己的规则和事件,这时就需要我们赋予它们以类似于人类的智能。所以我们可以简化为一句话:让游戏中的NPC获得分析,判断的能力,并进行相应行为的设计,我们称之为游戏AI设计。
游戏中AI设计的目的
首先我们可以看一个GDC(Game Development Conference)上对游戏业界中AI技术的调查年份游戏公司中拥有专门负责AI小组的公司百分比 游戏中用于AI运算的CPU资源
2007 | 24% | 5% |
2008 | 46% | 10% |
2009 | 80% | 25% |
从中可见,游戏中AI发展十分迅猛,游戏的AI更加受到各个游戏制作公司的重视。而它为什么这么受到亲睐和重视呢?AI对游戏起到了什么作用呢?
1、增加玩家的挑战性
在许多以前的老游戏中,大家可以发现其中并没有很多的AI痕迹。例如<超级玛丽>吧,里面的怪物出现种类,顺序,行走方式丝毫没有受到玩家的行为改变而做出相应的改变,大家若是能花一定的时间去熟悉这款游戏,了解了其中的怪物的出现点,出现时间,游戏将很容易通关。(当然游戏设计者为避免这样的情况,设计了极其精巧的地图来弥补AI的不足)。而现在很多游戏中,敌人NPC并非一成不变的按照已定的路线进行移动,他们根据玩家的行为做出相应的判断并且行动,在更大的范围内他们拥有着一定的"自主性"。例如CS中的NPC。
对玩家来说,对付复杂AI的敌人需要更高的技巧,挑战性有一定程度的增加。
2、创造更真实的虚拟世界
不清楚大家是否玩过原版的CS,其实原本CS中的NPC还是比较愚蠢的,他们只会走相对固定的路线,对突发事件的反应能力也相对较差,通常只要我们在背后游戏了某一NPC,即使你枪法较差,它们也很难有存活的机会,或许,它们根本就不会回头。而经过一系列的发展修正后,现在CS中MPC不再那么好对付了,他们在背后受到攻击后,会很快时间内做出回头攻击的行为,甚至还会"说话"发出信息告诉其他NPC请求援军,这更类似于玩家的行为。
我们在翻以前的游戏时或许能想起某些游戏中,NPC角色会被卡在一块石头或树木前,傻傻的撞着树走,而不会饶个圈子走过去,这将使玩家看低这款游戏,"太假了,无聊"我们可能会发出这样的感叹而宣告这款游戏的卸载。在现在游戏则很少见到这种情况,多种"寻路法"的计算已是游戏程序员们最基本的一种要求。
3、增加游戏的可玩性
为什么CS,魔兽争霸等游戏,人们更喜欢上游戏平台,战网与人对战,因为与人对战有更多的风格,有更多的不可预料性,玩家在追求这种未知的结果。如果一部电影在开始时我们就已知其中结局,我们对它的热情就会丧失,我们游戏也是一样的。
使NPC更加具有AI,更模拟人类的思维,行为,可以使玩家拥有更多的不可预料性,给玩家一种惊奇感,新鲜感。而实际上我们的做法是给NPC的一定的AI套路选择,例如:根据自身HP的多少,来进行"勇猛直前,边战边退,逃命要紧"等各类的AI算法的选择,将使玩家无法准确的推测NPC的行动,可玩性得到了发挥。
4、辅助其他功能
举个例子:假若我们玩一款游戏,控制角色进入了一个城市,而发现这里的敌人和其他地方的敌人AI截然不同,他们即使HP很少也会努力冲锋攻击着玩家,我们玩家会产生一种疑问,到底是什么驱使他们如此疯狂?这容易以另一种手法来激发出我们的好奇心,之后再以其他信息来告诉玩家这个村子之前遭受过外族攻击屠戮,所以人们都变的仇视侵略,勇于牺牲等,我们玩家也更加容易接受。AI设计间接的对剧情做出了介绍。
又如<三国志>系列,人物分为勇猛,果断,冷静等特性,在平时,这将影响他们的忠诚度变化,在战斗时将影响它们自动战斗的风格,当然也根据他们的AI不同,玩家进行某种举措时,武将也将给予不同的反映,客观上又体现了角色的特性。
AI设计的类型
1、FSM(Finite State Machine)有限状态机。这是最简单也最古老的AI技术,如果懂得程序的人员,可以将其简单的理解为一套if,else或者 switch,case构成的条件判断。
我这里依旧拿原先的例子来说:
例:角色种类:熊类
case1:当与玩家距离50Pixel范围内,警戒(警戒当然是种状态,属于行为规则)
case2:当与玩家距离10Pixel范围内,主动攻击最近者
case3:当受到攻击,立即攻击攻击者
case4:攻击过程中,优先攻击对方队伍中最少HP人员
case5:当攻击目标消失或死亡,则攻击10Pixel范围内最近者
case6:当与攻击目标距离10Pixel内,追随攻击
case7:当与攻击目标距离10Pixel外,警戒
case8:当与攻击目标距离50Pixel外,返回初始点,在一定范围内随机移动
这可以说是比较典型的FSM设计,无论玩家做出什么行为,都有一套AI规则进行判断和行为,而且,仅仅是一套。不会有一种行为对应两套规则的可能。当然,这样即使加入更多的判断可能,我们也很容易觉得单调,因为确定性太强了,这就需要我们更多的引入随机性,即我们下面说的
2、FuSM(Fuzzy State Machine)模糊状态机。对于它的名词解释或许会很复杂饶口,而我们没必要去关系那些,我们可以最简单的理解其真意:就是在FSM中加入随机特性。
随机特性很早就在D&D中有过体现,在原先的帖子中有朋友评论说我举例不当,D&D不仅仅只有一个世界设定,我想他说的是正确的,D&D的最大特色还有一个就是骰子系统,这个系统我更愿意说成是随机系统。在FSM中加入随机系统,将减少了其规范性,而加大了游戏的不确定性。我这里拿上面的例子加以补充,
case2:当与玩家距离10Pixel范围内,80%几率主动攻击最近者,20%几率逃跑至玩家反方向10Pixel并警戒。
当然可以加入更多的百分比判断可能,我这里仅做出最简单的FuSM设计,
你可能觉得这并没什么,不就是多加入一个判断么?
然而扩展的来想,假如一个NPC是90%几率攻击,那么我们可以确定它为勇猛的(可设置老虎),若是60%几率逃跑,那么我们可以确定它是狡猾的或者怯懦的(可设置狐狸兔子),这样将更大程度上突出NPC的特点。
当然,我们可以再加入新的判断,当HP低于30%时,有60%几率放弃战斗逃跑,当HP低于10%时,将有90%几率放弃战斗逃跑,这也将大大加大游戏的可玩性。
细心的朋友会发现,我上面无论是逃跑还是攻击,都是给定的一个百分比,而实际上我们可以采取更模糊的方法,就是使用随机数,大部分游戏设计中都会使用一个函数"Random",无论是C++,JAVA,Ruby我们都有这个系统函数,它将生成一个一定范围内的数,我们用它来控制NPC的行为几率的话,更会有更大的不确定性。
而且使用FuSM还有一个最大的好处,它将简化我们的策划工作。 没错,是简化,我们没有必要去专门为每一类的NPC设置各自不同的规范了,我们需要做的仅仅是调整其随机数的范围,调整其百分比就可以获得性格种类迥异的NPC了。
3、可扩展性AI。这个概念可能会很大程度上引起的兴趣,而实际上它并非那么神秘,我们RM使用者实际上一直在接触着它。看这帖子的朋友里我相信有相当一部门并不懂得编程,而实际上,程序员们不关心游戏中的平衡问题,他们需要做的仅仅是实现游戏的功能,至于以如何使用百分比来控制游戏进程,他们一点也不管。那么我们开始罗嗦了这么久的FSM,FuSM是给谁看的?呵呵,是给策划看的,是给我们自己看的。是的,这样做仅仅是方便我们的调整和逻辑判断。通常,程序员们会制作一套工具来让我们进行设置和测试,而这套工具就是可扩展性AI。
当然,我们RM整个工具,我们可以说是引擎,而它若拥有了关于NPC行为规定的百分比摸版的话,那么那部分就是可扩展性AI。然而就我对RM的理解来说,在不修改RGSS的原则下,我们纯靠事件来制作FuSM设计是比较困难的,更期待Ruby高手能够加入相应的支持。
4、神经元网络。它是生理学上的真实人脑神经网络的结构和功能,以及若干基本特性的某种理论抽象、简化和模拟而构成的一种信息处理系统 。从我的理解上来说,它偏靠程序方面的东西实在太多,误差反传训练算法,BP算法,RFNN都非三言两语能够说明的,我在此依旧不再赘述,有兴趣的朋友可以上网自行查找。
AI流程图说明
我们是说策划文档的,当然就这方面要多说一些。
通常,我们做AI部分的设计说明时,很少象我这样使用条目型的文字说明,因为它过于浪费时间,而且条理性不足,我们更多的使用的流程图,这也是开始我要求大家尽可能的使用Visio的原因。当然,大家也可以使用Word来制作流程图,但个人认为过于复杂,不如Visio好用。