2

私は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」は、対応するグリッド位置に表示されるスプライトを格納するsf::Spriteメンバー変数「m_terrain」を含むクラス「tile」の2Dベクトルです。整数x&y = 64であり、ウィンドウ上のマウスクリック位置に対応する「グリッド」の座標を決定するために使用されます。プレフィックスs_が付いているものはすべてsf::Spriteです。

このプログラムは1つの例外を除いて正常に動作しています。変更するタイルでマウスの左ボタンを押すと、前のスプライトが消えて空白の正方形の領域が残り、マウスが表示されるまでウィンドウの左上隅に置換スプライトが表示されます。ボタンを離します。置換スプライトは、マウスクリック位置に正しく表示されます。

私にとってこれは、新しいスプライトがマウスクリックで生成されているが、マウスボタンが離されるまで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 に答える