在一个函数中使用有效的 setter 进行更改会在另一个函数中重置回其旧状态

Changing with what is effectively a setter in one function resets back to its old state in another function

本文关键字:函数 状态 另一个 setter 一个 有效      更新时间:2023-10-16
#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,但它不起作用。这似乎类似于传统函数中的获取器和设置器,所以我不确定这里发生了什么......

在"damage"函数结束时,我放置了一个断点,它的大小合适,但在主函数中,当我更改大小后它会绘制,并且在绘制过程中,向量中的 x 总是为 100。

Healthbar Spaceship::getHealth()

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