C++ SFML 如何更改网格上的视图(实现无限网格)

问题描述 投票:0回答:1

我正在尝试使用 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”时,我会这样: 对此:

非常感谢您的帮助,提前致谢

c++ sfml
1个回答
0
投票

根据文档,如果未调用

setView
,事物将绘制到默认视图。这意味着您最初看到的视图和按下 D 时看到的视图是两个不同的视图,这可以解释您所获得的视角变化。我会尝试在初始化窗口和视图后立即调用
setView
,看看会发生什么。

编辑: 我想我们都错过了这一点,这实际上可能是您的问题:您的视图设置为

WINDOW_WIDTH
WINDOW_HEIGHT
混合在一起。由于视图的纵横比与窗口的纵横比不同,那么这肯定是导致扭曲问题的原因

© www.soinside.com 2019 - 2024. All rights reserved.