我正在学习 C++/SFML,作为练习,我正在制作一个小程序,在窗口中显示 64x64 像素方形棕色精灵的 10x10 网格。该程序允许您使用键盘选择绿色/黄色/蓝色/灰色/棕色方形精灵,并用该选定的精灵替换所述网格上的任何图块。游戏循环如下:
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 坐标。我不确定如何解决这个问题,并且无法找到答案(这对我来说很简单,至少可以理解,我只是在学习!)。
感谢您的关注。
发生这种情况的原因是你绘制了精灵before你设置位置。然后,当下一个事件发生(按钮弹起事件)时,将再次绘制精灵,但这次使用正确的坐标。
切换绘制和设置位置的线条将使其起作用:
grid[i][j].m_terrain.setPosition(x * j, y * i);
window.draw(grid[i][j].m_terrain);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)