当前位置: 首页 > 知识库问答 >
问题:

平台瓷砖碰撞问题

龚星洲
2023-03-14

我正在开发一个平台,我有一个32x32的精灵和32x32的磁贴。我还使用了一个图块引擎,它在数组的帮助下生成地图。我使用一个< code>RectangleHelper.cs来修复与瓷砖和播放器的碰撞,到目前为止,它可以与瓷砖的顶部碰撞,也可以与瓷砖的左侧碰撞。

在第一张图中,我展示了“在顶部”碰撞工作正常。没有错误什么的。

在图2中,我展示了“碰撞左侧”,这也很棒。

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

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

这是我的< code>RectangleHelper.cs,它来自youtube上的“oyyou9”的瓷砖碰撞引擎教程,对他来说,一切都很好。

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

public static class RectangleHelper
{

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

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

    public static bool TouchLeftOf(this Rectangle r1, Rectangle r2)
    {
        return (r1.Right <= r2.Right &&
                r1.Right >= r2.Left  - 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.Left >= r2.Left &&
                r1.Left <= r2.Right &&
                r1.Top <= r2.Bottom - (r2.Width / 4) &&
                r1.Bottom >= r2.Top + (r2.Width / 4));
    }
}

正如你在这里看到的,有很多随机值,在视频中,他并没有真正说出它们的优点,只是说我可能不得不调整它以适应我的游戏。

以及我的玩家类中的碰撞方法:

public void Collision(Rectangle newRectangle, int xOffset, int yOffset)
    {
        if (rectangle.TouchTopOf(newRectangle))
        {
            rectangle.Y = newRectangle.Y - rectangle.Height;
            velocity.Y = 0f;
            hasJumped = false;
        }
        if (rectangle.TouchLeftOf(newRectangle))
        {
            position.X = newRectangle.X - rectangle.Width * 2;
        }
        if (rectangle.TouchRightOf(newRectangle))
        {
            position.X = newRectangle.X + newRectangle.Width +1;
        }
        if (rectangle.TouchBottomOf(newRectangle))
        {
            velocity.Y = 1f;
        }
    }

它使用RectangleHelper.cs来修复冲突。

共有3个答案

伯晨
2023-03-14
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));
}
微生啸
2023-03-14
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));
}
韩耘豪
2023-03-14

我不确定所有这些随机值在您的碰撞检查代码中做了什么,所以我认为这可能会解决您的问题:

    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 - rectangle.Width * 2;
    }

为此:

    if (rectangle.TouchLeftOf(newRectangle))
    {
        position.X = newRectangle.X - 1;
    }

HTH。它在很大程度上对我有用。希望这将消除您的一些主要错误,但我只想指出,您将学习的最好方法是自己调试它。您可以开始的一种方法是按照图3中的方式设置所有内容,然后在您的rectangle.TouchTopOf()条件中放置一个断点,看看它是否返回true,如果是,为什么它返回true,而显然它不应该。

 类似资料:
  • 我有一个球,我可以在由大小相等的瓷砖组成的地图上移动。玩家应该不能在较暗且有黑色边框的瓷砖上行走。我有一个多维的瓷砖阵列,我用它来检查哪些瓷砖是实心的。 我希望玩家在水平和垂直移动时,可以靠墙滑动。问题是,如果他那样做,他就会固执己见。我设法使它在每个轴上都能完美工作,但是分开的。下面是我的水平碰撞检查代码: level.isBlocked() 方法检查数组的索引是否被实心磁贴占用。i 和 j 变

  • 我在我的瓷砖碰撞方法中遇到了一个问题。由于某种原因,玩家可以在不应该通过的时候通过一些瓷砖。此外,我不完全确定为什么,但当它卡住时,它可以通过对象向左移动,但只能向左移动。我在下面发布了一些代码,如果有人能给我指出正确的方向就好了。(或者如果有人能找到一个快速的解决方案就更好了!)我的玩家移动方法和瓷砖碰撞方法都在更新方法中调用。

  • 我已经尝试了好几天,花了几个小时在网上搜索,但无济于事。我在碰撞时遇到问题,我可以检测到碰撞,但我的问题是阻止玩家进入图块。我已经尝试了所有我能想到的。我正在检测我的瓷砖贴图的冲突,使用1表示实体,0表示被动 这工作正常,我的文本播放器变成红色,一旦与瓷砖碰撞,但我不知道如何防止玩家进入那个瓷砖开始,我目前的设置我试图禁用移动,但所有发生的是玩家进入碰撞设置为true和控件禁用,导致玩家完全卡住。

  • 我的2D平台游戏有问题。由于我刚刚开始使用c,因此我在瓷砖碰撞方面遇到了麻烦。我能够阻止玩家进入图块,并且能够远离它,但不知何故,他不能沿着图块移动。 此功能用于检查新位置是否位于实心瓷砖内: 空地图::drawColMap(播放器 } 以下是移动播放器的代码: void Player::update() { } 感谢任何帮助! //编辑1 我试着记录碰撞,它显示即使我不按任何键,玩家仍然在碰撞区

  • 我试图使用Struts 2 我在 glassfish 服务器上上传时遇到以下错误: 部署过程中发生错误:加载应用程序时出现异常:java.lang.IllegalState异常:ContainerBase.add子级:开始:org.apache.catalina.生命周期异常:java.lang.NoClassDefFoundError: org/spingframewor /core/io/su

  • 我正在开发一款平台游戏,我想做一些基本的平台碰撞,遗憾的是我还是做不到。玩家的移动是这样计算的: 所有变量都是具有< code>x和< code>y值的向量。这和预期的一样,问题是有冲突。我的规则是: 当降落在平台上时停止坠落。 从平台运行时开始下降。 在跳跃过程中击中平台时停止向上移动。 撞墙时停止向一侧移动,但能够向相反方向移动。 检查底部是否与平台碰撞非常简单,但棘手的部分是检测哪一侧与平台