是否可以绘制Drawable并从中获取位图?

时间:2017-09-04 12:38:27

标签: c++ sfml

是否可以将绘制的Drawable作为Texture(位图)?我怎么能这样做呢?

我的尝试

我修改了绿圈示例。现在它真的被绘制为位图...

但它就是这样绘制的:

Unsmooth Arc.

我希望抗锯齿

使用RenderWindow类,我可以通过ContextSettings传递抗锯齿。使用@ Mario的建议我需要RenderTexture,不幸的是我无法控制ContextSettings

@ AlexG的建议

我创建了Context,但我的编译器说my_test.cc:9:57: error: use of deleted function 'sf::Context::Context(const sf::Context&)'。呃!还有其他选择吗?

#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>

int main()
{
    sf::ContextSettings settings =
        sf::ContextSettings(0, 0, 6);

    sf::Context context = sf::Context(settings, 200, 200);
    context.setActive(true);

    sf::RenderWindow window(
        sf::VideoMode(200, 200), "sfml test", sf::Style::Default,
        settings
    );

    sf::RenderTexture cacheTexture;
    if (!cacheTexture.create(200, 200)) return 0;
    cacheTexture.setSmooth(true);

    sf::CircleShape shape(100.f, 75);
    shape.setFillColor(sf::Color::Green);

    cacheTexture.setActive(true);
    cacheTexture.draw(shape);

    cacheTexture.setActive(false);
    context.setActive(false);

    sf::Sprite sprite = sf::Sprite(cacheTexture.getTexture());

    while (window.isOpen())
    {
        sf::Event event;

        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear();
        window.draw(sprite);
        window.display();
    }

    return 0;
}

2 个答案:

答案 0 :(得分:5)

您可以将形状绘制为sf::RenderTexture,就像@Mario所说的那样。如果将上下文设置传递给sf::Context,则可以像设置窗口一样设置抗锯齿级别(只要sf::RenderTexture是当前上下文)。

希望有所帮助!

答案 1 :(得分:3)

这样做非常简单。只需将您的drawable绘制到所需大小的sf::RenderTexture,然后您可以使用sf::RenderTexture::getTexture()来获取可以使用的纹理或保存到文件中。