我正在学习 C++/SFML,作为练习练习,我正在制作一个小程序,在窗口中显示一个 10x10 的 64x64 像素方形棕色精灵网格。该程序允许您使用键盘选择绿色/黄色/蓝色/灰色/棕色方形精灵,并用这个选定的精灵替换所述网格上的任何图块。游戏循环如下:
while (window.isOpen())
{
window.clear(sf::Color(sf::Color::Black));
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num1)) s_paintBrush = s_sand;
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num2)) s_paintBrush = s_grass;
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num3)) s_paintBrush = s_dirt;
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num4)) s_paintBrush = s_water;
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num5)) s_paintBrush = s_rock;
if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
{
sf::Vector2i localPosition = sf::Mouse::getPosition(window);
int i = localPosition.x / x;
int j = localPosition.y / y;
if (i < columns && j < rows && i >= 0 && j >=0) grid[j][i].m_terrain = s_paintBrush;;
}
for (int i = 0; i < rows; ++i)
{
for (int j = 0; j < columns; ++j)
{
window.draw(grid[i][j].m_terrain);
grid[i][j].m_terrain.setPosition(x * j, y * i);
}
}
window.display();
}
“grid”是“tile”类的 2D 向量,其中包含 sf::Sprite 成员变量“m_terrain”,该变量存储要在相应网格位置显示的精灵。整数 x & y = 64,用于确定与窗口上的鼠标单击位置相对应的“网格”坐标。任何带有前缀 s_ 的东西都是 sf::Sprite。
该程序运行良好,但有一个例外,当我在要更改的图块上按下鼠标左键时,前一个精灵消失,留下一个空白方形区域,替换精灵显示在窗口的左上角,直到鼠标按钮被释放。然后替换的精灵会正确显示在鼠标点击的位置。
对我来说,这表明新的精灵是在鼠标点击时生成的,但在释放鼠标按钮之前没有接收到 setPosition 坐标。我不确定如何解决这个问题,也无法找到答案(这很简单,至少我可以理解,我只是在学习!)。
感谢您的关注。