SFML 渐变矩形

问题描述 投票:0回答:1

梯度似乎有问题,我无法弄清楚。它应该填满整个窗口,但我在屏幕右侧缺少一个三角形。关于如何修复它有什么想法吗?

正如之前所说,矩形的右侧缺少一个三角形。正如我所提到的,我已经尝试了很多次,用谷歌搜索(如果有什么我错过了),甚至尝试使用 ChatGPT 来实现。以下是现在使用的代码:

void setBackgroundGradient(sf::RenderWindow& window) {
    // Create a vertex array for the background
    sf::VertexArray background(sf::Quads, 4);

    // Define the gradient colors
    sf::Color colorLeft(117, 58, 136);
    sf::Color colorRight(174, 50, 111);

    // Set the gradient colors and positions for each vertex
    for (int i = 0; i < 4; ++i) {
        // Set the position for each vertex
        background[i].position = sf::Vector2f((i % 2) * window.getSize().x, (i / 2) * window.getSize().y);

        // Interpolate color between colorLeft and colorRight based on the x-position percentage
        float factor = background[i].position.x / window.getSize().x;

        background[i].color = sf::Color(
            static_cast<sf::Uint8>((1.0f - factor) * colorLeft.r + factor * colorRight.r),
            static_cast<sf::Uint8>((1.0f - factor) * colorLeft.g + factor * colorRight.g),
            static_cast<sf::Uint8>((1.0f - factor) * colorLeft.b + factor * colorRight.b)
        );
    }

    window.draw(background);
}


void createWindow() {
    sf::RenderWindow window{ sf::VideoMode(1200,800), "TGUI window with SFML"}; //{1200, 800}

    //A Gui Object that works with Sfml window. 
    tgui::GuiSFML gui{ window };

    runGUI(gui, window);

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

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

        //Set background color and display window
        //window.clear(sf::Color(50,50,50));

        window.clear();

        setBackgroundGradient(window);

        gui.draw();

        window.display();

    }
}

这是我现在得到的结果: [图片][1] [1]:https://i.stack.imgur.com/jV8c4.png

c++ sfml
1个回答
0
投票

通过手动设置 4 个索引中的每一个来自行修复:

// Define the gradient colors
sf::Color colorLeft(117, 58, 136);
sf::Color colorRight(174, 50, 111);

// Set the gradient colors and positions for each vertex
for (int i = 0; i < 4; ++i) {
    // Set the position for each vertex
    background[0].position = sf::Vector2f(0, 0);
    background[1].position = sf::Vector2f(window.getSize().x, 0);
    background[2].position = sf::Vector2f(window.getSize().x, window.getSize().y);
    background[3].position = sf::Vector2f(0, window.getSize().y);

    // Interpolate color between colorLeft and colorRight based on the x-position percentage
    float factor = background[i].position.x / window.getSize().x;

    background[i].color = sf::Color(
        static_cast<sf::Uint8>((1.0f - factor) * colorLeft.r + factor * colorRight.r),
        static_cast<sf::Uint8>((1.0f - factor) * colorLeft.g + factor * colorRight.g),
        static_cast<sf::Uint8>((1.0f - factor) * colorLeft.b + factor * colorRight.b)
    );
}

window.draw(background);
© www.soinside.com 2019 - 2024. All rights reserved.