Суббота, 23 Ноября 2024, 06:12

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Масштабирование относительно центра SDL2
AlkoshaДата: Пятница, 08 Августа 2014, 14:53 | Сообщение # 1
участник
Сейчас нет на сайте
Есть такая ф-ция, которая скейлит содержимое рендерера.
Scale

Как расчитать оффсет X и Y позиционирования рендерера, чтоб при изменении Z рендерер скейлился относительно центра, а не относительно начала декартовых координат (левого верхнего угла), как это делает он сейчас?


Сообщение отредактировал Alkosha - Пятница, 08 Августа 2014, 14:53
SaiteiДата: Пятница, 08 Августа 2014, 15:04 | Сообщение # 2
старожил
Сейчас нет на сайте
Alkosha, если не ошибаюсь, то сначала всё надо перенести в центр, масштабировать с помощью Scale и вернуть обратно. Перенос в OpenGL 2.0 кажется называется Translate что-то там.. Не помню. В OGL 3.0+ надо будет писать шейдер и переносить с помощью матрицы переноса...
Хотя я уверен, что в SDL есть реализация переноса

Добавлено (08.08.2014, 15:04)
---------------------------------------------
P.S. Адаптацию картинки под разрешение экрана делаешь?

AlkoshaДата: Пятница, 08 Августа 2014, 15:11 | Сообщение # 3
участник
Сейчас нет на сайте
Цитата Saitei ()
Адаптацию картинки под разрешение экрана делаешь?

там когда инициализируется рендерер, я фиксированное значение разрешения задал (800*600), и не парюсь над этим.

Добавлено (08.08.2014, 15:11)
---------------------------------------------
Цитата Saitei ()
Хотя я уверен, что в SDL есть реализация переноса


Я вообще просто создал класс камеры.
И когда вывожу спрайты на экран, то sprite.x-=cum.x, sprite.y-=cum.y.

То есть, когда камера движется влево -- то спрайты вправо и наоборот, так же и по Y.

Вот нужен оффсет для этой камеры.


Сообщение отредактировал Alkosha - Пятница, 08 Августа 2014, 15:14
SaiteiДата: Пятница, 08 Августа 2014, 15:16 | Сообщение # 4
старожил
Сейчас нет на сайте
Alkosha, цитирую:
Цитата
If you're just unsure of how to get started with a 2d camera, then try this:

typedef struct Camera
{
float x, y;
} Camera;

Create a camera somewhere reasonable:
Camera cam;

In your game loop, update it each logic frame:
cam.x = player.x - screen->w/2;
cam.y = player.y - screen->h/2;

Then draw the scrolling stuff (this is just a wrapper for SDL_BlitSurface):
blitSurface(player.image, screen, player.x - cam.x, player.y - cam.y);

Everything that you adjust with the camera position will be scrolling.

Good luck,
Jonny D
AlkoshaДата: Вторник, 12 Августа 2014, 15:48 | Сообщение # 5
участник
Сейчас нет на сайте
Чёт всё равно не догоняю.
screen->w/2; и screen->h/2; - это значения разрешения экрана ведь.
Оно-то у меня и так константное, смысла нет его постонно вычислять при апдейте камеры, так как в итоге всё равно получаю масштабирование относительно левого\верхнего угла.

Меняется масштаб рендерера ( обозванный переменной Z (в диапазоне от 0.1 до 4.0 )).
Нужно относительно него (значения Z) как-то расчитать оффсет

Добавлено (09.08.2014, 11:43)
---------------------------------------------
Цитата
SDL_BlitSurface


Это вообще первый SDL, где не было никаких рендереров с масштабированиями\вращениями\сглаживаниями.

Добавлено (11.08.2014, 18:01)
---------------------------------------------
Ещё попробую пошаманить с этим.
http://wiki.libsdl.org/SDL_Ren....ruct%29
Предварительно занеся в выводимую текстуру содержимое рендерера.

Добавлено (11.08.2014, 18:05)
---------------------------------------------
Правда гонять туда-сюда буффер изображения малость изварщённый вариант, по сравнению с OpenGL-ой функцией смещения glTranslatef.
Но аналогов в SDL2 лично я не нашёл.

Добавлено (12.08.2014, 13:42)
---------------------------------------------
Мдааа...ужжж....
Оказывается привязка center никак не сказывается на ректангл выводимой текстуры.
Она только задёт точку вращения.
Код
a pointer to a point indicating the point around which dstrect will be rotated (if NULL, rotation will be done aroud dstrect.w/2, dstrect.h/2)


и каким образом скейлить текстуру относительно центра?
Если например
dstrect.w=800*cum.Z;
dstrect.h=600*cum.Z;

Как расчитать смещение ?
dstrect.x=0 - [?];
dstrect.y=0 - [?];

Добавлено (12.08.2014, 13:44)
---------------------------------------------
С таким же успехом можно было бы просто рисовать напрямую в рендерер с некоторым смещением объектов, а затем скейлить. Результат тот же.

Добавлено (12.08.2014, 15:48)
---------------------------------------------
Так получилось отцентровать зум.

Код
SDL_Rect dstrect;
dstrect.w=800*cum.z;
dstrect.h=600*cum.z;
dstrect.x=400-400*cum.z;
dstrect.y=300-300*cum.z;


но чего-то при рендеринге в текстуру не работает фильтрация. Или то я где-то допустил оплошность, пока переделывал под render-to-texture. Ща буду смотреть.


Сообщение отредактировал Alkosha - Вторник, 12 Августа 2014, 13:53
SaiteiДата: Вторник, 12 Августа 2014, 16:29 | Сообщение # 6
старожил
Сейчас нет на сайте
Цитата Alkosha ()
cum.z;

Кумера?))0)
AlkoshaДата: Вторник, 12 Августа 2014, 16:50 | Сообщение # 7
участник
Сейчас нет на сайте
Цитата Saitei ()
Кумера?))0)


неа. Читается как "кам" (проверочное слово СumShot , транскрипция "Камшот").

Ну а по делу, хотел сказать, что сглаживание пашет отличненько. Дело в том, что таргет-текстуру надо было инициализировать после
Код
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "best");

То бишь, это моя оплошность была всё-таки.

Добавлено (12.08.2014, 16:50)
---------------------------------------------
И немножычко оффтопный вопрос.
Есть ли прямая поддержка шейдеров на SDL2 ? Или же тут всё так же по старинке OpenGL надо цеплять параллельно ?

Сообщение отредактировал Alkosha - Вторник, 12 Августа 2014, 16:46
SaiteiДата: Вторник, 12 Августа 2014, 17:30 | Сообщение # 8
старожил
Сейчас нет на сайте
Alkosha, этот "cum" переводится совсем иначе хд
В SDL2 вроде нет никаких классов Shader и т.п. Придётся руками писать
wcptДата: Вторник, 12 Августа 2014, 18:07 | Сообщение # 9
постоянный участник
Сейчас нет на сайте


Сообщение отредактировал wcpt - Вторник, 12 Августа 2014, 18:07
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг