一、前言:
08年的时候, 写过一个台球游戏, 用的是java, 不过代码真的是用传说中的神器notepad写的(你信吗? 其实是用GVIM写的, ^_^), 很多类都在同一java文件中编写。 可见当时的JAVA水平真的不咋地, 时过进迁, 还是一样的不咋地。
这边是当时的CSDN下载链接: java(台球游戏), 实现比较简单。 后来写过一个版本, 比这个要强大许多, 可惜源码丢失了。
效果展示入下图所示:
本文想讲述下台球游戏中核心算法的实现, 以及游戏AI的设计技巧。 当然自己也有个小愿望, 希望能实现一个html5版的台球游戏。
二、基础物理知识:
1、摩擦阻力
其满足牛顿第二定律:
f = m * a
速度与加速度关系公式:
vt = v0 + a * t
地面摩擦力与运动物体的方向相反, 阻碍物体的向前运动。
2、动量守恒
假设物体A质量为m1, 速度为v1, 物体B质量为m2, 速度为v2, 碰撞后速度分别为v1', v2'。
则满足动量守恒定律:
m1 * v1 + m2 * v2 = m1 * v1' + m2 * v2'
碰撞类型和能量守恒定律
1)、完全弹性碰撞
动能没有损失, 则满足如下公式:
1/2 * m1 * v1^2 + 1/2 * m2 * v2^2 = 1/2 * m1 * v1'^2 + 1/2 * m2 * v2'^2
注: 前后物体的动能保持均衡, 没有其他能量的转化。
结合之前的动量守恒定律, 我们可以进一步得到:
v1' = [(m1-m2) * v1 + 2 * m2 * v2] / (m1 + m2)
v2' = [(m2-m1) * v2 + 2 * m1 * v1] / (m1 + m2)
2)、完全非弹性碰撞
则存在其他能量的转化, 动能不守恒。
且此时两物体粘连, 速度一致, 即v1'=v2', 此时动能损失最大。
3)、弹性碰撞
介于完全弹性碰撞和完全非弹性碰撞两者之间。 动能有损失的。
三、物理模型:
台球游戏中, 最核心的就是其物理模型的抽象及其碰撞算法的执行过程了。
鉴于是2D版的台球游戏, 因此我们对物理模型做下简化, 球运动的方向必然穿越球的中心。
把每个台球抽象为圆(x, y, radius), 而台球桌边框抽象为线段((x1, y1), (x2, y2))。
1、碰撞检测
1)、检测球与球碰撞
我们假定球A(x1, y1, r), 球B(x2, y2, r)。 则满足条件:
(x1 - x2) ^ 2 + (y1 - y2) ^ 2 <= (2*r) ^ 2
则发生碰撞, 否则没有发生碰撞
2)、检测球与球台边框碰撞
相对比较简单。 求球心到边框的垂直距离即可, 若小于等于则发生碰撞, 若大于则没有。
2、碰撞反应
1)、球与球的碰撞反应
动量是向量, 其在正交的两个方向上, 互相守恒。 我们选取两球圆心的直线为x轴, 垂直于圆心直线的为y轴。 如上图所述。
x轴上满足动量守恒:
m1 * Vx + m2 * Ux = m1 * Vx' + m2 * Ux';
并假定两球碰撞是完全弹性碰撞, 两球质量相等m1=m2, 依据基础物理知识篇的结论。
Vx' = [(m1-m2) * Vx + 2 * m2 * Ux] / (m1 + m2) = Ux;
Ux' = [(m2-m1) * Ux + 2 * m1 * Vx] / (m1 + m2) = Vx;
在X轴方向, 两球交换速度, 而在Y轴方向, 两球分速度不变。
Vy' = Vy;
Uy' = Uy;
最终碰撞后的速度公式为:
V' = Vx' + Vy' = Ux + Vy;
U' = Ux' + Uy' = Vx + Uy;
2)、球与边框的碰撞反应
把台球边框视为质量无穷大, 则简单把运动的球, 其在垂直边框的分方向反向即可。
如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h62484.shtml