为了学习GO语言做了一个简单的2D游戏。游戏中遇到了一些有趣的数学知识,在真实的在代码里体现它之前,还以为会永远用不到这些数学知识。

GitHub仓库: goTraining

2D游戏

对角移动

设置了游戏角色移动速度为5。在x轴与y轴上这没问题,但是如果要对角移动经过了合速度,实际移动速度就无法恒定。这时候就需要计算出缩放因子

根据勾股定理:

V = 5 Vd = squa(VxVx + VyVy)

缩放因子 Q = 5 / Vd

当每一帧移动发生的时候对 Dx 与 Dy进行缩放: Dx = Dx * Q,Dy = Dy * Q。即可保证对角移动速度恒定为V = 5。

同样可以用数形结合理解,利用三角形等比例缩放。 通过缩放x与y轴恒定一帧内第三边移动距离。

旋转

如果游戏角色旋转点不在游戏角色中心。而在周围某一点,比如游戏角色资源的左上角。想要实现角色原地旋转就需要一点小方法调整旋转点。

在一帧内 平移 → 旋转 → 再平移

第一次平移将旋转点移动到,原来的游戏角色中心点上。第二次平移将角色复位。

rotate

矩形是否重叠

要计算矩形是否重叠并不简单。要考虑所有的重叠情况。包括边重叠,一共有4种情况(不详细列举)。考虑它的反面要简单的多,也就是矩形不重叠。

1
2
3
4
//p2x < p3x || p1x > p4x || p1y < p4y || p2y > p3y
//取反
//德·摩根定律转换
//p2y > p3y && p1y < p4y && p2x > p3x && p1x < p4x

retan

LeetCode题目836.矩形重叠

3D游戏

咕咕