C++ 在sf::矩形形状上设置纹理的完全随机行为

C++ 在sf::矩形形状上设置纹理的完全随机行为,c++,sfml,C++,Sfml,在我的游戏中,我有一个类view::Player,它代表在板上移动的玩家令牌和显示其统计信息的玩家标签。标记很好,但一旦我实现了标签(sf::RectangleShape),奇怪的事情就开始发生了 这4个矩形是播放器标签,正如您所见,其中只有2个设置了纹理。现在有趣的是,根据我之前选择的std::stringplayer name,第二个矩形有时也没有纹理。如果我将玩家数量更改为1、2或3,则只有最后一个有纹理。我不知道发生了什么以及为什么,所以我需要从我的应用程序开始 因此,对于入口点,创建

在我的游戏中,我有一个类
view::Player
,它代表在板上移动的玩家令牌和显示其统计信息的玩家标签。标记很好,但一旦我实现了标签(
sf::RectangleShape
),奇怪的事情就开始发生了

这4个矩形是播放器标签,正如您所见,其中只有2个设置了纹理。现在有趣的是,根据我之前选择的
std::string
player name,第二个矩形有时也没有纹理。如果我将玩家数量更改为1、2或3,则只有最后一个有纹理。我不知道发生了什么以及为什么,所以我需要从我的应用程序开始

因此,对于入口点,创建玩家姓名
std::vector
的类,它是在控制台中编写的,游戏的其余部分由SFML处理GUI

void NewGame::start() {
    std::cout << "***Welcome to Eurobusiness Board Game***\n" <<
        "How many players are going to play? [2, 3 or 4] \n";
    do {
        std::cin >> m_numberOfPlayers;
    } while (m_numberOfPlayers < 2 || m_numberOfPlayers > 4);

    for (size_t i = 0; i < m_numberOfPlayers; ++i) {
        bool isNameUnique;
        std::string name;
        std::cout << "Enter name of player nr " << i + 1 << "\n";       

        do {
            std::cin >> name;
            isNameUnique = true;
            if (m_playerNames.size() > 0) {
                for (size_t i = 0; i < m_playerNames.size(); ++i) {
                    if (name == m_playerNames[i]) {
                        std::cout << "Choose unique name for every player. \n";
                        isNameUnique = false;
                    }
                    else {
                        isNameUnique = true;
                    }
                }
            }           
        } while (!isNameUnique);    
        m_playerNames.push_back(name);
    }

    view::GameView newGameView(m_numberOfPlayers, m_playerNames);
}
和最重要的部分头

namespace view {
    class GameView {
        logic::Game m_game;
        std::vector<view::Player> m_players;
    };
}
然后是'logic::Game'标题的重要部分

namespace logic {
    class Game {
        std::vector<logic::Player> m_players;
        logic::Player& getPlayer(int i) { return m_players[i]; }
    };
}
接着,我回到
view::GameView
中,我有
createPlayers()
initialise()
函数中调用,这是
gameLoop()启动后的第一件事

void view::GameView::createPlayers() {
    sf::Color color;
    int labelPositionX = PLAYER_LABEL_POSITION_X;
    int labelPositionY;
    for (int i = 0; i < m_numberOfPlayers; ++i) {           
        if (i == 0) {
            color = sf::Color::Red;         
            labelPositionY = PLAYER_ONE_LABEL_POSITION_Y;
        }
        if (i == 1) {
            color = sf::Color::Blue;            
            labelPositionY = PLAYER_TWO_LABEL_POSITION_Y;
        }
        if (i == 2) {
            color = sf::Color::Green;           
            labelPositionY = PLAYER_THREE_LABEL_POSITION_Y;
        }
        if (i == 3) {
            color = sf::Color::Yellow;          
            labelPositionY = PLAYER_FOUR_LABEL_POSITION_Y;
        }
        m_players.push_back(view::Player(m_game.getPlayer(i)));
        m_players[i].create(color, labelPositionX, labelPositionY);         
    }   
}

