c++ - 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;
}
有谁知道我该如何解决这个问题?
解决方案
问题是您不仅需要调整视图大小,还需要重新定位它。因为现在你没有这样做,中心仍然是较小的板所在的位置,而较大的视图从左上角的外部占据了一大块。
所以只需像这样更改您的代码:
...
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 });
}
...
推荐阅读
- python - 重塑 Pandas 列以显示图像
- git - Visual Studio GIT 重置为以前的提交问题
- sql-server - 使用 SQL 身份验证时 SSIS 批量插入错误
- ios - 具有后台进程的领域实例丢失数据
- ios - cellForItemAt called only once in Swift collectionView
- excel - 无法在 Excel 中定义对象
- kotlin - 如何在 Kotlin Multiplatform(纯 kotlin)中进行延迟
- sql - Oracle SQL CREATE TABLE 耗时太长或无法创建(没有 CREATE TABLE 工作)
- unity3d - Destroying Prefabs Object After Spawn Using collision
- r - 针对所有变量调用 R 函数