这里有相当一大段代码,但它相对简单。
这些都是来自不同类的片段,所有引用都正确,但我认为我在某处犯了基于数学的错误,而我找不到它。它总是在 y 轴上比应该早一个像素发现碰撞。我还没有尝试在不同的 X 轴位置上使用它,但它似乎可以很好地通过旁边的块坠落。
结构体 "mapSection" 只包含两个向量2-一个左上角块和底部左块坐标。
tileManager.def_ts 是默认的瓷砖宽度和高度(32)。玩家的大小为 32x64。
toWorldSpace 函数现在什么也没做,只是返回,所以那不是问题所在。
当我说块坐标时,我的意思是块在瓦片数组中的索引(例如,0,0 是第一个块,0,1 是 Y 轴上的第二个块,1,3 是 X 轴上的1块和Y轴上的3块,我并不是指实际像素。)
从 tile engine 类:
public mapSection toMapMinMax(Vector2 position, Vector2 size)
{
position = toWorldSpace(position);
position.X = (float)Math.Floor(position.X / tileManager.def_ts);
position.Y = (float)Math.Floor(position.Y / tileManager.def_ts);
size.X = (float)Math.Floor(size.X / tileManager.def_ts);
size.Y = (float)Math.Floor(size.Y / tileManager.def_ts);
return new mapSection(position, position + size);
}
public bool collision(Vector2 screenPosition, Vector2 size)
{
mapSection mapCollisionPossibilities = toMapMinMax(screenPosition, size);
for (int y = (int)mapCollisionPossibilities.topLeft.Y; y <= mapCollisionPossibilities.bottomRight.Y; y++)
{
for (int x = (int)mapCollisionPossibilities.topLeft.X; x <= mapCollisionPossibilities.bottomRight.X; x++)
{
if (x >= 0 && y >= 0 && y < tiles.Count && x < tiles[y].Count)
{
if (tileManager.tileTypes[tiles[y][x]].collideable == true)
{
return true;
}
}
}
}
return false;
}
这是来自播放器类的代码:
if (!tEngine.collision(position + new Vector2(0, 1), new Vector2(32, 64)))
{
position.Y += 1;
}
我添加了“Vector2(0,1)”,因为我想看看是否存在更远处一像素的碰撞;以便他一直下落,直到撞到物体。目前非常基本,但仅用于测试尚未工作的碰撞引擎。
这是一个错误的图片。你可以看到玩家高度多了一个像素。
在图片中,“X:”是X轴上的左上方块坐标,“X2:”是X轴上的右下方块坐标,与“Y:”和“Y2:”相同,除了Y轴。它们是直接从mapSection中读取的。
如果有人能够注意到为什么会发生这种情况,将不胜感激。
谢谢。
如果您无法理解代码的任何部分,请在评论中发布,我很乐意解释,或者如果您认为本文某些地方有点不太明确。