如何在我的SFML游戏中实现碰撞检测

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

我正在为我的SFML游戏编写碰撞检测系统,但它在x轴上不起作用。我的玩家一直在移动物体。但是,碰撞在y轴上正常进行。

我已经尝试更改碰撞系统,使其可以像x轴一样使用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++ sfml game-development
1个回答
0
投票

也许您可以根据精灵的速度向相反方向稍微移动精灵,以将其移出碰撞对象的边界:

if (getRect().intersects(obj[i].rect))
{
    // check collision to right
    if (dx > 0) {
        sprite.move(-1, 0);
    // check collision to left
    } else if (dx < 0) {
        sprite.move(1, 0);
    }
    // check collision below
    if (dy > 0) {
        sprite.move(0, -1);
        dy = 0;
    // check collision above
    } else if (dy < 0) {
        sprite.move(0, 1);
}
© www.soinside.com 2019 - 2024. All rights reserved.