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

SFML(C++)中的正确碰撞

罗昕
2023-03-14

因此,我进行了一个测试,看看碰撞是如何在SFML中操作的。我制作了以下代码片段:

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

正如代码所提示的,马里奥在接触地板物体时会改变位置,并且会瞬移到地板上方。

注意,“绿框”是我前面提到的地板对象。还有,忽略图片1中的“左”字,我指的是“右”。

当然,这种行为是有意的(即不是bug),但它是不想要的。

所以我的问题是:我怎样才能消除这种“副作用”呢?我的意思是,我怎样才能修改我的代码,这样马里奥就不会在地板上方瞬移,当他接触地板的侧面时(使平台形成像一个适当的平台形成一样工作)?我想让马里奥被盒子拦住,而不是被传送。

更新:那么现在,我有以下内容:

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

但是,有一个问题。当马里奥碰到地板的两侧时,他会粘在上面,这意味着他不能右移。

如果我不够清楚,请具体说明我应该补充或更多澄清什么。

共有1个答案

甄霖
2023-03-14

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

剩下的就很简单了:

  • 遍历所有实体对象并确定播放机与实体矩形是否重叠。
  • 如果有,则确定哪个距离较小(x或y)。这使您可以确定移动播放机的轴。
  • 确定玩家离开实体区域的哪个方向更快,即向哪个方向推玩家。
  • 按计算的方向推动播放机,然后重复检查。
 类似资料:
  • 我的2D平台游戏有问题。由于我刚刚开始使用c,因此我在瓷砖碰撞方面遇到了麻烦。我能够阻止玩家进入图块,并且能够远离它,但不知何故,他不能沿着图块移动。 此功能用于检查新位置是否位于实心瓷砖内: 空地图::drawColMap(播放器 } 以下是移动播放器的代码: void Player::update() { } 感谢任何帮助! //编辑1 我试着记录碰撞,它显示即使我不按任何键,玩家仍然在碰撞区

  • 这是我的碰撞/移动代码 这是PixelPerfectTest函数(不是我的) 编辑:这就是我如何让它工作,以防将来有人需要帮助

  • 我用C语言用SFML库创建了一个游戏,在实现过程中出现了贴图冲突(我从txt文件中加载贴图- 1代表平台,0代表自由空间)。https://imgur.com/a/tQZc6 我在同时处理所有四种类型的碰撞时遇到了一个问题(从下、上、左和右)。我的意思是:当没有碰撞时,玩家可以正常移动,但是如果我们撞到墙上,碰撞只出现在FIRST中写的if()语句中(在我们的示例中只发生右碰撞,其余部分被省略)。

  • 我目前正在业余时间用C语言和SFML 1.6编写游戏。当需要进行碰撞检测时,我遇到了一个恼人的错误,程序检测碰撞时,好像物体被移到了左上角,根据我用来测试的静止精灵的大小,移动量不同,通常是其大小的一半左右。我似乎找不到我的代码中有什么bug,但也许你能找到。我的代码列在下面,提前感谢。

  • 这是我第一次尝试SFML和游戏开发,我遇到了碰撞和重力的问题。 我正在使用平铺地图系统制作2D平台游戏。 碰撞似乎在工作(轻微),但非常波涛汹涌,我似乎无法让重力正常工作。我尝试了一些不同的教程,但我什么都做不了,我现在有点不知所措。 如果有人能指出我在这里错过了什么,我将不胜感激!! 以下是我为这些元素使用的代码: 在PlayerSprite类(尝试重力) Game.cpp中的碰撞检测

  • 问题内容: 我正在开发一种游戏,其中用户必须击打高速球。为了击球,我使用旋转关节将一个矩形物体与演员连接在一起,并使它的马达以指定速度(马达速度)旋转。现在一切都非常完美,但是当球的速度很高时,它绕过了矩形车身。使用碰撞列表器,我发现发生了碰撞,但是碰撞后球没有被反射。因为只有在球高速运转时才会发生这种情况,所以要碰撞的物体的密度是bcoz。还是它的旋转关节马达?我在这里想念什么吗? 这是两个主体