Зависмость размеров спрайтов от размера окна
|
|
goldsphere | Дата: Суббота, 19 Октября 2013, 07:49 | Сообщение # 1 |
заслуженный участник
Сейчас нет на сайте
| Назрел такой вопрос, как в играх делают так, что в зависимости от размера окна все спрайты маштабируются, отображаются в нормальном качестве, и на своих местах?
FinderX - Android Аркада
Сообщение отредактировал goldsphere - Суббота, 19 Октября 2013, 07:53 |
|
| |
avolkoff | Дата: Суббота, 19 Октября 2013, 10:21 | Сообщение # 2 |
частый гость
Сейчас нет на сайте
| Это происходит в конвейере визуализации (Rendering Pipeline), на уровне геометрии (The Geometry Stage), при проецировании (Projection) объектов. Есть матрица проекции в которой указано соотношение экрана и прочая фигня...
|
|
| |
beskor | Дата: Суббота, 19 Октября 2013, 11:59 | Сообщение # 3 |
был не раз
Сейчас нет на сайте
| нихрена себе... ну я так понял это пример для 3D, а если для 2D (спрайтов), то можно особо не париться и просто самому рассчитать размеры и координаты. Например W - ширина экрана, H - высота экрана (я думаю в любой среде программирования не составит труда узнать эти значения), w,h - размеры спрайта в % от размеров окна. Получается реальный размер в пикселях равен W*w и H*h, аналогично для положения. Но все равно странный вопрос. Во всех играх интерфейс не в процентах, а как раз в пикселях и чем выше разрешение - тем меньше спрайты интерфейса по отношению к монитору.
сон? а что это? ах, да, кому интересно, мы тоже игру делаем: ПАРАДОКС
|
|
| |
goldsphere | Дата: Суббота, 19 Октября 2013, 15:39 | Сообщение # 4 |
заслуженный участник
Сейчас нет на сайте
| Я пришёл почти к тому же самому. Только я взял как за шаблон определённый размер(например 800, 600), потом получал размеры окна и получал коэффициент соотношения размеров к шаблону. Позицию умножал на этот коэффициент. И масштабировал тоже. Только иногда изображения растягивалось не очень приятно.
FinderX - Android Аркада
|
|
| |
First | Дата: Суббота, 19 Октября 2013, 22:47 | Сообщение # 5 |
Уолтер Брайт
Сейчас нет на сайте
| Если тебе интересует по SFML, то обрати внимание, что там уникально решен данный вопрос. То есть, выведи спрайты на экран и сделай окно шире (на весь экран даже) и ты увидишь, как все увеличилось, то есть растянуло, но сама таблица координат так и остается неизменной, то есть, если окно было в оконном режиме 600х200, то таким и останется по сетке координат, но картинка растянется. Ты можешь использовать сглаживание текстур или всего окна, что текстуры выглядели плавными и сглаженными. Для текстур, это функция смуз, а для окна нужно прописывать это при создании - contexsetting(0,0,уровень сглаживания)
|
|
| |
goldsphere | Дата: Воскресенье, 20 Октября 2013, 10:44 | Сообщение # 6 |
заслуженный участник
Сейчас нет на сайте
| First, насчёт растягивания текстур - я знаю, просто в моей игре есть выбор размера окна при котором окно пересоздаётся и в таком случае надо вручную растягивать спрайты и скажем, если у меня для каждого спрайта есть своя зона(например проверка нажатия на него) её тоже надо увеличивать. Цитата First ( ) contexsetting(0,0,уровень сглаживания) А пример можно?
FinderX - Android Аркада
Сообщение отредактировал goldsphere - Воскресенье, 20 Октября 2013, 10:44 |
|
| |
First | Дата: Воскресенье, 20 Октября 2013, 13:14 | Сообщение # 7 |
Уолтер Брайт
Сейчас нет на сайте
| Цитата goldsphere ( ) А пример можно?
Смотри, это на vb.net пример. Разберись в нем.
Код Dim WithEvents W As New RenderWindow(New VideoMode(800, 600), "Название окна", Styles.Default, New ContextSettings(4, 4, 32))
|
|
| |
zombihello | Дата: Понедельник, 11 Июля 2016, 00:08 | Сообщение # 8 |
был не раз
Сейчас нет на сайте
| Я конечно понимаю что прошло уже 3 года и автора эта тема не волнует, но есть такие ребята которым нужна помощь. Ну давайте я не буду тянуть кота за хвост и перейду сразу к теме.
Мой способ таков: в SFML есть такой класс View ( типо игровой камеры ) и с помощью него можно решить данную проблему. Т.е мы берем какое-то разрешение на котором у нас будет работать игра, например, 1280х720 и масштабируем игровую камеру под это разрешение
Пример: разрешение у игрока: 800x600 выбранное разрешение: 1280х720 Далее, мы находим разницу ( W = 1280-800; H=720-600 ), а потом ее прибавляем к разрешению игрока ( 800+W; 600+H )
Пример на коде:
Код Vector2f Difference; // вектор в котором будет хранится разница Difference.x = 1280 - 800; // находим разницу длины. ВАЖНО: Выбраное разрешение должно стоять первым ( если у игрока разрешение будет больше, то оно его отнимет ) Difference.y = 720 - 600; // находим разницу высоты. View( FloatRect( 0, 0, 800 + Difference.x, 600 + Difference.y ) ); // создаем камеру с разрешением 1280x720. Ну а дальше мы эту камеру применяем на окне ( setView )
Laudate sol! | Praise The Sun! | Слава солнцу!
|
|
| |