你实际上需要的应该是: 真·3D场景 + 2D渲染. 你自己做出的"伪Z轴"实际上仍然需要实现"真实Z轴"的所有计算.
渲染怎么做呢? 首先把摄像机的透视关掉. 然后, 对每个物体设置"遮罩区域", 通过判断角色处于区域的内部还是外部, 决定某个图片是否遮挡角色图片.
一般横版格斗射击游戏中障碍物的遮罩区域很简单, 就是按物体的y轴分为前后两个部分, 角色如果处于后面的部分则被障碍物遮挡. 你给的参考图片要复杂一些, 右边那个平台的遮罩区域大概是这样的(摄像机在左上, 往右下观察):
角色处于橙色线所示的部分就会被平台的图片遮住, 否则不会被遮住.
其它的所有逻辑, 比如在平台上边下边作y轴方向的行走, 还有跳跃等, 和普通的3D一样处理. 不过相对于全方向的3D来说, 你只需要处理立方体碰撞盒或由若干立方体组合而成的碰撞盒, 角色也只能沿着若干个定轴进行移动, 这方面相对于3D游戏会变简单.
补充:
有些引擎没有z轴的话... 如何在不使用内置Z轴的情况下实现一个"伪Z轴"?
首先, 我们把引擎提供的 (x, y) 坐标叫做平面坐标, 你需要额外存储物体的 z 坐标. 然后, 对于各种可以跳上跳下的"平台", 它至少是一个平面: ([x1, x2], [y1, y2], z'). 之后各种交互的判定如下:
- 判断角色往上跳时被平台挡住: (x, y) 在 ([x1, x2], [y1, y2]) 范围内, 角色的 z < 平台的 z'.
- 判断角色可以站在平台上: (x, y) 在 ([x1, x2], [y1, y2]) 范围内, 角色的 z >= 平台的 z'.
- 判断角色被平台从侧面挡住(以及例子中抓住边缘跳跃的动作): (x, y) 在 ([x1, x2], [y1, y2]) 范围内, 但是 z 和 z' 很接近, 或者如果有角色高度参数 h, 可以判断 z' 是否在 [z, z + h] 内.
- 对于遮挡关系的判定更麻烦, 但是处理方法类似.
呃, 实际上就是自己实现一个简陋的3D引擎及碰撞检测. 不是万不得已不要这么做.
明天的明天 1年前
DragoonKiller [作者] 1年前
发布