SFML中的正确冲突(C ++)

问题描述 投票:1回答:1

所以,我接受了一个测试,看看在SFML中碰撞是如何运作的。我已经制作了这段代码:

if (floor.getGlobalBounds().intersects(SuperMario.getGlobalBounds())) // Floor
    {
        SuperMario.setPosition(SuperMario.getPosition().x, floor.getPosition().y - SuperMario.getOrigin().y);
        IsTouching = true;
    }

正如代码所暗示的那样,马里奥在接触地板物体时将改变他的位置,并将传送到地板上方。

但是,这具有以下副作用,如下图所示。 2nd image

enter image description here

请注意,“绿色框”是我之前提到的楼层对象。另外,忽略图1中的“左”,我的意思是“正确”。

当然,这种行为是有意的(即不是错误),但它是不需要的。

所以我的问题是:我怎样才能消除这种“副作用”?我的意思是,我怎样才能修改我的代码,所以当马里奥接触到它的侧面(使平台工作像适当的平台)时,它不会在地板上传送?我希望马里奥能够被盒子拦住,而不是被传送出去。

更新:现在,我有这个:

for (unsigned int i = 0; i <= solidObjects.size() - 1; i++)
    {
        if (solidObjects[i].getGlobalBounds().intersects(SuperMario.getGlobalBounds()))
        {
            if (SuperMario.getPosition().x - solidObjects[i].getPosition().x  < SuperMario.getPosition().y - solidObjects[i].getPosition().y)
            {
                SuperMario.setPosition(solidObjects[i].getPosition().x - SuperMario.getOrigin().x, SuperMario.getPosition().y);
                IsTouching = false;
            }
            else if (SuperMario.getPosition().y - solidObjects[i].getPosition().y < SuperMario.getPosition().x - solidObjects[i].getPosition().x)
            {
                SuperMario.setPosition(SuperMario.getPosition().x, solidObjects[i].getPosition().y - SuperMario.getOrigin().y);
                IsTouching = true;
            }
            else if (SuperMario.getPosition().x - solidObjects[i].getTextureRect().width < SuperMario.getPosition().y - solidObjects[i].getPosition().y)
            {
                SuperMario.setPosition(solidObjects[i].getTextureRect().width + SuperMario.getOrigin().x, SuperMario.getPosition().y);
                IsTouching = false;
            }
        }
        else
        {
            IsTouching = false;
        }
    }

但是,有一个问题。当马里奥接触到地板的两侧时,他坚持使用它们意味着他无法向右移动。

如果我不够清楚,请说明我应该添加或澄清更多内容。

c++ collision sfml
1个回答
2
投票

这感觉真的很奇怪,因为你通常会定义固体区域而不是玩家可以走进去的区域。你会希望你的玩家跳起来,而不是让它们粘在地上。

其余的非常简单:

  • 迭代所有实体对象并确定播放器和实心矩形是否重叠。
  • 如果是,请确定哪个距离较小(x或y)。这使您可以确定移动播放器的轴。
  • 确定玩家离开固体区域的方向更快,即推动玩家的方向。
  • 按计算方向推动播放器并重复检查。

根据您的地图复杂性,这可能会变得相当复杂,因此您很可能需要一些排序/空间化来减少比较次数(例如,跳过检查不可能/远处的形状)。

© www.soinside.com 2019 - 2024. All rights reserved.