在我制作AirScape游戏中重力机制过程中,有很多有意思的东西和大家分享。所以我决定写一个关于如何实现的教程,同时也说明这个是很容易的。
首先,我必须是这是Yann Granjon想出来的方法,不是我的想法,我只是将其实现了。他在这个游戏过程中帮助了我很多,如果没有他的话,这个是无法完成的。
基础知识
实现这个最重要的是能够改变"Platform"行为的重力角度,然后我们就可以集中精力去考虑如何确定在任意一点这个角度是多少?
因此Yann建议,我实现了重力区域。
(图片有些模糊,可能是在上传过程中丢失了一些质量)
在此,你可以看到level 1-1大致样子,我们主要关心陆地周围的彩色区域。
这些形状都是同一个对象类型'gravzone'.大约有5中形状,都是为了不同的目的的。
这些形状可以分为两种,"Relative", and "Non-Relative." 可以用一个布尔值来表示。
The code
代码非常简单,以下是一些基本的代码:
基本上,对于任何重力区域都是有一个角度,这个角度是由该区域的relative属性来决定的。
一般来说,环形的重力区域是relative,而线性的是non-relative的。区别在于签字总是指向一个特定的点,这样可以支持环形的表面,后者只是一个固定的角度(这个角度一般是由重力区域自身决定的)。
因此,重新回到代码。对于玩家进入的每个重力区域,计算一个正确的角度 (对于non-relative就是 gravzone.a,对于relative的区域,则是angle(player.x,player.y,gravzone.x,gravzone.y) ) ,我们可用两个向量来表示这个角度。这样做的目的是因为后一个向量可以ADDED到上次的计算结果,也就是说可以计算出玩家所相关重力区域的平均角度。
也就是,我可以重叠两个或多个重力区域,最终的结果就是指向一个这些角度的平均数值。
180翻转
[译者注:这一段不太明白,只是大致意思]
当翻转180度的时候,会有一个问题。基本上,平均角度计算会有问题,导致失去控制玩家的方向。因此,我引入一个不可见的对象,flip_assist。
这个也包含了一些传统的重力编程,当玩家被flip_assist包含的时候。
这个代码基本上是对于被 flip-assist手动设置重力角度切换到标准的重力角度,然后当玩家不再重叠的时候切换回正常。
其实对于每个黄色条状区域有2个flip_assists ,因此玩家可以来回翻转。布尔值'cannot_reset_flip' 这个是必要的,这样游戏就不会混乱了。
我们有一些这个游戏最基础的机制。
这有一些关卡,以获取一些更好的想法:
希望你能喜欢这个教程,如果我忘记写什么也请务必告诉我。