c++ - SFML - 调整窗口大小时奇怪的 RenderTexture 行为

标签 c++ sfml

我目前正在尝试在 SFML 中重新创建国际象棋。生成板通常按预期工作,但是当我调整窗口大小时,我会得到奇怪的白色边框。

调整大小之前:

调整大小后:

看起来 View 没有与窗口正确对齐,所以我认为我的问题不在于板生成,而在于我如何处理调整大小。我认为手动更新窗口 View 会有所帮助,但它只能确保正方形不会被拉伸(stretch)。然而,边界问题仍然存在,所以现在我对如何解决这个问题一无所知。

Board.h:

#pragma once

#include <SFML/Graphics.hpp>

class Board
{
public:
    void createBoard(sf::Vector2u windowSize);
    void drawBoard(sf::RenderWindow& window) const;

private:
    sf::RenderTexture board;
    sf::Color lightColor = sf::Color(159, 144, 176);
    sf::Color darkColor = sf::Color(125, 74, 141);
    sf::Color backColor = sf::Color(32, 31, 32);
};

Board.cpp:

#include <SFML/Graphics.hpp>

#include "Board.h"

void Board::createBoard(sf::Vector2u windowSize)
{
    const float xOffset = static_cast<float>(windowSize.x - windowSize.y) / 2.f;
    const float squareSize = static_cast<float>(windowSize.y) / 8.f;

    board.create(windowSize.x, windowSize.y);
    board.clear(backColor);

    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            sf::RectangleShape currSquare({ squareSize, squareSize });
            currSquare.setFillColor((i + j) % 2 ? lightColor : darkColor);
            currSquare.setPosition(xOffset + static_cast<float>(i) * squareSize, (static_cast<float>(j) * squareSize));
            board.draw(currSquare);
        }
    }
}

void Board::drawBoard(sf::RenderWindow& window) const
{
    window.draw(sf::Sprite(board.getTexture()));
}

main.cpp:

#include <SFML/Graphics.hpp>

#include "Board.h"

int main()
{
    sf::RenderWindow window(sf::VideoMode(500, 300), "Chess");
    sf::Event event;
    sf::View view = window.getDefaultView();

    Board board;
    board.createBoard(window.getSize());

    while (window.isOpen()) {
        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed) {
                window.close();
            }
            else if (event.type == sf::Event::Resized) {
                view.setSize({ static_cast<float>(event.size.width), static_cast<float>(event.size.height) });
                window.setView(view);
                board.createBoard({ event.size.width, event.size.height });
            }
        }

        window.clear(sf::Color::White);
        board.drawBoard(window);
        window.display();
    }

    return 0;
}

有人知道如何解决这个问题吗?

最佳答案

问题是您不仅需要调整 View 大小,还需要重新居中。因为现在您没有这样做,所以中心仍然是较小的板所在的位置,而较大的 View 从左上角的外部占据了一大块。

所以只需像这样更改您的代码:

...
else if (event.type == sf::Event::Resized) {
    float w = static_cast<float>(event.size.width);
    float h = static_cast<float>(event.size.height);
    view.setSize({w , h});
    view.setCenter({w/2.f , h/2.f}); // <----- !
    window.setView(view);
    board.createBoard({ event.size.width, event.size.height });
}
...

关于c++ - SFML - 调整窗口大小时奇怪的 RenderTexture 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67728340/

相关文章:

c++ - 在 C++ 中回调类成员

c++ - 有没有办法让SFML中的窗口出现而不显示cmd?

c++ - 我应该在哪里存储游戏的纹理?

c++ - std::set of MyElement 与 MyElement::SomeMethod 作为自定义比较器

c++ - 使用 C++ 在远程 Windows PC 上创建文件夹?

c++ - 将可变参数列表插入 vector 中?

c++ - const 是否适用于传递给函数的所有参数?

c++ - SFML游戏无法在Windows上编译

c++ - SFML: Vector2<double> 无法编译

c++ - 尝试包含我的源文件的 CMake 问题