SFML объекты внутри экрана изменяются неправильно - PullRequest
0 голосов
/ 21 апреля 2020

У меня возникли проблемы с изменением размеров объектов в окне. Я попытался создать пустоту, которая изменяет размер представления, но кажется, что он работает неправильно. Я читаю ширину и высоту из INI-файла, и я не знаю, нужно ли мне изменять размер представления, даже когда целые числа загружены. Я знаю, что он не работает правильно, потому что я сделал куб 50x50 (выглядит нормально в 650x480) и изменил размер окна до 1920x1080, куб выглядит как прямоугольник. Вот код:

#include <SFML/Graphics.hpp>
#include "Manager.h"
#include "IniData.h"
#include <string>
#include "StateDev.h"

void resizeView(const sf::RenderWindow& window, sf::View& view)
{
  float aspectRatio = float(window.getSize().x) / float(window.getSize().y);
  view.setSize(480 * aspectRatio, 480);
}

int main() 
{
 Manager manager;
 IniData iniData;
 float deltaTime{ 0.0f };
 sf::View view(sf::Vector2f(0.0f, 0.0f), sf::Vector2f(640.0f, 480.0f));
 std::string title{ "Engine" };
 sf::Clock clock;
 sf::VideoMode vidMode(unsigned int(iniData.valWindowSize.x), unsigned int(iniData.valWindowSize.y));
 sf::RenderWindow window(vidMode, title, sf::Style::Titlebar | sf::Style::Close);
 if(iniData.valResizable) window.create(vidMode, title, sf::Style::Titlebar | sf::Style::Close | 
 sf::Style::Resize);
 window.setVerticalSyncEnabled(true);
 window.setView(view);
 manager.UpdateState(new StateDev());
 while (window.isOpen())
 {
    deltaTime = clock.restart().asSeconds();
    if (deltaTime > 1.0f / 20.0f) deltaTime = 1.0f / 20.0f;
    sf::Event event;

    while (window.pollEvent(event)) 
    {
        if (event.type == sf::Event::Closed) window.close();
        if (event.type == sf::Event::Resized) resizeView(window, view);
        if(!manager.GetCurrentState() == 0)
            manager.GetCurrentState()->ProcessInput(event, deltaTime);
    }
    if (!manager.GetCurrentState() == 0)
        manager.GetCurrentState()->Update(deltaTime);
    window.clear();
    if (!manager.GetCurrentState() == 0)
        manager.GetCurrentState()->Render(window);
    window.display();
 }
}
...