SFML中的冲突不是很好,如何改进? 我最近一直在使用C++和SFML最新版本进行简单的游戏,但是我遇到了一个问题,就是碰撞检测不是很好,比如玩家即使敌人没有碰他,但他就死了。以下是具有移动功能和碰撞检测代码的玩家等级代码以及敌人等级的移动:

SFML中的冲突不是很好,如何改进? 我最近一直在使用C++和SFML最新版本进行简单的游戏,但是我遇到了一个问题,就是碰撞检测不是很好,比如玩家即使敌人没有碰他,但他就死了。以下是具有移动功能和碰撞检测代码的玩家等级代码以及敌人等级的移动:,c++,collision,sfml,C++,Collision,Sfml,`班级游戏:公共圆形 { 公众: //Constructor: PlayerA(float xposition, float yposition, float radius, float s) { setRadius(radius); setFillColor(Color::Yellow); setOutlineColor(Color(00,80,00)); setOutlineThickness(-2);

`班级游戏:公共圆形 { 公众:

    //Constructor:
    PlayerA(float xposition, float yposition, float radius, float s)
    {
        setRadius(radius);
        setFillColor(Color::Yellow);
        setOutlineColor(Color(00,80,00));
        setOutlineThickness(-2);
        setPointCount(3);
        setSpeed(s);
        setPosition(xposition,yposition);
    }

    //Movements of the player:
    void up()
    {
        move(0,-10*speed);
    }
    void down()
    {
        move(0,10*speed);
    }
    void right()
    {
        move(10*speed,0);
    }
    void left()
    {
        move(-10*speed,0);
    }
     void checkA(ObsA *obs1=NULL,ObsA *obs2=NULL, ObsA *obs3=NULL, ObsA *obs4=NULL, ObsA *obs5=NULL)
    {
        if(obs2==NULL)
        {
            if(getGlobalBounds().intersects(obs1->getGlobalBounds()))
            {
                relevel();
            }
        }
     private:
      float speed=0.00;

    void obs()
    {
        if(speed > 0)
        {
                rotate(0.5*speed);
        }
        else
        {
                rotate(0.5*speed);
        }
    }


private:
    float speed = 0.00;


    void obs()
    {
        if(speed > 0)
        {
                rotate(0.5*speed);
        }
        else
        {
                rotate(0.5*speed);
        }
    }


private:
    float speed = 0.00;

代码有问题吗,如何解决问题,谢谢!

相交函数只需检查两个矩形是否相交。如果您想在SFML中实现像素完美的碰撞检测,您必须自己编写


基本上,从相交开始,如果它是真的,那么获取相交矩形,并检查其中来自两个原始矩形的任何像素是否包含重叠的相关像素。

您使用的是圆吗?如果我没记错,圆将有一个矩形复选框。如果是这样,那么您可能与甚至是看不见的矩形角落

如果您使用的是圆,可以将类更改为方形矩形,然后查看碰撞是否正常工作。或者尝试直接在x轴或y轴上用您的圆测试碰撞;也就是说,让它们以直线相互移动,只更改一个轴。(圆的边缘将与左侧、右侧、顶部和底部矩形的边缘相同)

如果需要更好的圆碰撞,SFML中可能已经内置了一个。但我认为,使用两个圆的半径、两个对象的中心以及中心之间的斜边角来编写自己的逻辑不会太多


根据Merlyn Morgan Graham的评论进行编辑。

您可以使用此功能执行更好的碰撞检测。这是一个基本功能,但运行良好

bool circleTest(const sf::Sprite &first, const sf::Sprite &second)
{
    sf::Vector2f firstRect(first.getTextureRect().width, first.getTextureRect().height);
    firstRect.x *= first.getScale().x;
    firstRect.y *= first.getScale().y;

    sf::Vector2f secondRect(second.getTextureRect().width, second.getTextureRect().height);
    secondRect.x *= second.getScale().x;
    secondRect.y *= second.getScale().y;

    float r1 = (firstRect.x + firstRect.y) / 4;
    float r2 = (secondRect.x + secondRect.y) / 4;
    float xd = first.getPosition().x - second.getPosition().x;
    float yd = first.getPosition().y - second.getPosition().y;

    return std::sqrt(xd * xd + yd * yd) <= r1 + r2;
}
bool circleTest(const-sf::Sprite&first,const-sf::Sprite&second)
{
向量2F firstRect(first.getTextureRect().width,first.getTextureRect().height);
firstRect.x*=first.getScale().x;
firstRect.y*=first.getScale().y;
sf::Vector2f secondRect(second.getTextureRect().width,second.getTextureRect().height);
secondRect.x*=second.getScale().x;
secondRect.y*=second.getScale().y;
浮点r1=(firstRect.x+firstRect.y)/4;
浮点r2=(secondRect.x+secondRect.y)/4;
float xd=first.getPosition().x-second.getPosition().x;
float yd=first.getPosition().y-second.getPosition().y;

return std::sqrt(xd*xd+yd*yd)可能重复谢谢!这是我认为最好的。是的,你说得对,我会试试。谢谢你的帮助!“中心之间的角度”.我建议使用由中心点构成的直角三角形的斜边长度,并对照半径1+半径2进行检查,而不是尝试在某个角度上进行投影。这是你想要的吗?(抱歉,如果我太迂腐了)与其在一边平方根,不如在另一边平方根。它运行得更快,并给出相同的结果。我也不同意这是“更好的”-只是不同。它仍然不是像素完美(这可能不重要),并且比轴对齐的边界框相交测试慢得多。