GM 5.1: Проработка работы с камерой
Решила погрузиться и доработать камеру, добавить плавный зум изображения.
Для тех кто не понимает что происходит ниже ссылка на первую статью из цикла.
Об устройстве отображения в Game Maker
В гамаке при создании комнаты нужно сразу указать размер комнаты (это общее игровое пространство уровня), размеры камеры (габариты игрового окна на экране монитора) и размеры вида (габариты области комнаты, которая отображается в рамках камеры).
В большинстве случаев размеры камеры и вида указывают одни и те же. В этом случае на экране все отображается в том же виде, в каком находится в проекте. Для использования зума нужно чтобы пропорции камеры и вида соответствовали друг другу, иначе изображение на экране будет растянуто по вертикали или горизонтали.
Я посмотрела алгоритмы для зума в гайдах, но они не совсем мне подходят, ибо мне еще в институте преподы говорили, что нужно избегать операции деления, а там все на ней. Переработаю их под себя, позаимствовав общую логику.
Делаем зум
За операции с зумом и камерой будет отвечать все тот же невидимый объект зона. Засуну в него сразу заранее переменные, в которых будет храниться разрешение экрана.
Скрипт простой, при использовании колесика мыши к текущих значениям габаритов вида прибавляются или отнимаются значения кратные пропорциям экрана (20х15 для используемого сейчас 800х600, когда отлажу все, потом добавлю поддержку других разрешений). Нужно лишь добавить ограничения на максимальное приближение (ограничим двукратным) и отдаление (по высоте комнаты).
Также нужно настроить зум так, чтобы камера центрировалась на курсоре мыши (или объекте зоне, который постоянно за мышью следует).
Увы, функция центрирования камеры есть только в новых версиях движка, поэтому приходится использовать костыли.
Сначала я игралась с настройками границ экрана, которые отслеживают определенный объект (у нас это зона) и сдвигают экран в сторону с определенной скоростью при нахождении его в указанных границах. При зуме я сильно расширяла границы, принудительно заставляя камеру двигаться и плавно уменьшала их к изначальным значениям. Но при изменении габаритов вида он все отсчитывает от нулевой точки (верхнего левого угла), постоянно дергая экран, что сильно бросается в глаза.
Тогда пришла другая идея. Отвязать зону от курсора и жестко центрировать экран по ее местоположению. При зуме же передвигать зону в сторону курсора. Так я смогу полностью контролировать скорость и плавность смещения экрана. Кроме того, этот костыль использую для свайпа экрана кнопкой мыши, попросту меняя координаты зоны.
Этот второй вариант мне зашел. Сначала ставим жесткие рамки для отслеживания зоны в настройках комнаты Кардона так, чтобы она всегда была ровно в центре экрана (настройка скорости -1 означает очень быструю скорость перемещения, при них влияние люфта экрана в верхний левый угол во время зума совсем не заметно).
В событии создания зоны сразу прописываем ей начальные координаты в центре комнаты, чтобы не перемещать вид из слепой зоны каждый раз. Здесь же прописываем параметры для контроля скорости перемещения объекта.
В событии шага удаляем следование за курсором и прописываем реакцию на скроллинг колесика мыши. Логика такая: при движении мыши запускается таймер, на протяжении которого зона движется в сторону курсора при приближении вида и от него при отдалении (за это отвечает положительное или отрицательное значение переменной camera_move_speed_dirr).
Внесем правку, добавим две переменные, отслеживающие координаты курсора в момент скролинга, чтобы зона шла к ним. После правок экран стал немного дергаться при максимальном отдалении. Причина в природе нашего костыля. Нужно задать диапазон для условия движения зоны (ведь, если скорость ее движения 4, и ей нужно попасть в координату 32 из координаты 30, то зона перепрыгнет ее на 2 пикселя и сменит направление движения, бесконечно мечась туда-сюда). Кроме того, нужно задать границы ее передвижения, ведь при максимальном отдалении зона продолжит двигаться за пределы вида и при последующем приближении он нескоро станет идти в сторону курсора, ожидая, пока зона вернется в область видимости.
Так, что-то я уже туплю, надо еще учесть в ограничениях параметры отскейленного вида. Сделаю позже, уже подустала.
Хотела еще и свайп камеры кнопкой мыши сразу сделать, но при первой попытке обделалась с подливой, нужно еще над алгоритмом подумать.