1

我正在制作一个类似于 Castle Crashers 的侧滚轴,现在我正在使用 SAT 进行碰撞检测。这很好用,但我想通过允许对象在屏幕上上下移动来模拟关卡“深度”,基本上沿着 z 轴(如这个截图http://favoniangamers.files.wordpress.com/2009/07 /castle-crashers-ps3.jpg )。这不是等距游戏,而是使用视差滚动。

我将 az 组件添加到我的矢量类中,并且我计划根据形状的“厚度”和它的 z 位置来剔除碰撞。我只是不确定如何计算渲染形状的位置或如何添加重力跳跃。随着 z 位置的变化,如何计算最大 y 值(对于地面)?基本上是 z 轴和 y 轴的关系让我感到困惑。

如果有人知道此主题,我将不胜感激资源链接。

谢谢!

4

2 回答 2

4
  1. 实际上可以使您的碰撞检测算法在尺寸上不可知。只需有一个沿一个维度工作的碰撞检测器,用它来检查每个维度,您对“这些是否发生碰撞”的回答是沿每个维度的碰撞检测的逻辑与。

  2. 你的游戏应该被组织起来,以保持游戏对象的交互和游戏在屏幕上的渲染完全分开。您可以将程序的这两部分视为“模型”和“视图”。在模型中,您有一个完整的 3D 世界,有 3 个轴。在这一点上,如果没有某种程度的痛苦,你就不能半途而废。您的模型必须是正确的 3D。

视图将读取所有游戏对象的位置,并使用相机定义将它们投影到屏幕上。对于这部分,您不需要完整的 3D 渲染引擎。您所说的透视的正确技术术语是“倾斜”,它可以在许多古代中国和日本的卷轴绘画和版画中看到 - 特别是寻找“源氏物语”的图像。

一个物体(包括地面!)在屏幕上的位置是这样的:

DEPTH_RATIO=0.5;
view_x=model_x-model_z*DEPTH_RATIO-camera_x;
view_y=model_y+model_z*DEPTH_RATIO-camera_y;

您可以修改为直线正投影:

DEPTH_RATIO=0.5;
view_x=model_x-camera_x;
view_y=model_y+model_z*DEPTH_RATIO-camera_y;

当然不要忘记剔除相机定义的体积之外的对象。

您还可以使用此机制为您处理视差层的定位。这当然是将您的相机更改为 1 点透视投影而不是正交投影的问题。您不必使用它来更改精灵的渲染大小,但它会帮助您真实地管理对象的 x 位置。如果你准备好迎接挑战,你甚至可以混合投影——使用 1 点透视作为深背景,使用正交投影作为前景。

于 2010-01-14T23:48:28.797 回答
1

您应该将物理计算(碰撞检测等)使用的概念 Y 轴与实际在屏幕上绘制的 Y 轴分开。这样它就变得不那么混乱了。

假设 Y 轴和 Z 轴之间没有关系,只需按照法线进行计算,然后当您在屏幕上实际绘制对象时,您可以使用 Y 轴模拟 Z 轴:

screen_Y = Y + Z/some_fudge_factor;

实际上,这就是真正的 3d 引擎的工作方式。在完成所有世界计算之后,X、Y 和 Z 坐标通过一个函数映射到 screen_X 和 screen_Y(通常比上面的等式复杂一点,但只是一点点)。

例如,要在您的游戏中实现伪等距视图,您甚至可以将 Z 应用于 screen_X 轴,以便对象沿对角线而不是垂直方向移动。

于 2010-01-14T23:31:06.243 回答