1
Window / Re: How to move a rectangle with two clicks in SFML?
« on: August 30, 2021, 05:34:55 pm »Flags.
Use a flag (boolean value) to represent when something has been selected.
When you click:
if the isSelected boolean is not set, set it, if it's on the shape.
if the isSelected boolean is already set, unset it and move the shape.
This is exactly what I've done, but it still does not work:
void Board::get_click(sf::RenderWindow &window, sf::Event &event)
{
// get first click
if (event.type == sf::Event::MouseButtonPressed && mouse_pressed == false)
{
if (event.mouseButton.button == sf::Mouse::Left)
{
sf::Vector2i mouse_pos = sf::Mouse::getPosition(window);
mouse_pressed = true;
for (int i = 0; i < board.size(); i++)
{
// get position bounds of tile
Tile tile = board[i];
// check if mouse is within bounds
if (mouse_pos.x > tile.top_left().x && mouse_pos.x < tile.top_right().x) {
if (mouse_pos.y > tile.top_left().y && mouse_pos.y < tile.down_left().y) {
// get piece at tile
if (tile.getOccupied() == true)
{
std::cout << "Valid click!\n";
piece_index = i;
break;
}
else
{
mouse_pressed = false;
break;
}
}
}
}
}
}
if (sf::Mouse::isButtonPressed(sf::Mouse::Left) && mouse_pressed == true)
{
// move piece
sf::Vector2i mouse_pos = sf::Mouse::getPosition(window);
// create new piece with mouse_pos
Piece moved_piece = board[piece_index].getTilePiece();
moved_piece.set_position(mouse_pos.x, mouse_pos.y);
mouse_pressed = false;
std::cout << "Piece moved!\n";
}
}
{
// get first click
if (event.type == sf::Event::MouseButtonPressed && mouse_pressed == false)
{
if (event.mouseButton.button == sf::Mouse::Left)
{
sf::Vector2i mouse_pos = sf::Mouse::getPosition(window);
mouse_pressed = true;
for (int i = 0; i < board.size(); i++)
{
// get position bounds of tile
Tile tile = board[i];
// check if mouse is within bounds
if (mouse_pos.x > tile.top_left().x && mouse_pos.x < tile.top_right().x) {
if (mouse_pos.y > tile.top_left().y && mouse_pos.y < tile.down_left().y) {
// get piece at tile
if (tile.getOccupied() == true)
{
std::cout << "Valid click!\n";
piece_index = i;
break;
}
else
{
mouse_pressed = false;
break;
}
}
}
}
}
}
if (sf::Mouse::isButtonPressed(sf::Mouse::Left) && mouse_pressed == true)
{
// move piece
sf::Vector2i mouse_pos = sf::Mouse::getPosition(window);
// create new piece with mouse_pos
Piece moved_piece = board[piece_index].getTilePiece();
moved_piece.set_position(mouse_pos.x, mouse_pos.y);
mouse_pressed = false;
std::cout << "Piece moved!\n";
}
}
This is the output after 1 CLICK:
Valid click!
Piece moved!
It should be triggering only the first sentence, and the last sentence should be triggered once I make a second click.