【发布时间】:2021-05-27 18:55:57
【问题描述】:
我目前正在尝试在 SFML 中重新创建国际象棋。生成板通常按预期工作,但是当我调整窗口大小时,我得到奇怪的白色边框。
调整大小之前:
调整大小后:
看起来视图与窗口没有正确对齐,所以我认为我的问题不在于板生成,而在于我如何处理调整大小。我认为手动更新窗口视图会有所帮助,但它只能确保正方形不会被拉伸。但是边界问题仍然存在,所以现在我对如何解决这个问题一无所知。
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;
}
有谁知道我该如何解决这个问题?
【问题讨论】:
-
显示
board.getTexture()的定义。 -
@rafix07
board是一个 RenderTexture 所以board.getTexture()是一个由 SFML 内部定义的函数。但是,是的,我可能应该澄清一下该板是一个 RenderTexture -
在
drawBoard中调用sf::RenderTexture::display在window.draw之前可能会有所帮助。 -
@rafix07 我已经尝试调用
board.display(),但它没有改变任何东西。