在2D侧卷轴中实现z轴

时间:2010-01-14 23:22:39

标签: 2d collision-detection isometric

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

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

如果有人知道这个话题,我会很感激资源的链接。

谢谢!

2 个答案:

答案 0 :(得分:4)

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

  2. 您的游戏应该被组织起来以保持游戏对象的互动,并且游戏的渲染完全独立于屏幕。您可以将程序的这两个部分视为“模型”和“视图”。在模型中,您拥有一个完整的3D世界,有3个轴。如果没有一定程度的痛苦,你不能在这一点上进行一半。您的模型必须是正确的3D。

  3. 视图将读取所有游戏对象的位置,并使用相机定义将它们投影到屏幕上。对于此部分,您不需要完整的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点透视,对前景使用正交投影。

答案 1 :(得分: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轴,以便对象以对角方式而不是垂直方向移位。