C++ 转换igrnores sf::Sprite';起源
在SFML中转换一个精灵,并不认为它是新的起源 在我的例子中,sf::Sprite围绕位于左上角({0,0})的轴旋转,而不管其原点如何。较早使用.setOrigin()设置新原点无效 我确信sprite在前面得到了正确的原点位置,即矩形的中心 我的代码: 在我的每个卡片类构造函数中,我设置了精灵的原点C++ 转换igrnores sf::Sprite';起源,c++,c++17,sfml,C++,C++17,Sfml,在SFML中转换一个精灵,并不认为它是新的起源 在我的例子中,sf::Sprite围绕位于左上角({0,0})的轴旋转,而不管其原点如何。较早使用.setOrigin()设置新原点无效 我确信sprite在前面得到了正确的原点位置,即矩形的中心 我的代码: 在我的每个卡片类构造函数中,我设置了精灵的原点 card_sprite.setOrigin(Card::get_default_single_card_size().x*Game::get_scale()/2,Card::get_defaul
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);
然后在我的Deck类中,它的行为类似于std::stack of Cards,我使用函数:
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));
}
提前感谢您的帮助编辑:实际上,
sf::Transform
中的大多数方法都接受额外的参数来指定转换的中心,如per对我的问题在同一主题上的评论所示:
我不太确定你的代码,但我可能遇到了类似的问题在使用
sf::Transform
s时,我通过将对sfml绘图函数的每次调用替换为对自定义函数的调用来“解决”它(以一种非常不理想的方式)
而不是像这样做:
window.draw(thing, my_transform);
我必须做:
draw_transformed(thing, my_transform, window)
其中draw\u transformed
的代码如下所示:
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) 我们不能使用
sf::Drawable
作为对象的类型,因为在sfml中,并非所有可绘制对象都有getPosition
方法,因此我们必须重载函数或做一些“复杂”的事情来超越这个示例。请向我们展示代码。
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);
}