热血格斗传说场景结构猜想

先看看热血格斗传说的第一个场景图片

1-300x106

可以看到该场景有相对比较复杂的元素,比如斜坡,几个可跳跃高台,那热血格斗传说是如何实现国夫能够跳上高台,跑上斜坡的呢?

首先需要进行拆解的是国夫的坐标系有多少个轴,因为国夫可以横着走,竖着走,还可以垂直上跳,所以国夫必然是存在三个轴的,只不过最终投影在屏幕上的是两个轴而已,这与三维的mvp变换类似,只不过对于这种简易的横版动作游戏不需要复杂的mvp矩阵,两个公式即可。

Xs = Xw

Ys = aYw + bZw

即在Y屏幕的贡献是包含了Z轴与Y轴逻辑坐标的。在对游戏进行斜走的尝试后,发现游戏斜走是趋向于45度的,即X轴显示上的移动速度是与Y轴显示上的移动速度一致的,a应为1。

所以如果要做到国夫能站在高台上,那国夫当前在该位置的Z坐标一定是比不在高台上大的,而不是Y坐标变大了,否则会与竖向位移产生冲突。

那么该场景的数据结构就比较好拆分了,首先我先尝试对场景进行网格化,网格化能够简化游戏计算,我猜想对于一个90年代的游戏应该都会采用该技术,在对所有我认为特殊区块的位置进行对齐之后,我得到了一个大致的网格大小为8×8,然后在大致对区块进行划分,如下图

2-300x107

得到这样的区块后我进行了一下确认,比如C块最底下的位置与显示不完全对齐,于是我去游戏中进行验证,看国夫是否也是无法走到该位置,得到如下图(国夫跳跃能力在5个格子左右到达最高点)

3

可见,该游戏的边界应该是以网格为基本单位做对齐的,那么我们做进一步的假设,假设b为1,即逻辑z轴对屏幕y轴的贡献与逻辑y轴是一致的,那国夫在区块C的z值应该为3(单位为网格),B为6,D为6,右边两个高台就没有一一编号了。

游戏中如何判断国夫需要跳上高台,而不是走过去呢?当国夫到达地板边界向C区块的格子进去的时候,判断下一个点属于C区块格子,则获取C区块格子类型及属性,得到C区块格子的Z值大于当前Z值,则不可往左移动。至于如何判断落在高台上,只要计算z位置的时候判断当前z位置大于等于当前区块z位置即可不再下落。

那么问题到了A斜坡了,A斜坡的数据结构如何表示,通过游戏得知,国夫在A斜坡的移动是连续的,比如格子为单位,也就是说,很明显A区块内的格子并不是每个格子设置一个Z值,否则得到的效果就会咔吱咔吱的跳。

那么如何表示这个结构呢,因为是斜坡,我们很容易想到的就是斜率,即在中学数学里的直线方程中的斜率 z = kx,通过观察图形,另外加上我们假设的(假设b为1,即逻辑z轴对屏幕y轴的贡献与逻辑y轴是一致的)。则可以得到k为1/2。

那我们在每帧逻辑中是如何计算的呢,我大概猜想了下,如果国夫位于A区块内,则vz = k*vx,也就是说,一旦vx有值,则vz有值,则z会随着时间流逝逐渐上升,同样推导反相也是成立的。

则对于区块A,只需记录值k为1/2即可。

4-300x122

5-300x110

6-300x107

7-300x115

仔细观察了下游戏中几个有斜坡的场景,则会发现,斜坡斜率为1/2,1,2这几个值,主要是因为方便计算罢了。

继续整理剩余的几个场景区块类型

8-300x145

9-300x144

10-300x144

场景一共有8个,新的场景区块类型为

·定时炸弹(普通击飞,沿着之前移动方向)

·传送(以一定攻击状态传送到指定区域)

·电网(电属性击飞,可传递)

·钉刺(某个朝向的击飞)

·履带(增加定向速度略小于移动速度)

·冰面(增大滑行距离,普通移动除外,对于斜坡会有自动下降的速度)

最为复杂的为最后一个场景,首先改传送区块的传送区域是多个,而且是顺序传送,即传送到A区域,下次传送到B区域依次排列,另外钉刺为动画,且区块属性是动态变化的。

场景数据结构猜想就暂时到这里,下一个部分研究热血格斗传说的动画状态,该游戏虽然画面简单,但是动画状态极为复杂,接近于街头争霸等复杂的格斗游戏动画状态机。

updatedupdated2021-01-202021-01-20