伪3D墙(自上而下的光线投射,有点像)

时间:2016-01-12 11:05:20

标签: c 2d parallax allegro

看,我不会发布代码因为我需要逻辑,数学,算法。良好:

我正在尝试使用图层和视差滚动来实现自上而下的瓷砖地图的3D外观。问题是:目前我只是为每一层设置不同的“速度”。但这只适用于一些非常特殊的相机位置,它也使得这些块实际上具有无限高度(因为它们将“增加高度”,直到它们离开相机的FOV)。

是否有更好的(应该)达到效果?哦,我正在使用 C Allegro 5

我考虑过限制每一层的偏移,但我不知道如何。

我目前的方法:

这是我目前的代码“速度”(它重复上,下,左,右,更改坐标):

if (key[ALLEGRO_KEY_UP])
    camera_y[0] -= 1;
    camera_y[1] -= 2;
    camera_y[2] -= 3;

然后我运行一个循环来绘制相对于当前图层偏移量的图块的地图。

顺便说一下,这是期望的效果(3层的例子):

Effect

2 个答案:

答案 0 :(得分:4)

对于视差滚动,滚动得更快的图层必须相应更大:

Scaled

您可以使用堆叠在彼此顶部的未缩放的瓷砖,偏移从瓷砖中心到视口中心的距离的固定部分,

Unscaled

但顶部不会连续(除非底部重叠)。如果所有图层图块都是手绘或渲染图像,则这不是问题。

如果墙壁是盒形的,并且你有顶部和四边的图像,你可以用几乎3D的方式绘制它们,

Walled

每个箱壁的最多两侧都是歪斜的。

在所有情况下:

如果视口的中心位于世界坐标(x c ,y c ),则点(x,y,z)将映射到坐标(x', y')相对于视口的中心:

x'=(x - x c )×(z + z 0 )/ z 0

y'=(y - y c )×(z + z 0 )/ z 0

其中z 0 是一个常数,用于确定视差或深度效果的“大小”。

答案 1 :(得分:1)

我认为你是在正确的路线上,但只需给相机一个“海拔”属性就可以解决“无限高度”问题,并通过计算......来调整每一层的“速度”。 p>

layer.speed =(layer.altitude / camera.altitude)* ZOOM_FACTOR; //给出一个浮点值。

在向我们展示一些数学代码之前,无法提出更多建议。