SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Трансформация изображения (а так же его адаптивность под разные разрешения)
В этой теме 23 ответа, 7 участников, последнее обновление Mihail 6 года/лет, 3 мес. назад.
-
АвторСообщения
-
Можно ли ограничить setScale?(C++ 2013 SFML)
К примеру не больше размера экрана или сохранение пропорций размера относительно дефолтного разрешения(пример дефолт 800×600 изображение 20×20 > при 1600×900 изображение 40×30).
не совсем понял вопрос , но в качестве параметров setScale принимает два значения (ну или вектор sf::Vector), вот эти две переменные можешь ограничить как хочешь
Как получить размеры изображения?(не слепой сам вижу но как заставить C++/SFML записать размеры любого произвольно изображения – не знаю)
Вот у нас есть image.png размером 600×400. Нам нужно присвоить xsize и ysize соответственно длину и ширину изображения(в дальнейшем изображений будет очень много и xsize = 600; ysize = 400; будет слишком долго вводить(прим. к тому же в ни одна программа для просмотра изображений и изменения их не знает заранее размера изображений))
Получить размеры загруженного изображения можно так:
C++1234sf::Image image;image.loadFromFile("file.png");sf::Vector2u size = image.getSize();int sizeX = size.x(), sizeY = size.y();size.x и size.y “выражение перед скобками вероятного вызова должно иметь тип функции (pointer-to-)” Не как не врублюсь как это исправить?
C++1234Image image;image.loadFromFile("img/015_cg02_02.png");Vector2u size = image.getSize();int sizeX = size.x(), sizeY = size.y();Это что за волшебство? int sizeX = size.x(), sizeY = size.y();
C++123sf::Image image;image.loadFromFile("file.png");sf::Vector2u size = image.getSize(); // size.x, size.y теперь имеют значение размера изобрженияПардонте, проглядел в доке, что x и y это поля класса, а не методы. Правильно будет так:
C++1234Image image;image.loadFromFile("img/015_cg02_02.png");Vector2u size = image.getSize();int sizeX = size.x, sizeY = size.y;Heisenberg, MatrixDeity и RazorNd СПАСИБО большое.
Во-первых заменил const Vector2f defaultResolution = Vector2f(800.0F, 600.0F); на более удобный способ получения чисел для работы float xsize = (static_cast<float>(window.getSize().x) / size.x); fon.setScale(xsize , xsize); Во-вторых теперь это пременимо к ЛЮБЫМ изображениям.
Осталось разобраться как создать массив из изображений чтобы при переключении они сменялись циклично(сохраняя настройки увеличения) и решить головную боль с центрированием. Пробовал fon.setPosition(); но он не особо удобен.
Хотя хорошо что уже работает увеличение до высоты, до ширины, до полного экрана и возврат к нормальному размеру.Всем спасибо! Очень помогли.
Используя примеры, сделал так:
C++1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253int main(){sf::Texture backgroundTexture;if (!backgroundTexture.loadFromFile("Data/RedBackground.jpg")) // RedBackground.jpg 800x600return EXIT_FAILURE;sf::Sprite background(backgroundTexture);sf::RenderWindow window(sf::VideoMode(1024, 650), "Test Background Size", sf::Style::Close | sf::Style::Resize);window.setVerticalSyncEnabled(true);Vector2u size = backgroundTexture.getSize();float xsize = (static_cast<float>(window.getSize().x) / size.x);float ysize = (static_cast<float>(window.getSize().y) / size.y);float sScale;if (xsize > ysize){sScale = ysize;}else{sScale = xsize;}background.setScale(sScale, sScale);FloatRect fRect = background.getGlobalBounds();int px = (window.getSize().x - fRect.width) / 2;int py = (window.getSize().y - fRect.height) / 2;background.setPosition(px, py);while (window.isOpen()){sf::Event event;while (window.pollEvent(event)){if (event.type == sf::Event::Closed){window.close();}else if (event.type == sf::Event::Resized){// Тут ещё нужно подумать}}window.clear();window.draw(background);window.display();}return EXIT_SUCCESS;} -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.