首页 > 解决方案 > 如何在我的 SFML 游戏中实现碰撞检测

问题描述

我正在为我的 SFML 游戏编写一个碰撞检测系统,但它在 x 轴上不起作用。我的播放器总是在对象中移动。但是,碰撞在 y 轴上正常进行。

我尝试更改碰撞系统,使其可以像使用 y 轴一样使用 x 轴,但是在我这样做之后,我的玩家根本无法移动。

void Player::Update(float time){
    Keyboard();
    if (STATE==climb) if (!onLadder) STATE=stay;
    if (STATE!=climb) dy+=0.000005*time;
    onLadder=false;
    sprite.move(dx,dy);
    Collision(0);
    Collision(1);
}

void Player::Keyboard()
{
    if (key["L"])
    {
        dir=1;
        if (STATE!=duck) dx=-0.1;
        if (STATE==stay) STATE=walk;
    }

    if (key["R"])
    {
        dir=0;
        if (STATE!=duck) dx=0.1;
        if (STATE==stay) STATE=walk;
    }

    if (key["Up"])
    {
        if (onLadder) STATE=climb;
        if (STATE==stay || STATE==walk) { dy=-0.27; STATE=jump;}
        if (STATE==climb) dy=-0.05;
        if (STATE==climb) if (key["L"] || key["R"]) STATE=stay;
    }

    if (key["Down"])
    {
        if (STATE==stay || STATE==walk) { STATE=duck; dx=0;}
            if (STATE==climb) dy=0.05;
    }

        if (!(key["R"] || key["L"]))
    {
        dx=0;
        if (STATE==walk) STATE=stay;
    }

    if (!(key["Up"] || key["Down"]))
    {
        if (STATE==climb) dy=0;
    }

    if (!key["Down"])
    {
        if (STATE==duck) { STATE=stay;}
    }
}

void Player::Collision(int num)
{
    for (int i = 0;i < obj.size();i++){
        if (getRect().intersects(obj[i].rect))
        {
            if (obj[i].name == "solid")
            {
                if (dy > 0 && num == 1)
                    y = obj[i].rect.top; dy=0;STATE=stay;
                if (dy < 0 && num == 1)
                    y = obj[i].rect.top; dy=0;
                if (dx > 0 && num == 0)
                    x = obj[i].rect.left - width;
                if (dx < 0 && num == 0)
                    x = obj[i].rect.left + obj[i].rect.width;
            }
                }
        }
}

我希望玩家能够移动,直到它碰撞一个物体。相反,玩家会卡在 x 轴上的对象中。然而,y 轴上的碰撞是可以的。

标签: c++sfmlgame-development

解决方案


推荐阅读