SFML полноэкранный и центр - PullRequest
0 голосов
/ 28 апреля 2020

Привет, ребята

Чтобы дружественно масштабировать мое приложение sfml , я пытаюсь понять это, программа изначально запускалась с (640, 480 ) размеры, показывающие подобное окно ...

Window dimensions example

Моя цель - запустить программу в полноэкранном режиме и установить старый 'окно' (проверьте изображение), в центре и таким образом сохраните исходные размеры и элементы.


Хорошо, я инициализирую приложение основного файла со стилем sfml по умолчанию 'Style :: Fullscreen' .

RenderWindow(sf::VideoMode(), "app.exe", sf::Style::Fullscreen);

Пустой параметр 'VideoMode ()' не создает масштаб по умолчанию от sfml (не изменяет размер ничего), это позволяет избежать искаженной программы, но некоторые функциональные возможности также не работают, например, View изменен, а некоторые остальные изображения распределяются по окну как со старыми измерениями, это логично, потому что мое приложение получает вот так.

sf::View worldview(RenderWindow.getDefaultView());

Я могу исправить некоторые проблемы, связанные с размером экрана. Но существуют ли другие способы улучшить это и попытаться центрировать (в полноэкранном режиме) старое 'окно' ?

Final fullscreen app

Ответы [ 3 ]

0 голосов
/ 01 мая 2020

Я решил, что принял решение повторно ответить на мой вопрос, я буду считать, что моя проблема решена на 80% Во-первых, окно рендеринга инициализируется в режиме ' sf :: Style :: fullscreen ', экземпляр VideoMode () все еще пуст и равен основному Посмотреть экземпляр.

worldView(RenderWindow.getDefaultView()).

Это небольшое решение привело меня к изображению background (которое я загружал в программу раньше), потому что в основной логике c моего приложения Я могу получить экземпляр окна рендеринга с помощью экземпляра контекста. Для получения дополнительной информации вы можете проверить официальную документацию SFML для sf :: Context .

// 2d vector to store window dimension as unsigned int's.
sf::Vector2u size = context.RenderWindow->getSize();

После этого я создаю двумерный sf :: Vector2u двумерного кордината, в котором хранится текущий размер полноэкранного окна .



На этом шаге я бы центрировал его фон с помощью функции , чтобы центрировать объекты по его координатам и границам происхождения .

        mBackgroundSprite.setPosition(size.x / 2u, size.y / 2u);
        centerObject(mBackgroundImg);
        .
        .
        .
        // In this case is a sprite image.
        void centerOrigin(sf::Sprite& sprite)
        {
            sprite.setOrigin(std::floor(sprite.getLocalBounds().left + sprite.getLocalBounds().width / 2.f), 
                             std::floor(sprite.getLocalBounds().top + sprite.getLocalBounds().height / 2.f));
        };

В этот момент, когда изображение находится в центре, я могу начать размещать остальные элементы с относительными позициями, например, иметь ссылку. Большинство объектов неправильно масштабируются, но это может быть удобно для многих компьютеров ...

0 голосов
/ 01 мая 2020

Размер изображения должен совпадать с полноэкранным разрешением, поэтому, как вы писали:
sf::View worldview(RenderWindow.getDefaultView());
должно быть в порядке.

Тем не менее, вы должны быть в центре этого окна - то, что было в центре исходного размера окна. Поэтому вы можете просто установить центр вида на то место, где он был раньше:

    const sf::Vector2u originalSize{ 640u, 480u };
    worldview.setCenter(sf::Vector2f(originalSize / 2u));

Обратите внимание, что это означает, что диапазон вида будет иметь отрицательные значения.

Например, на дисплей 1920x1080:
Размер представления, конечно же, составляет 1920x1080.
Центр представления (теперь очевидно): (320, 240).
(0, 0) - (640, 480) диапазон координат находится в центре.

Верхний левый угол этого вида (верхний левый угол экрана) будет: (-640, -300).
Нижний правый угол вида / экрана будет: (1280, 780).

0 голосов
/ 29 апреля 2020

Стиль окна SFML по умолчанию: sf :: Style :: Default, а не sf :: Style :: Fullscreen. По умолчанию вы получаете стандартные параметры, такие как Свернуть, Полноэкранный режим и Выход. Чтобы использовать их, вам нужно настроить обнаружение событий (нажатие кнопки). В принципе этого было бы достаточно, написано внутри игры l oop while (window.isOpen())

sf::Event _event;
while (window.pollEvent(_event)) {
    if (_event.type == sf::Event::Closed) {
        window.close();
    }
}
...