在XNA中测试所有非碰撞贴图
本文关键字:碰撞 XNA 测试 | 更新日期: 2023-09-27 18:01:30
我正在用XNA编写一款平台游戏。我目前的碰撞测试是通过运行foreach循环,用每个贴图的边界框测试玩家的边界框。然而,我不知道如何测试玩家是否没有接触任何方块。
我该如何运行我的数组并测试玩家是否没有碰到任何砖块,以便我可以检查他是否在半空中?任何帮助或建议将不胜感激。提前感谢!
/////////////////////////////////////
我的碰撞码是
if (personRectangle.TouchTopOf(newRectangle))
{
onGround = true;
test = false;
test2 = true;
}
对应的bool测试为
public static bool TouchTopOf(this Rectangle r1, Rectangle r2)
{
return (r1.Bottom >= r2.Top - 1 &&
r1.Bottom <= r2.Top + (r2.Height / 2) &&
r1.Right >= r2.Left + (r2.Width / 5) &&
r1.Left <= r2.Right - (r2.Width / 5));
}
这段代码在Game1.cs更新中测试碰撞。
foreach (CollisionTiles tile in map.CollisionTiles)
player.Collision(tile.Rectangle);
是地图类
中的贴图列表 private List<CollisionTiles> collisionTiles = new List<CollisionTiles>();
XNA矩形有内置的intersects方法:
if (rect1.Intersects(rect2)){
...
}
只是循环遍历矩形瓦片并调用每个矩形的交点。为了提高效率,你应该将玩家坐标映射到世界坐标上,并确定离玩家最近的贴图,这样你就可以缩小需要循环的贴图数量。
编辑:为了澄清,你可以写:
bool collision=false;
foreach (CollisionTiles tile in map.CollisionTiles) {
if(personRectangle.Intersects(tile.Rectangle)) {
collision =true;
break;
}
}
如果collision为真,那么你就知道某处发生了碰撞
除非你有理由不这样做,否则尽量保持简单。记录下你撞了多少东西。如果你的计数最终是0,那么你没有碰撞任何东西。
无需担心修改/优化您拥有的任何代码,它可以是这样的:
int touchedCount = 0;
foreach (CollisionTiles tile in map.CollisionTiles)
{
if (player.Collision(tile.Rectangle))
{
touchedCount++;
}
}
if (touchedCount == 0)
{
//You did not collide with anything
}
然后在你的碰撞方法中做一些类似的事情来跟踪你的检查,如果你碰撞了。这可能是最简单的使用矩形。与另一个答案相交