Transformations igrnores sf::Sprite's origin

有些话、适合烂在心里 提交于 2021-02-10 05:12:45

问题


Transforming a sprite in SFML, does not regard it's new origin.

In my case sf::Sprite is rotating around the axis that is in the left top corner ({0,0}) regardless its origin. Setting new origin with .setOrigin() earlier takes no effect.

I am sure that sprite is getting the right origin position earlier which is center of rectangle.

My code:

In each of my Card class constructors I set the origin of my sprite.

card_sprite.setOrigin(Card::get_default_single_card_size().x*Game::get_scale()/2,Card::get_default_single_card_size().y*Game::get_scale()/2);

And then in my Deck class which behaves like std::stack of Cards I use function:

void Deck::push(const Card& crd)
{
    push_back(crd);
    ..//
    std::default_random_engine generator;
    std::uniform_real_distribution<float> distributor(0,360);
    top().setRotation(distributor(generator));
}

Card::setRotaion() looks like this, (which stil rotates card around top left corner) :

void Card::setRotation(float angle)
{
    card_sprite.setRotation(angle);
}

Thanks for help in advance


回答1:


Edit: Actually most methods in sf::Transform accept extra arguments to specify a center for the transformation, as per https://stackoverflow.com/users/7703024/super 's comment on my question on the same theme : How to "set the origin" of a Transform in sfml

I'm not too sure from your code, but I might've come up against a similar problem.
I "solved" it (in a very not ideal way) by replacing every call to a sfml drawing function with a call to a custom function when using sf::Transforms.

eg: instead of doing something like:

window.draw(thing, my_transform); 

I had to do :

draw_transformed(thing, my_transform, window)

Where the code of draw_transformed looks like this:

void draw_transformed (sf::Shape const& thing, sf::Transform const& t, sf::RenderWindow& window) // cf note (1)
{
  sf::Vector2f pos = thing.getPosition();
  sf::Transform go_to_zero;
  go_to_zero.translate(-pos);
  sf::Transform go_back;
  go_back.translate(pos);
  sf::Transform conjugated_transform = go_back * t * go_to_zero ;
  window.draw(thing, conjugated_transform);
  
}

(1) we can't use sf::Drawable as the type of thing because in sfml not all drawable things have a getPosition method, so we have to overload the function or do something "complicated" to go beyond this example.



来源:https://stackoverflow.com/questions/61368557/transformations-igrnores-sfsprites-origin

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!