2

我正在学习 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 坐标。我不确定如何解决这个问题,也无法找到答案(这很简单,至少我可以理解,我只是在学习!)。

感谢您的关注。

4

1 回答 1

1

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

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

grid[i][j].m_terrain.setPosition(x * j, y * i);
window.draw(grid[i][j].m_terrain);
于 2012-12-16T06:21:47.620 回答