Трансформация изображения (а так же его адаптивность под разные разрешения)

SFML и C++ Уроки \ Разработка игр Форумы SFML Graphics Трансформация изображения (а так же его адаптивность под разные разрешения)

В этой теме 22 ответа, 6 участников, последнее обновление  1a2b3c4d2 9 мес., 3 нед. назад.

Просмотр 15 сообщений - с 1 по 15 (из 23 всего)
  • Автор
    Сообщения
  • #2887
    Smykov
    Smykov
    Участник
    Сообщений:1

    Зарегистрирован:
    31.01.2016

    Репутация:0

    Вообщем решил попрактиковаться на создании уровня из UMK3. Планирую сделать так, что при запуске приложения, пользователь укажет разрешение экрана, а при загрузке уровня, background займет часть экрана, в зависимости от разрешения. В интернете пытался найти что-то вроде: как сделать трансформацию объекта sfml; как увеличить картинку sfml; и др. Ничего не нашел. Захожу на cyberforum.ru, и всегда находится Simillar, который крутейший эксперт, и все его ответы: попробуйте посмотреть, и вообще левые ссылки скидывает на вопросы с форума, в которых сам же и отвечает другими ссылками. Короче решил я закрыть в браузере круговорот ссылок, и написать сюда. Вообщем, хотя бы скиньте ссылку на описание и примеры применений всех операций связанных с image, texture, sprite (русифицированных). Направьте на верный путь. В заранее спасибо

    #2888
    +1
    Heisenberg
    Heisenberg
    Участник
    Сообщений:314

    Зарегистрирован:
    01.04.2015

    Репутация:139

    Вот держи, должно помочь.

    GetScr1() = 1% наименьшей стороны экрана, в основном это Y.

    #2890
    +2
    MatrixDeity
    MatrixDeity
    Модератор
    Сообщений:31

    Зарегистрирован:
    20.06.2015

    Репутация:24

    Smykov, здравствуйте.

    Для масштабирования объектов, унаследованных от sf::Transformable (коими и являются sf::Sprite и sf::Text) используется метод setScale(const sfVector2f& scale). По факту, setScale растягивает изображение до размеров <размер спрайта по умолчанию> * scale. Например, если указать scale = sf::Vector2f(0.5F, 0.5F), то изображение уменьшится вдвое по обеим координатным осям.

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

    Для написания игр под разные разрешения экранов используются другие приемы.

    #2891
    Heisenberg
    Heisenberg
    Участник
    Сообщений:314

    Зарегистрирован:
    01.04.2015

    Репутация:139

    Ну так поделитесь этими приёмами, откройте нам сие тайну)

    #2892
    MatrixDeity
    MatrixDeity
    Модератор
    Сообщений:31

    Зарегистрирован:
    20.06.2015

    Репутация:24

    Heisenberg, если Вам интересно, создайте соответствующую тему на форуме :) Может быть и поделюсь. Одна тема – один вопрос.

    #2894
    Heisenberg
    Heisenberg
    Участник
    Сообщений:314

    Зарегистрирован:
    01.04.2015

    Репутация:139

    Так эта тема и есть вопрос по этой теме.

    #2896
    Smykov
    Smykov
    Участник
    Сообщений:1

    Зарегистрирован:
    31.01.2016

    Репутация:0

    Хорошо, благодарю вас за ваши ответы

    #2900
    +5
    MatrixDeity
    MatrixDeity
    Модератор
    Сообщений:31

    Зарегистрирован:
    20.06.2015

    Репутация:24

    Heisenberg, а я вот смотрю на название темы и вижу, что это не так :)

    Вообще, эта тема достойна отдельной статьи. Вы не находите? Но чтобы не разводить срач, так и быть, изложу свои соображения:

    Как сделать игру “разрешение-независимой”?

    Вариант I(A). Как уже было сказано, масштабировать спрайты. Выбираем некоторое опорное разрешение (например, 1600х900) и рисуем текстурки под него. А далее уже меняем их размеры setScale‘ом.

    Способ, конечно, допустим, но далеко не идеален. На экране 800х600, например, изображение будет сплюснутым, а на 1920х1080 – пикселизированным.

    Вариант I(B). То же самое, но с некоторой модернизацией: масштабировать изображение только когда разрешение монитора значительно отличается от дефолтного. Например, ширина экрана игрока в 2 раза меньше ширины разрешения по умолчанию, значит уменьшаем текстуры в два раза (и по оси ‘x’, и по оси ‘y’). А если разница невелика (например, монитор 1920х1080), то пренебречь масштабированием.  Очевидно, что такой способ неточен, но зато даст недеформированную картинку. Тоже не рекомендовал бы им пользоваться (хотя, не возьмусь утверждать наверняка, кажется в Starbound используется именно этот метод).

    Вариант II. Радикальный вариант: чтобы не масштабировать спрайты можно просто менять View под размер окна. Тогда на экране будет меняться количество тайлов, “попадающих” в экран. Этот метод из Террарии. Минусы: на больших экранах будет слишком много деталей, и они будут слишком мелкие; фон на большинстве мониторов будет не полностью умещаться на экран (а еще он должен быть достаточно большого размера).

    Вариант III. Рисовать текстуры для нескольких разрешений:) Тут ничего комментировать не буду – и так все ясно.

    Вариант IV. Комбинирование нескольких вариантов. Например, I(B) и III. Это обеспечит реальные размеры текстур близкие к требуемым и масштабирование не слишком исказит картинку, и в то же время рисовать придется меньше.

    А вообще, смотрите сами, по ситуации. Идеального рецепта, как всегда, нет :)

    P.S. Heisenberg, как Вы думаете, я разумно изложил? :)

    #2901
    MatrixDeity
    MatrixDeity
    Модератор
    Сообщений:31

    Зарегистрирован:
    20.06.2015

    Репутация:24

    Smykov, “палец вверх – лучшее спасибо” 😉

    #2902
    MatrixDeity
    MatrixDeity
    Модератор
    Сообщений:31

    Зарегистрирован:
    20.06.2015

    Репутация:24

    А вообще, рисуйте пиксел-арт, как Pixel Dungeon, например! Там вообще все эти артефакты незаметны 😀

    #2906
    Павел Букреев
    Павел Букреев
    Хранитель
    Сообщений:584

    Зарегистрирован:
    04.01.2015

    Репутация:103

    Да это прям надо в FAQ на sfml-wiki копировать :))

    #2921

    1a2b3c4d2
    Участник
    Сообщений:11

    Зарегистрирован:
    05.02.2016

    Репутация:2

    Я не совсем понял как тут объяснили, поэтому спрошу.

    Разрешение окна и формат в полноэкранном режиме устанавливается пользователем из имеющихся вариантов(800×600, 1024×768 и т.д.).

    Как сделать чтобы изображение растягивалось до столкновения с одним из краев окна(и на весь экран)? (Что-то в духе функции “Fit” в настроках программы “CDisplay”.)

    Как сделать так чтобы он растянулся до столкновения с другим объектом?

    И последний нубский вопрос: как отцентрировать изображение?

    P.S. В некоторых программах при увеличении разрешения даже кнопка выхода уходила за край монитора. Как этого избежать? (C++ 2013 на всякий случай)

    #2922
    Heisenberg
    Heisenberg
    Участник
    Сообщений:314

    Зарегистрирован:
    01.04.2015

    Репутация:139

    Смотри второй пост этой темы. Используй процентное соотношение от разрешение экрана.

    #2924

    1a2b3c4d2
    Участник
    Сообщений:11

    Зарегистрирован:
    05.02.2016

    Репутация:2

    А вторую часть кода куда вставлять?
    Добавлять новые элементы .cpp или .h и в них вставлять или что-то другое?
    Просто он не может найти “Resolution.h”(или открыть) если помещать всё в один элемент. Или его нужно отдельно создать?

    #2926
    +1
    Heisenberg
    Heisenberg
    Участник
    Сообщений:314

    Зарегистрирован:
    01.04.2015

    Репутация:139

    Первая часть это объявление класса, вторая часть это его реализация.
    Подробнее см. многофайловую разработку.

Просмотр 15 сообщений - с 1 по 15 (из 23 всего)

Для ответа в этой теме необходимо авторизоваться.