2010-01-14 106 views
1

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

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

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

谢谢!

回答

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

  2. 您的游戏应该组织起来,以保持游戏对象的交互性,并将游戏的渲染完全分离到屏幕上。您可以将程序的这两部分看作“模型”和“视图”。在模型中,你有一个完整的三维世界,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点透视,对前景使用正字法。

+0

很好的答案布列塔尼。我现在全部解决了。谢谢您的帮助! – 2010-01-15 21:40:19

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轴,以便物体对角线位移而不是垂直移动。

+0

增加了进一步的说明。 – slebetman 2010-01-14 23:35:12

+0

谢谢slebetman,我肯定会把图画和碰撞模拟搞混。 – 2010-01-15 21:37:38