GM 5.1: Проработка работы с камерой

Решила погрузиться и доработать камеру, добавить плавный зум изображения.

Для тех кто не понимает что происходит ниже ссылка на первую статью из цикла.

Об устройстве отображения в Game Maker

Переменные <b>камеры</b> условные, как таковых их нет в прямом доступе, но их можно менять и запрашивать через встроенные функции.
Переменные камеры условные, как таковых их нет в прямом доступе, но их можно менять и запрашивать через встроенные функции.

В гамаке при создании комнаты нужно сразу указать размер комнаты (это общее игровое пространство уровня), размеры камеры (габариты игрового окна на экране монитора) и размеры вида (габариты области комнаты, которая отображается в рамках камеры).

В большинстве случаев размеры камеры и вида указывают одни и те же. В этом случае на экране все отображается в том же виде, в каком находится в проекте. Для использования зума нужно чтобы пропорции камеры и вида соответствовали друг другу, иначе изображение на экране будет растянуто по вертикали или горизонтали.

Я посмотрела алгоритмы для зума в гайдах, но они не совсем мне подходят, ибо мне еще в институте преподы говорили, что нужно избегать операции деления, а там все на ней. Переработаю их под себя, позаимствовав общую логику.

Делаем зум

За операции с зумом и камерой будет отвечать все тот же невидимый объект зона. Засуну в него сразу заранее переменные, в которых будет храниться разрешение экрана.

Скрипт простой, при использовании колесика мыши к текущих значениям габаритов вида прибавляются или отнимаются значения кратные пропорциям экрана (20х15 для используемого сейчас 800х600, когда отлажу все, потом добавлю поддержку других разрешений). Нужно лишь добавить ограничения на максимальное приближение (ограничим двукратным) и отдаление (по высоте комнаты).

Также нужно настроить зум так, чтобы камера центрировалась на курсоре мыши (или объекте зоне, который постоянно за мышью следует).

Увы, функция центрирования камеры есть только в новых версиях движка, поэтому приходится использовать костыли.

Сначала я игралась с настройками границ экрана, которые отслеживают определенный объект (у нас это зона) и сдвигают экран в сторону с определенной скоростью при нахождении его в указанных границах. При зуме я сильно расширяла границы, принудительно заставляя камеру двигаться и плавно уменьшала их к изначальным значениям. Но при изменении габаритов вида он все отсчитывает от нулевой точки (верхнего левого угла), постоянно дергая экран, что сильно бросается в глаза.

Тогда пришла другая идея. Отвязать зону от курсора и жестко центрировать экран по ее местоположению. При зуме же передвигать зону в сторону курсора. Так я смогу полностью контролировать скорость и плавность смещения экрана. Кроме того, этот костыль использую для свайпа экрана кнопкой мыши, попросту меняя координаты зоны.

Этот второй вариант мне зашел. Сначала ставим жесткие рамки для отслеживания зоны в настройках комнаты Кардона так, чтобы она всегда была ровно в центре экрана (настройка скорости -1 означает очень быструю скорость перемещения, при них влияние люфта экрана в верхний левый угол во время зума совсем не заметно).

В событии создания зоны сразу прописываем ей начальные координаты в центре комнаты, чтобы не перемещать вид из слепой зоны каждый раз. Здесь же прописываем параметры для контроля скорости перемещения объекта.

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

Есть небольшой косяк, если быстро дергать курсор из стороны в сторону, то камера меняет свое движение не закончив цикл зума.

Внесем правку, добавим две переменные, отслеживающие координаты курсора в момент скролинга, чтобы зона шла к ним. После правок экран стал немного дергаться при максимальном отдалении. Причина в природе нашего костыля. Нужно задать диапазон для условия движения зоны (ведь, если скорость ее движения 4, и ей нужно попасть в координату 32 из координаты 30, то зона перепрыгнет ее на 2 пикселя и сменит направление движения, бесконечно мечась туда-сюда). Кроме того, нужно задать границы ее передвижения, ведь при максимальном отдалении зона продолжит двигаться за пределы вида и при последующем приближении он нескоро станет идти в сторону курсора, ожидая, пока зона вернется в область видимости.

Так, что-то я уже туплю, надо еще учесть в ограничениях параметры отскейленного вида. Сделаю позже, уже подустала.

Сделала отслеживаемую зону видимой, чтобы наглядно понимать суть проблемы.

Хотела еще и свайп камеры кнопкой мыши сразу сделать, но при первой попытке обделалась с подливой, нужно еще над алгоритмом подумать.

3.5K3.5K показов
235235 открытий
20 комментариев

То ли я не помню, то ли об этом не было сказано в прошлых постах - а какого конечного результата ты добиваешься? Читать интересно, но вопрос всё-таки давит на меня.

Ответить

Для начала сделать симулятор Сидоровича с непрямым управлением по типу маджести. В перспективе живую песочницу в сеттинге сталкера по типу космических рейнджеров.

Ответить

Короче, Меченый, я тебя спас и в благородство играть не буду. Выполнишь для меня пару заданий, и мы в расчёте. Заодно посмотрим, как быстро у тебя башка после амнезии прояснится. А по твоей теме постараюсь разузнать. Хрен его знает, на кой ляд тебе этот Стрелок сдался, но я в чужие дела не лезу. Хочешь убить, значит, есть, за что.

Ответить

Короче, шитпостер, я тебя лайкнул и в симповство играть не буду. Скинешь для меня пару ножек в лс, и мы в расчете. Заодно посмотрим, как быстро ты сольешь деаноны и твой пол прояснится. А по твоему лонгу постараюсь разузнать. Хрен знает, на кой ляд тебе это микроселебрити сдалось, но я в чужие чс не лезу. Хочешь стать, значит, есть зачем.

Ответить

давнолоад мастер, он ещё живой и им пользуются, жесть

Ответить

есть даже интеграция в хром, самое то, если надо качать тяжелые файлы с риском потери соединения вне торрентов. далеко не все сайты поддерживают докачку файлов.

Ответить

страшно

Ответить