【问题标题】:GameMaker Studio 2 - Center + clamp camera on zoomGameMaker Studio 2 - 中心 + 钳位相机变焦
【发布时间】:2018-10-29 02:58:12
【问题描述】:

我是 GameMaker 的新手,我正在玩游戏,尝试按照 Shaun Spalding 的教程创建我的第一个平台游戏,尤其是关于玩家相机跟踪的 this one。我在 Mac 上使用 GameMaker Studio 2。

我正在尝试使用类似的方法在 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.xyTo = follow.y 部件和缩放变量有关,但无法准确计算比例变化如何转化为 x/y 位置变化......
  • 更新夹紧摄像头部件,使其反映变焦的变化。

已经对这些进行了一些修改,但似乎无法弄清楚如何做到这一点,因此我们将不胜感激。

非常感谢!

【问题讨论】:

    标签: game-maker game-maker-studio-2


    【解决方案1】:

    我也在寻找解决此问题的方法,并且通过您的代码,我能够将一些东西放在一起。给你:

    创建活动

    // 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;
    

    步骤事件

    // 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);
    

    基本上我所做的更改是让“夹子”部分和“设置视图位置”知道何时更改了尺寸。请注意,我使用的变量名称与您不同,因为我也在自己的项目中使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-08
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 2021-11-18
      相关资源
      最近更新 更多