Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.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_2d_Collision Detection_Tile - Fatal编程技术网

C# 平台碰撞问题

C# 平台碰撞问题,c#,xna,2d,collision-detection,tile,C#,Xna,2d,Collision Detection,Tile,我正在制作一个平板,我有一个32x32的雪碧和32x32的瓷砖。 我还使用了一个平铺引擎,它通过数组生成地图。 我使用RectangleHelper.cs来修复与互动程序和播放器的碰撞,到目前为止,它可能与互动程序的顶部以及互动程序的左侧发生碰撞 在图片一中,我展示了“在顶部”的碰撞效果很好。没有错误或任何东西 在图2中,我展示了“左碰撞”,这也非常有效 但在图3中,您可以看到角色是浮动的。这是因为碰撞矩形以某种方式延伸了几个像素,这是问题之一,我似乎找不到任何答案 在图4中,我试图从拉伸的碰

我正在制作一个平板,我有一个32x32的雪碧和32x32的瓷砖。 我还使用了一个平铺引擎,它通过数组生成地图。 我使用
RectangleHelper.cs
来修复与互动程序和播放器的碰撞,到目前为止,它可能与互动程序的顶部以及互动程序的左侧发生碰撞

在图片一中,我展示了“在顶部”的碰撞效果很好。没有错误或任何东西

在图2中,我展示了“左碰撞”,这也非常有效

但在图3中,您可以看到角色是浮动的。这是因为碰撞矩形以某种方式延伸了几个像素,这是问题之一,我似乎找不到任何答案

在图4中,我试图从拉伸的碰撞矩形的右侧进行碰撞,结果我跳回墙中大约1-2帧,所以我无法在上面截图,但这也是问题之一

这是我的
RectangleHelper.cs
,它来自youtube上“OYOU9”关于瓷砖碰撞引擎的教程,对他来说,一切都很好

此外,如果我与块的底部碰撞,我的角色将消失

矩形帮助器.cs
它使用
RectangleHelper.cs
修复冲突。

我不确定冲突检查代码中的所有随机值都在做什么,因此我认为这可能会解决您的问题:

    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 &&
                r1.Left <= r2.Right);
    }

    public static bool TouchBottomOf(this Rectangle r1, Rectangle r2)
    {
        return (r1.Top <= r2.Bottom + (r2.Height / 2) &&
                r1.Top >= r2.Bottom - 1 &&
                r1.Right >= r2.Left  &&
                r1.Left <= r2.Right );
    }

    public static bool TouchLeftOf(this Rectangle r1, Rectangle r2)
    {
        return (r1.Right <= r2.Right &&
                r1.Right >= r2.Left &&
                r1.Top <= r2.Bottom &&
                r1.Bottom >= r2.Top);
    }

    public static bool TouchRightOf(this Rectangle r1, Rectangle r2)
    {
        return (r1.Left >= r2.Left &&
                r1.Left <= r2.Right &&
                r1.Top <= r2.Bottom &&
                r1.Bottom >= r2.Top);
    }
为此:

    if (rectangle.TouchLeftOf(newRectangle))
    {
        position.X = newRectangle.X - 1;
    }
嗯。这在很大程度上对我有效。希望这将消除一些主要的bug,但我只想指出,您将学习的最好方法是自己调试它。一种方法是按照图3中的方式设置所有内容,然后在
矩形.TouchTopOf()
条件中设置一个断点,查看是否返回
true
,如果是,为什么它返回
true
,而显然不应该返回。

公共静态bool TouchLeftOf(此矩形为r1,矩形为r2)
public static bool TouchLeftOf(this Rectangle r1, Rectangle r2)
{
    return (r1.Left <= r2.Right &&
            r1.Right >= r2.Right - 5 &&
            r1.Top <= r2.Bottom - (r2.Width / 4) &&
            r1.Bottom >= r2.Top + (r2.Width / 4));
}
{ 返回(r1.Left=r2.Right-5&& r1.Top=r2.Top+(r2.Width/4)); }
公共静态bool TouchRightOf(此矩形r1,矩形r2)
{
返回(r1.Right>=r2.Left&&

r1.Left避免在一个问题中复制所有代码,没有人会阅读它。哦,好吧,我只是认为几乎每个类都有彼此的连接,但是是的,我会删除一些。在这行代码中,在
TouchLeftOf
void,
return(r1.Right=r2.Left-5&&r1.Top=r2.Top+(r2.Width/4));
为什么在第二种情况下有
-5
?这会不会导致角色在到达平铺前停下来一点?还有加减法是什么(
+-(r2.Width/4)
)在第三和第四种情况下完成?我真的不确定,正如我所说的,我遵循了视频教程,他说我不必使用这些精确的数字,所以我尝试了不同的数字和组合,但实际上没有差异。这与视频中他为运动做的这件事有关系吗:velocity.X-=(float)gameTime.ElapsedGameTime.TotalMillistics/3;,但我使用我的位置变量进行移动,因为速度变量不起作用,只对重力/下降部分起作用:/我做了位置+=速度,但没有任何区别:/还有其他方法吗?有什么想法吗?谢谢!这不是这个地方,你需要调试它,然后将其缩小为一个没有大量代码的问题(或一个项目)。虽然如果我不忙的话,我明天可能会发布我的碰撞代码。你发现的代码似乎有点奇怪,有这么多未知和随机的值。另外,请确保你总是在运动计算中使用经过的时间。我尝试过使用它,但出于某些原因,我根本无法与任何东西碰撞,我的角色会变成随机的地图上的位置:7有人知道任何其他瓷砖碰撞的方法或东西吗?@UffePuffe,你真的应该自己编写一个碰撞代码。如果你这样做,你就会了解它是如何工作的,因此能够轻松地解决出现的任何问题。如果你让别人帮你做,或者只是使用一个你甚至不了解的教程第二,你永远也学不到如何自己编写代码。我也不认为这是一个让别人为你编写代码的地方。如果你有一个问题,你无法解决,也无法理解你的大部分代码是如何工作的(而且没有复制粘贴),我相信人们会非常乐意帮助。编写代码是一项工作!而且你的角色真的不可能去“地图上的任意地方”(除非你使用随机生成器)。角色会去那个地方,因为代码告诉他去那个地方。。。
    if (rectangle.TouchLeftOf(newRectangle))
    {
        position.X = newRectangle.X - rectangle.Width * 2;
    }
    if (rectangle.TouchLeftOf(newRectangle))
    {
        position.X = newRectangle.X - 1;
    }
public static bool TouchLeftOf(this Rectangle r1, Rectangle r2)
{
    return (r1.Left <= r2.Right &&
            r1.Right >= r2.Right - 5 &&
            r1.Top <= r2.Bottom - (r2.Width / 4) &&
            r1.Bottom >= r2.Top + (r2.Width / 4));
}
public static bool TouchRightOf(this Rectangle r1, Rectangle r2)
{
    return (r1.Right >= r2.Left &&
            r1.Left <= r2.Left - 5 &&
            r1.Top <= r2.Bottom - (r2.Width / 4) &&
            r1.Bottom >= r2.Top + (r2.Width / 4));
}