Search code examples
c++rotationsfmlimage-rotation

How do I flip an image and point a gun at the mouse at the same time? (SFML)


I'm making a shooter where the player can shoot at the mouse, so I got the guns to point at the mouse, but I can't figure out how to correctly flip the image once it's turned left. I mean, I did flip the image but it's not aligned right. I'm not really sure how to explain it, here's my code.

void PortalGun::update(Vector2i mPos) {

    float pi = 3.14159265359;

    float rotation = atan2(sprite.getGlobalBounds().top - mPos.y,sprite.getGlobalBounds().left - mPos.x) * 180 / pi;

    int x = player->sprite.getGlobalBounds().left + 16;
    int y = player->sprite.getGlobalBounds().top;

    if (rotation > -90 && rotation < 90) {
        player->dir = -1;
        sprite.setTextureRect(IntRect(0, 32, 64, -32));
    } else {
        player->dir = 1;
        sprite.setTextureRect(IntRect(0, 0, 64, 32));
    }


    sprite.setPosition(x, y + 15);
    sprite.setRotation(rotation + 170);

}

When the mouse is to the left of the gun, it flips the image but keeps rotating upwards so the mouse is 20 ish pixels higher. I can't just change the position when rotating, so what do I do? Sorry for sounding a bit cryptic, it's a bit hard to explain.


Solution

    • First of all, you should set your sprite's origin to the point where you'd like to rotate the gun (typically the handle or mounting point). To do this, use sf::Sprite::setOrigin(). The passed coordinates are relative to the top left corner of the sprite.

    • To get or set your sprite's position in the world (where your origin is), you can use sf::Sprite::getPosition() and sf::Sprite::setPosition().

    • Your rotation can stay as it is. It will rotate around your set origin.

    • To mirror your sprite, just scale (sf::Sprite::setScale()) it using a negative factor: sprite.setScale(-1, 1); The negative factor will mirror/flip the image at the set origin, without forcing you to update the texture coordinates.