gpt4 book ai didi

C++/SFML 显示小故障,通过鼠标单击更改 Sprite 成员

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:29:37 25 4
gpt4 key购买 nike

我正在学习 C++/SFML,作为练习,我正在制作一个小程序,在一个窗口中显示 64x64 像素方形棕色 Sprite 的 10x10 网格。该程序允许您使用键盘选择绿色/黄色/蓝色/灰色/棕色方形 Sprite ,并用这个选定的 Sprite 替换所述网格上的任何瓷砖。游戏循环如下:

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"的二维 vector ,包含sf::Sprite 成员变量"m_terrain",该成员变量存储要在相应网格位置显示的 Sprite 。整数 x & y = 64,用于确定与窗口上的鼠标点击位置相对应的“网格”坐标。任何带有前缀 s_ 的东西都是 sf::Sprite。

这个程序运行良好,但有一个异常(exception),当我在要更改的图 block 上按下鼠标左键时,前一个 Sprite 消失,留下一个空白的方形区域,替换 Sprite 显示在窗口的左上角直到松开鼠标按钮。替换 Sprite 然后正确显示在鼠标单击位置。

对我来说,这表明新的 Sprite 是在鼠标点击时生成的,但在释放鼠标按钮之前不会接收到 setPosition 坐标。我不确定如何解决这个问题,也没有找到答案(这很简单,至少我能理解,我只是在学习!)。

感谢您的关注。

最佳答案

发生这种情况的原因是您在设置位置之前绘制 Sprite 。然后当下一个事件发生时(按钮按下事件)再次绘制 Sprite ,但这次使用正确的坐标。

切换绘制位置和设置位置的线条将使其工作:

grid[i][j].m_terrain.setPosition(x * j, y * i);
window.draw(grid[i][j].m_terrain);

关于C++/SFML 显示小故障,通过鼠标单击更改 Sprite 成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13899077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com