在给定纹理位置和相机位置的情况下,我一直无法实现一种算法来移动纹理。图像中的前两张图片解释了我要完成的工作,但我不知道如何相应地移动它们。曾几何时,我创建了一个程序来执行此操作,但我已经失去了它。有任何想法吗?
如果有帮助,相机/视口的宽度和高度与纹理的宽度和高度相同。目标是让他们移动位置,给人一种无限平面的错觉。(无需绘制无限平面,哈哈。)
你不需要移动你的区域,足以决定在哪里绘制它们。假设您有一个包含 N*M 块的地形(在这种情况下 N=M=2),它们中的每一个都是 A*A 的大小(在这种情况下,屏幕具有相同的大小,但这没关系),并且瓷砖不断地相互跟随。
int LeftColumn = Camera.X / A; // let it round to nearest lower int
int TopRow = Camera.Y / A;
LeftColumn = LeftColumn % N; // Calculate the first tile
TopRow = TopRow % M;
for (int i = LeftColumn+N; i < LeftColumn+2*N; i++)
for (int l = TopRow+M; l < TopRow+2*M; l++)
// you may check here if the tile is visible or not based on the screen size
{
Tile[i % N, l % M].Draw(i*A, l*A); // Or do whatever you like
}
这清楚吗?
经过几个小时的反复试验,我终于想出了如何让区域/纹理/矩形相应地移动。对于那些想要解决方案的人,
if ((int)Math.Abs(region.X - camPos.X) > region.Width * 2)
{
region.X += region.Width * 2;
}
if (camPos.X < region.X - region.Width)
{
region.X -= region.Width * 2;
}
if ((int)Math.Abs(region.Y - camPos.Y) > region.Height * 2)
{
region.Y += region.Height * 2;
}
if (camPos.Y < region.Y - region.Height)
{
region.Y -= region.Height * 2;
}
其中 camPos 是相机位置,而 region 是区域/纹理/矩形/其他。
此代码适用于 4 个正方形区域(2 个区域乘 2 个区域)。要更改更多区域,只需将 9 平方区域和 16 平方区域的所有 *2 分别更改为 *3 或 *4。