GameMaker Studio 2 - центр + зажим камеры на зум - PullRequest
0 голосов
/ 29 октября 2018

Я новичок в GameMaker и пытаюсь создать свой первый платформер, следуя инструкциям Шона Сполдинга, особенно этот относительно отслеживания камеры игрока. Я использую GameMaker Studio 2 на Mac.

Я пытаюсь использовать аналогичный подход, чтобы разрешить плавное масштабирование во время dramatic-ish событий сценариев, в основном медленно увеличивая или уменьшая параметры camera_set_view_size() для достижения плавного увеличения.

В настоящее время у меня есть текущий код объекта oCamera, который работает для части масштабирования.

Создать событие

/// @description Setup camera

zoom_level = 1;

cam = view_camera[0];
follow = oPlayer;
view_w_half = camera_get_view_width(cam) * 0.5;
view_h_half = camera_get_view_height(cam) * 0.5;
xTo = xstart;
yTo = ystart;

default_zoom_width = camera_get_view_width(cam);
default_zoom_height = camera_get_view_height(cam);
currW = default_zoom_width;
currH = default_zoom_height;

Шаг события

/// @description Update camera

// Update zoom size
if keyboard_check_pressed(ord("I")) {
  zoom_level = 0.5;
} else if keyboard_check_pressed(ord("O")) {
  zoom_level = 1;
} else if keyboard_check_pressed(ord("P")) {
  zoom_level = 2;
}

// Update destination
if (instance_exists(follow)) {
  xTo = follow.x;
  yTo = follow.y;
}

// Update object position
x += (xTo - x) / 25;
y += (yTo - y) / 25;

// Update view size
zoomXTo = default_zoom_width * zoom_level;
zoomyTo = default_zoom_height * zoom_level;
currW += (zoomXTo - camera_get_view_width(cam)) / 25;
currH += (zoomyTo - camera_get_view_height(cam)) / 25;
camera_set_view_size(cam, currW, currH);

// Clamp camera 
x = clamp(x, view_w_half, room_width - view_w_half);
y = clamp(y, view_h_half, room_height - view_h_half);

// Update camera position
camera_set_view_pos(cam, x - view_w_half, y - view_h_half);

Бит масштабирования, вероятно, мог бы быть немного более кратким, но выполняет свою работу. Мне все еще интересно, как:

  • держать игрока в центре. Я предполагаю, что есть какое-то отношение к деталям xTo = follow.x и yTo = follow.y и переменной масштаба, но не могу точно определить, как изменение масштаба, переведенное в изменение положения х / у ...
  • обновить зажимную часть камеры, чтобы она отражала изменение масштаба.

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

Большое спасибо!

1 Ответ

0 голосов
/ 05 февраля 2019

Я также искал решение для этого, и с вашим кодом я смог что-то собрать. Вот, пожалуйста:

Создать событие

// Camera Setup
cam = view_camera[0];
cam_default_w = camera_get_view_width(cam);
cam_default_h = camera_get_view_height(cam);
follow = oPlayer;
view_w_half = camera_get_view_width(cam) * 0.5;
view_h_half = camera_get_view_height(cam) * 0.5;
xTo = xstart;
yTo = ystart;

// Zooming
zoomLevel = 1;
temp_cam_w = cam_default_w;
temp_cam_h = cam_default_h;

// Shaking
shake_length = 0;
shake_magnitude = 0;
shake_remain = 0;
buff = 32;

Step Event

// Update zoom size
if keyboard_check_pressed(ord("I")) {
  zoomLevel = 0.5;
} else if keyboard_check_pressed(ord("O")) {
  zoomLevel = 1;
} else if keyboard_check_pressed(ord("P")) {
  zoomLevel = 2;
}

// Update view size
zoomXTo = cam_default_w * zoomLevel;
zoomYTo = cam_default_h * zoomLevel;
temp_cam_w += (zoomXTo - camera_get_view_width(cam)) / 25;
temp_cam_h += (zoomYTo - camera_get_view_height(cam)) / 25;
var temp_cam_w_half = temp_cam_w/2;
var temp_cam_h_half = temp_cam_h/2;
camera_set_view_size(cam, temp_cam_w, temp_cam_h);

// Update destination
if (instance_exists(follow)) {
    xTo = follow.x;
    yTo = follow.y;
}

// Update object position
x += (xTo - x) / 15;
y += (yTo - y) / 15;

// Keep within room
x = clamp(x, temp_cam_w_half+buff, room_width-temp_cam_w_half-buff);
y = clamp(y, temp_cam_h_half+buff, room_height-temp_cam_h_half-buff);

// Camera shake
x += random_range(-shake_remain, shake_remain);
y += random_range(-shake_remain, shake_remain);
shake_remain = max(0, shake_remain-((1/shake_length)*shake_magnitude));

// Update camera view
camera_set_view_pos(cam, x-temp_cam_w_half, y-temp_cam_h_half);

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

...