Я изучаю C ++ / SFML и в качестве практического упражнения я делаю небольшую программу, которая отображает в окне сетку размером 10×10 с квадратными коричневыми спрайтами размером 64×64 px. Эта программа позволяет вам выбирать зеленый / желтый / синий / серый / коричневый квадратные спрайты с помощью клавиатуры и заменять любой тайл на указанной сетке этим выбранным спрайтом. Игровой цикл ниже:
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», который содержит переменную-член sf :: Sprite «m_terrain», в которой хранится спрайт, отображаемый в соответствующем местоположении сетки. Целые числа х & y = 64 и используются для определения координат «сетки», которые соответствуют местоположению щелчка мышью в окне. Все с префиксом s_ является sf :: Sprite.
Эта программа работает нормально, за одним исключением: когда я нажимаю левую кнопку мыши на плитке, которую я хочу изменить, предыдущий спрайт исчезает, оставляя пустую квадратную область, а замещающий спрайт отображается в верхнем левом углу окна до тех пор, пока мышь кнопка отпущена. Затем замещающий спрайт корректно отображается в месте щелчка мышью.
Для меня это означает, что новый спрайт генерируется при щелчке мышью, но не получает координаты setPosition, пока кнопка мыши не будет отпущена. Я не уверен, как это исправить, и не смог найти ответ (это достаточно просто для меня, чтобы понять, по крайней мере, я только учусь!).
Спасибо за Ваше внимание.
Причина в том, что вы рисуете спрайт до Вы устанавливаете позицию. Затем, когда происходит следующее событие (событие нажатия кнопки вверх), спрайт рисуется снова, но на этот раз с правильными координатами.
Переключение линий, где вы рисуете, и установка положения заставят это работать:
grid[i][j].m_terrain.setPosition(x * j, y * i);
window.draw(grid[i][j].m_terrain);
Других решений пока нет …