C# 冲突代码为';尽管进行了多次检查,但仍无法正常工作
我正在XNA研究碰撞。出于某种原因,尽管我做了很多尝试,它还是不起作用。如果我碰它,它会工作的。但有时它会随机停止运行,就好像发生了碰撞一样。它的工作原理是有50个20px乘20px的正方形。如果你的方块以任何方式接触到另一个方块,那么游戏就结束了C# 冲突代码为';尽管进行了多次检查,但仍无法正常工作,c#,xna,collision,C#,Xna,Collision,我正在XNA研究碰撞。出于某种原因,尽管我做了很多尝试,它还是不起作用。如果我碰它,它会工作的。但有时它会随机停止运行,就好像发生了碰撞一样。它的工作原理是有50个20px乘20px的正方形。如果你的方块以任何方式接触到另一个方块,那么游戏就结束了 checkcollision() { for (int i = 0; i < 50; i++) { if ((loc.X + me.Width > enemyloc[i].X
checkcollision()
{
for (int i = 0; i < 50; i++)
{
if ((loc.X + me.Width > enemyloc[i].X) && (loc.Y + me.Height > enemyloc[i].Y) && (loc.Y < enemyloc[i].Y) && (loc.X < enemyloc[i].X)) { return true; }
if ((loc.X > enemyloc[i].X) && (enemyloc[i].X + enemy[i].Width > loc.X) && (loc.Y + me.Height > enemyloc[i].Y) && (loc.Y < enemyloc[i].Y)) { return true; }
if ((loc.X > enemyloc[i].X) && (loc.X < enemyloc[i].X + enemy[i].Width) && (loc.Y > enemyloc[i].Y) && (loc.Y < enemyloc[i].Y + enemy[i].Height)) { return true; }
if ((loc.X < enemyloc[i].X) && (loc.X + me.Width > enemyloc[i].X) && (loc.Y < enemyloc[i].Y) && (loc.Y < enemyloc[i].Y + enemy[i].Height)) { return true; }
}
return false;
}
checkcollision()
{
对于(int i=0;i<50;i++)
{
如果((loc.X+me.Width>enemyloc[i].X)&&(loc.Y+me.Height>enemyloc[i].Y)&(loc.Yenemyloc[i].X)&&(enemyloc[i].X+敌人[i].Width>loc.X)&&(loc.Y+me.Height>enemyloc[i].Y)&(loc.Yenemyloc[i].X)&&(loc.Xenemyloc[i].Y)&(loc.Yenemyloc[i].X)&(loc.Y
正如我在评论中所说,它太难阅读了。虽然我不打算声称这是问题所在(使用Mitch Wheat建议的调试器),但它肯定可以解决
首先,让我们勾勒出单个轴X的碰撞检测。与其先查找碰撞,不如先查找无碰撞。当“(玩家在敌人的左边)或(敌人在玩家的左边)”时,不会发生沿X轴的碰撞。(如果这两个都不是真的,那么“敌方玩家”必须是真的——如果需要,请使用图片。)
设p=玩家,e=敌人,则当(p.X+p.Wvar playerOopsed = enemies.Any(e => Collides(player, e));
我同意这个代码看起来有点太复杂了。我建议将您的敌人和玩家碰撞框存储为实例。矩形结构提供了一个名为的方法,该方法定义为:
public bool Contains(int x, int y);
如果矩形中存在在x和y处定义的点,则此方法将返回true。因此,使用此结构,代码将变得更加简单:
public bool checkcollision(Rectangle player)
{
for (int i = 0; i < enemy.Length; i++)
{
if (enemy[i].Contains(player.Left, player.Top)
|| enemy[i].Contains(player.Right, player.Top)
|| enemy[i].Contains(player.Left, player.Bottom)
|| enemy[i].Contains(player.Right, player.Bottom))
{
return true;
}
}
return false;
}
public bool checkcollision(矩形播放器)
{
for(int i=0;i<敌方长度;i++)
{
如果(敌人[i]。包含(player.Left,player.Top)
||敌人[i]。包含(player.Right,player.Top)
||敌人[i]。包含(player.Left,player.Bottom)
||敌人[i]。包含(player.Right,player.Bottom))
{
返回true;
}
}
返回false;
}
尝试使用调试器。谢谢。这实际上非常有帮助,欢迎使用。如果你有时间的话,请把我的答案记为正确好吗?谢谢你。谢谢你给我的答案打分。
public bool Contains(int x, int y);
public bool checkcollision(Rectangle player)
{
for (int i = 0; i < enemy.Length; i++)
{
if (enemy[i].Contains(player.Left, player.Top)
|| enemy[i].Contains(player.Right, player.Top)
|| enemy[i].Contains(player.Left, player.Bottom)
|| enemy[i].Contains(player.Right, player.Bottom))
{
return true;
}
}
return false;
}