我正在尝试使用 C++ SFML 库中的矩形网格来创建生命游戏的模拟。 为此,我需要实现一个“无限”网格。 我的想法是简单地绘制一个非常非常大的网格,窗口只会显示它的一小部分,而用户可以使用键盘更改视图(上下左右移动透视)。
为此,我有以下代码。我创建了一个网格,其大小是正常大小的十倍(没有实现视图逻辑)。然后我创建了一个特定大小的窗口,以及相同大小的视图对象。
#include <iostream>
#include <SFML/Graphics.hpp>
#include "game_logic.h"
int main() {
// Create the grid of cells
std::vector< std::vector<sf::RectangleShape> > grid;
for (int i = 0; i < WINDOW_HEIGHT * 10 / GRID_SIZE; i++) {
std::vector<sf::RectangleShape> row;
for (int j = 0; j < WINDOW_WIDTH * 10 / GRID_SIZE; j++) {
sf::RectangleShape cell(sf::Vector2f(GRID_SIZE, GRID_SIZE));
cell.setFillColor(DEAD_CELL_COLOR);
cell.setOutlineColor(sf::Color(200, 200, 200)); // Beige
cell.setOutlineThickness(1.25);
row.push_back(cell);
}
grid.push_back(row);
}
sf::RenderWindow window(sf::VideoMode(WINDOW_WIDTH, WINDOW_HEIGHT), "Game of life", sf::Style::Default);
sf::View view(sf::Vector2f(WINDOW_HEIGHT / 2, WINDOW_WIDTH / 2), sf::Vector2f(WINDOW_HEIGHT, WINDOW_WIDTH));
getUserInput(window, grid, WINDOW_WIDTH, WINDOW_HEIGHT, GRID_SIZE);
while (window.isOpen()) {
sf::Event evnt;
while (window.pollEvent(evnt)) {
switch(evnt.type) {
case sf::Event::KeyPressed:
if (evnt.key.code == sf::Keyboard::D){
view.move(sf::Vector2f(10, 0));
window.setView(view);
}
break;
}
}
updateGrid(grid); // This simply change the grid values, based on Game of Life logic
sf::sleep(sf::milliseconds(SLEEP_DURATION));
window.clear();
drawGrid(window, grid, GRID_SIZE);
window.display();
}
return 0;
}
这是“drawGrid()”:
void drawGrid(sf::RenderWindow& window, std::vector< std::vector<sf::RectangleShape> >& grid, int grid_size){
for (int i = 0; i < grid.size(); i++) {
for (int j = 0; j < grid[0].size(); j++) {
// Set cell position based on its grid coordinates
grid[i][j].setPosition(j * grid_size, i * grid_size);
window.draw(grid[i][j]);
}
}
}
我的问题是,当按“D”时,这段代码不会改变视角,它只是扭曲整个网格。当按“D”时,我会这样: 对此:
非常感谢您的帮助,提前致谢
根据文档,如果未调用
setView
,事物将绘制到默认视图。这意味着您最初看到的视图和按下 D 时看到的视图是两个不同的视图,这可以解释您所获得的视角变化。我会尝试在初始化窗口和视图后立即调用 setView
,看看会发生什么。
编辑: 我想我们都错过了这一点,这实际上可能是您的问题:您的视图设置为
WINDOW_WIDTH
和 WINDOW_HEIGHT
混合在一起。由于视图的纵横比与窗口的纵横比不同,那么这肯定是导致扭曲问题的原因