Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 冲突代码为';尽管进行了多次检查,但仍无法正常工作_C#_Xna_Collision - Fatal编程技术网

C# 冲突代码为';尽管进行了多次检查,但仍无法正常工作

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

我正在XNA研究碰撞。出于某种原因,尽管我做了很多尝试,它还是不起作用。如果我碰它,它会工作的。但有时它会随机停止运行,就好像发生了碰撞一样。它的工作原理是有50个20px乘20px的正方形。如果你的方块以任何方式接触到另一个方块,那么游戏就结束了

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.W 因此,我们可以编写碰撞方法:

或者,对于LINQ:

var 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;
}