我知道它有很多代码,但我真的不知道要删除什么然后粘贴到这里,因为随机的事情会让它变得更糟,例如,我从
view::Player::create()
中删除了
m_标记
初始化,突然,第一个纹理也被加载了,但它的
sf::IntRect
被设置在其他地方。我不知道设计中是否有大的缺陷,或者我只是犯了一些我找不到的小错误

view::Player
logic::Player
不是相同的对象,因此,它不是复制c-tor,只是引用另一个对象作为参数的c-tor。你是对的,我误读了参数类型。@Emdzej93
view::Player::Player(logic::Player&Player){m_Player=&Player;}
--
&player
是向量中的地址吗?如果是这样的话,那么如果调整向量的大小,指针就有失效的危险。如果问题看起来是随机的,并且行为似乎由于看似无关的修改而改变,那么几乎可以肯定的是,因为代码中有未定义的行为。很可能问题甚至不在您显示的代码中,它可能在任何地方。您的问题只是代码中较远部分的另一个问题的症状。在我看来,解决方案可能是艰苦的调试和代码审查。如果您使用版本控制,请查看哪个版本首先出现问题,这可能有助于缩小问题产生的时间和地点。但该向量从未调整大小——在所有这些代码中,您对此的保证在哪里?一个人的话(和代码中的注释)并不总是真实的。就像这里--
m_玩家。推回(视图::玩家(m_游戏。getPlayer(i))?只有代码的运行才是真理。
namespace logic {
    class Game {
        std::vector<logic::Player> m_players;
        logic::Player& getPlayer(int i) { return m_players[i]; }
    };
}
namespace view {
    class Player {
        logic::Player* m_player;
        sf::CircleShape m_token;
        sf::RectangleShape m_label;
        sf::Texture m_texture;
    public:
        Player(logic::Player&);
        void create(sf::Color, int, int);
        sf::CircleShape& getToken() {
            return m_token;
        }
        sf::RectangleShape& getLabel() {
            return m_label;
        }
    };
}

view::Player::Player(logic::Player& player) {
    m_player = &player;

    if (!m_texture.loadFromFile(PLAYER_LABEL)) {
        std::cout << "Can't load texture.\n";
    }   
}

void view::Player::create(sf::Color color, 
    int labelPositionX, int labelPositionY) {

    m_token.setFillColor(color);
    m_token.setRadius(10);
    m_token.setPosition(STARTING_POSITION_X, STARTING_POSITION_Y);
    m_token.setOutlineColor(sf::Color::Black);
    m_token.setOutlineThickness(2);
    m_token.setOrigin({ 20, 20 });

    m_label.setSize(sf::Vector2f(PLAYER_LABEL_WIDTH, PLAYER_LABEL_HEIGHT));
    m_label.setTexture(&m_texture);
    m_label.setPosition(labelPositionX, labelPositionY);
    m_label.setTextureRect(sf::IntRect(0, 0, 140, 70));
}
void view::GameView::createPlayers() {
    sf::Color color;
    int labelPositionX = PLAYER_LABEL_POSITION_X;
    int labelPositionY;
    for (int i = 0; i < m_numberOfPlayers; ++i) {           
        if (i == 0) {
            color = sf::Color::Red;         
            labelPositionY = PLAYER_ONE_LABEL_POSITION_Y;
        }
        if (i == 1) {
            color = sf::Color::Blue;            
            labelPositionY = PLAYER_TWO_LABEL_POSITION_Y;
        }
        if (i == 2) {
            color = sf::Color::Green;           
            labelPositionY = PLAYER_THREE_LABEL_POSITION_Y;
        }
        if (i == 3) {
            color = sf::Color::Yellow;          
            labelPositionY = PLAYER_FOUR_LABEL_POSITION_Y;
        }
        m_players.push_back(view::Player(m_game.getPlayer(i)));
        m_players[i].create(color, labelPositionX, labelPositionY);         
    }   
}
for (int i = 0; i < m_numberOfPlayers; ++i) {
        this->m_data->window.draw(m_players[i].getToken());
        this->m_data->window.draw(m_players[i].getLabel());
}