SFML开发国际象棋时窗口缩放导致RenderTexture出现异常白边
问题根因
sf::RenderTexture的所有绘制操作(包括clear、draw)都是离屏渲染,必须调用display()方法才能将绘制结果同步到对应的纹理中。你当前代码在createBoard方法中完成棋盘绘制后没有执行该操作,缩放窗口时新生成的RenderTexture内容没有提交到纹理,getTexture()返回的还是旧尺寸的纹理数据,无法铺满整个窗口,就会漏出主循环中window.clear设置的白色背景,也就是你看到的白边。
修复方法
修改Board.cpp中的createBoard方法,在绘制完所有棋盘方块后添加board.display()调用即可:
#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); } } // 新增此行,同步离屏渲染结果到纹理 board.display(); }
可选优化
你当前的实现每次窗口缩放都会重新创建RenderTexture并重绘所有方块,性能开销更高。可以改为调整窗口视图的视口保持1:1的棋盘比例,不需要每次重绘整个棋盘,只需要调整绘制位置即可。
内容的提问来源于stack exchange,提问作者Cxmu03
相关产品推荐
相关产品推荐

