首页 > 解决方案 > 调用函数时类对象成员变量不会改变

问题描述

我的问题是我无法更改类成员变量值,我尝试了所有想到的东西

所以这里涉及到以下代码:

if(player.getCollisionObject().isColliding(platform1))
{
    if(player.getCollisionObject().up)
        std::cout << "Colliding from top\n";
    if(player.getCollisionObject().down)
        std::cout << "Colliding from bottom\n";
    if(player.getCollisionObject().left)
        std::cout << "Colliding from left\n";
    if(player.getCollisionObject().right)
        std::cout << "Colliding from right\n";
}

bool Collision::isColliding(const Entity &other)
{
    resetCollisionDirection();

    sf::Vector2f otherCenterPosition = other.getCenterPosition();
    sf::Vector2f otherSize = other.getSize();

    float deltaX = m_CenterPosition.x - otherCenterPosition.x; // abs(deltaX) - (thisX + otherX)
    float deltaY = m_CenterPosition.y - otherCenterPosition.y;

    float resultX = abs(deltaX) - (m_Size.x / 2 + otherSize.x / 2); 
    float resultY = abs(deltaY) - (m_Size.y / 2 + otherSize.y / 2);

    if(resultX < 0 && resultY < 0) 
    {
        if(m_CenterPosition.x < otherCenterPosition.x)
            left = true;
        if(m_CenterPosition.x > otherCenterPosition.x)
            right = true;
        if(m_CenterPosition.y < otherCenterPosition.y)
            up = true;
        if(m_CenterPosition.y > otherCenterPosition.y)
            down = true;

        return true;
    }
    return false;
}

class Collision
{
public:
    Collision(const Entity &entity);

    void reset(const Entity &entity);
    bool isColliding(const Entity &other);

    bool up, down, left, right;

private:
    void resetCollisionDirection();

private:
    sf::Vector2f m_CenterPosition, m_Size;

};

所以问题是我的播放器类中有一个 Collision 的类成员,并且我正在从我的播放器访问 Collision 对象并检查它是否与另一个对象发生冲突,如果是,它将返回 true 并且还应该设置内部从哪个方向发生碰撞的标志,但在它从“isColliding()”函数返回后,来自 Collision 对象的标志尚未设置

我真的不明白这里可能是什么问题,我尝试调试它并尝试一步一步地跟随。我的观察是,它确实在函数调用期间设置了标志,但是一旦它返回,信息就丢失了

任何帮助,将不胜感激!

编辑:这是 getCollisionObject() 函数:

Collision Player::getCollisionObject()
{
    return m_CollisionBody;
}

编辑:发现上面的函数返回一个副本的问题(对不起,我是个白痴)将其更改为

Collision& Player::getCollisionObject()
{
    return m_CollisionBody;
}

标签: c++classmember-variables

解决方案


有你的问题。 getCollisionObject()按值返回。将其更改为

Collision &Player::getCollisionObject()

推荐阅读