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。你是对的,我误读了参数类型。@Emdzej93view::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());
}