首页 > 解决方案 > SFML - 调整窗口大小时出现奇怪的 RenderTexture 行为

问题描述

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

调整大小之前:

调整大小后:

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

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

板子.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()));
}

主.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;
}

有谁知道我该如何解决这个问题?

标签: c++sfml

解决方案


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

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

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

推荐阅读