在一个函数中改变有效的setter会在另一个函数中重置为旧状态

时间:2016-09-07 09:06:52

标签: c++ sfml

#include "Healthbar.h"

Healthbar::Healthbar(const sf::Vector2f& size, const sf::Vector2f& position) 
: m_borderRect(size), m_bar(size)
{
    m_borderRect.setOutlineColor(sf::Color::Red);
    m_borderRect.setFillColor(sf::Color::White);
    m_borderRect.setOutlineThickness(5);
    m_borderRect.setPosition(position);
    m_bar.setPosition(position); 
    m_bar.setFillColor(sf::Color::Green); 
}

void Healthbar::draw(sf::RenderWindow& window)
{
    window.draw(m_borderRect);
    window.draw(m_bar);
}

void Healthbar::damage(int num)
{
    m_bar.setSize(sf::Vector2f(m_bar.getSize().x - 100/num, m_bar.getSize().y));
}

int Healthbar::getBarSizeX() const
{
    return m_bar.getSize().x;
}

在包含健康栏的太空船类中:

Healthbar Spaceship::getHealth()
{
    return m_health;
}

int Spaceship::getSizeX() const
{
    return m_health.getBarSizeX();
}

碰撞经理与敌人的射弹和船只相互作用:

void CollisionManager::shipProjectileCollision(EnemyFleet& fleet, Spaceship& ship)
{
    for (int j = 0; j < fleet.getProjSize(); j++) {
        if (ship.checkCollision(fleet.getProjectile(j))) {
            ship.getHealth().damage(3);
        }
    }
}

在源文件中:

Spaceship ship; 
std::cout << ship.getHealth().getBarSizeX() << std::endl; // = 100
ship.getHealth().damage(3);
std::cout << ship.getHealth().getBarSizeX() << std::endl; //should be 66.67

我正在制造太空入侵者。当太空船与抛射物发生碰撞时,我试图减小健康棒的大小~33.33,但是它不能正常工作。这似乎与传统功能中的吸气剂和二传手相似,所以我不确定这里发生了什么...

伤害结束时#34;函数我放了一个断点,它有正确的大小,但然后在主函数中,它在我改变大小后绘制,在绘图中它始终为100在向量中的x。

1 个答案:

答案 0 :(得分:0)

Healthbar Spaceship::getHealth()

您从getHealth()返回,因此它始终是一个新实例,它是原始的副本,可能初始化为100大小。你可以改为引用一个引用,例如Healthbar& getHealth();