【问题标题】:Transformations igrnores sf::Sprite's origin转换忽略 sf::Sprite 的起源
【发布时间】:2020-08-05 16:14:09
【问题描述】:

在 SFML 中转换一个 sprite,并不认为它是新的来源。

在我的例子中,sf::Sprite 围绕左上角 ({0,0}) 的轴旋转,而不管其原点。之前使用 .setOrigin() 设置新的原点无效。

我确信精灵更早地获得了正确的原点位置,即矩形的中心。

我的代码:

在我的每个 Card 类构造函数中,我设置了我的精灵的原点。

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));
}

Card::setRotaion() 看起来像这样,(仍然围绕左上角旋转卡片):

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

提前感谢您的帮助

【问题讨论】:

  • 请出示代码。

标签: c++ c++17 sfml


【解决方案1】:

编辑:实际上sf::Transform 中的大多数方法都接受额外的参数来指定转换的中心,根据https://stackoverflow.com/users/7703024/super 对我在同一主题上的问题的评论:How to "set the origin" of a Transform in sfml

我不太确定您的代码,但我可能遇到过类似的问题。
在使用sf::Transforms 时,我通过将每次对 sfml 绘图函数的调用替换为对自定义函数的调用来“解决”它(以一种非常不理想的方式)。

例如:而不是做类似的事情:

window.draw(thing, my_transform); 

我不得不这样做:

draw_transformed(thing, my_transform, window)

draw_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 作为 thing 的类型,因为在 sfml 中并非所有可绘制的东西都有 getPosition 方法,所以我们必须重载函数或做一些“复杂”的事情才能去除了这个例子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 2019-07-13
    • 2018-03-03
    • 2021-09-04
    • 1970-01-01
    • 2019-09-19
    • 2023-04-09
    相关资源
    最近更新 更多