From 08292726ce6339f335d70c90ab47c229a897c833 Mon Sep 17 00:00:00 2001 From: Jack Conradsen Date: Wed, 4 Mar 2026 02:54:03 +0100 Subject: [PATCH 01/19] try and fix follow twitch, and constraint transition stepped there is still a twitch when moving at edges of zones, and room_to_gui -> room_to_view has twitch too, when smooth_draw is off --- objects/obj_player/Create_0.gml | 2 +- objects/obj_player_sidescroller/Create_0.gml | 2 +- scripts/stanncam/stanncam.gml | 32 ++++++++++++-------- stanncam.yyp | 2 +- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/objects/obj_player/Create_0.gml b/objects/obj_player/Create_0.gml index 0ed4146..88a4750 100644 --- a/objects/obj_player/Create_0.gml +++ b/objects/obj_player/Create_0.gml @@ -2,7 +2,7 @@ hspd = 0; vspd = 0; -spd = 1.5; +spd = 1.17; anim_spd = sprite_get_speed(spr_player_moving); diff --git a/objects/obj_player_sidescroller/Create_0.gml b/objects/obj_player_sidescroller/Create_0.gml index 7652cc0..55aeb13 100644 --- a/objects/obj_player_sidescroller/Create_0.gml +++ b/objects/obj_player_sidescroller/Create_0.gml @@ -4,7 +4,7 @@ hinput = 0; hspd = 0; vspd = 0; acc = 0.4; -top_spd = 6; +top_spd = 3.07; //arbitrary decimal number to check non integer tracking grounded = false; jump_count = 0; diff --git a/scripts/stanncam/stanncam.gml b/scripts/stanncam/stanncam.gml index f38d008..e856385 100644 --- a/scripts/stanncam/stanncam.gml +++ b/scripts/stanncam/stanncam.gml @@ -191,6 +191,12 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf y = __yTo; } } + + if(!smooth_draw){ + x = round(x); + y = round(y); + } + #endregion #region zone constrain @@ -920,8 +926,16 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf __constrain_offset_y = 0; for (var i = 0; i < array_length(__zone_lists_strength); i++) { - __constrain_offset_x += _constrain_offset_x[i] * __zone_lists_strength[i]; - __constrain_offset_y += _constrain_offset_y[i] * __zone_lists_strength[i]; + var _offset_x = _constrain_offset_x[i] * __zone_lists_strength[i]; + var _offset_y = _constrain_offset_y[i] * __zone_lists_strength[i]; + + //with smooth draw on, it rounds the constraint transition + if(!smooth_draw && __zone_lists_strength[i] < 0.999){ + _offset_x = round(_offset_x); + _offset_y = round(_offset_y); + } + __constrain_offset_x += _offset_x; + __constrain_offset_y += _offset_y; } if(room_constrain){ @@ -963,12 +977,6 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf #endregion - //when smooth draw is off, the fractions are applied directly on the camera and not in draw step - if(!smooth_draw){ - _new_x+=x_frac + __constrain_frac_x; - _new_y+=y_frac + __constrain_frac_y; - } - camera_set_view_pos(__camera, _new_x, _new_y); } #endregion @@ -1150,12 +1158,12 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf var _display_scale_x = __obj_stanncam_manager.__display_scale_x; var _display_scale_y = __obj_stanncam_manager.__display_scale_y; - var _x_frac = 0; - var _y_frac = 0; + var _x_frac = __constrain_frac_x; + var _y_frac = __constrain_frac_y; if(smooth_draw){ - _x_frac = x_frac + __constrain_frac_x; - _y_frac = y_frac + __constrain_frac_y; + _x_frac += x_frac// + __constrain_frac_x; + _y_frac += y_frac// + __constrain_frac_y; } var _zoom = __get_zoom(); diff --git a/stanncam.yyp b/stanncam.yyp index 623c79c..3330ed6 100644 --- a/stanncam.yyp +++ b/stanncam.yyp @@ -112,9 +112,9 @@ "resourceVersion":"2.0", "RoomOrderNodes":[ {"roomId":{"name":"rm_init","path":"rooms/rm_init/rm_init.yy",},}, + {"roomId":{"name":"rm_test","path":"rooms/rm_test/rm_test.yy",},}, {"roomId":{"name":"rm_sidescroller","path":"rooms/rm_sidescroller/rm_sidescroller.yy",},}, {"roomId":{"name":"rm_pixel_grid","path":"rooms/rm_pixel_grid/rm_pixel_grid.yy",},}, - {"roomId":{"name":"rm_test","path":"rooms/rm_test/rm_test.yy",},}, ], "templateType":null, "TextureGroups":[ From 75f438f4fc064b004f329d2c32f8a005ea7111eb Mon Sep 17 00:00:00 2001 From: Jack Conradsen Date: Wed, 4 Mar 2026 21:54:33 +0100 Subject: [PATCH 02/19] fixed weird twitching and improved constraint zone code --- objects/__obj_stanncam_manager/Create_0.gml | 2 +- objects/__obj_stanncam_manager/Other_4.gml | 11 +++- objects/obj_camera/Draw_64.gml | 4 +- objects/obj_player/Create_0.gml | 2 +- rooms/rm_test/rm_test.yy | 2 +- scripts/stanncam/stanncam.gml | 57 ++++++++++++------- scripts/stanncam_confiig/stanncam_confiig.gml | 5 ++ scripts/stanncam_confiig/stanncam_confiig.yy | 13 +++++ scripts/stanncam_macros/stanncam_macros.gml | 3 +- stanncam.resource_order | 1 + stanncam.yyp | 1 + 11 files changed, 73 insertions(+), 28 deletions(-) create mode 100644 scripts/stanncam_confiig/stanncam_confiig.gml create mode 100644 scripts/stanncam_confiig/stanncam_confiig.yy diff --git a/objects/__obj_stanncam_manager/Create_0.gml b/objects/__obj_stanncam_manager/Create_0.gml index 7f55091..0e21d7b 100644 --- a/objects/__obj_stanncam_manager/Create_0.gml +++ b/objects/__obj_stanncam_manager/Create_0.gml @@ -18,4 +18,4 @@ draw_zones = false; __gui_res_w = 1; __gui_res_h = 1; __gui_x_scale = 1; -__gui_y_scale = 1; +__gui_y_scale = 1; \ No newline at end of file diff --git a/objects/__obj_stanncam_manager/Other_4.gml b/objects/__obj_stanncam_manager/Other_4.gml index f5af787..5f016cb 100644 --- a/objects/__obj_stanncam_manager/Other_4.gml +++ b/objects/__obj_stanncam_manager/Other_4.gml @@ -4,10 +4,19 @@ for (var i = 0; i < _len; ++i){ var _cam = global.stanncams[i]; if(_cam == -1) continue; _cam.__check_viewports(); + _cam.__step(); //if following something, snap the camera to it on room start - if(instance_exists(_cam.follow)){ + if(STANNCAM_CONFIG_SNAP_TO_FOLLOW_ON_ROOM_START && instance_exists(_cam.follow)){ _cam.move(_cam.follow.x, _cam.follow.y, 0); + + if(STANNCAM_CONFIG_SNAP_TO_ZONE_ON_ROOM_START){ + var _list_strength_length = array_length(_cam.__zone_lists_strength); + if (_list_strength_length > 0){ + _cam.__zone_lists_strength[_list_strength_length-1] = 1; + } + } + } } diff --git a/objects/obj_camera/Draw_64.gml b/objects/obj_camera/Draw_64.gml index 4220969..2c00598 100644 --- a/objects/obj_camera/Draw_64.gml +++ b/objects/obj_camera/Draw_64.gml @@ -76,8 +76,8 @@ if(cam1.out_of_bounds(obj_player.x, obj_player.y, 8)){ } } else { //draws pointer over players head - var _arrow_x = cam1.room_to_gui_x(obj_player.x); - var _arrow_y = cam1.room_to_gui_y(obj_player.y); + var _arrow_x = cam1.room_to_gui_x(round(obj_player.x)); + var _arrow_y = cam1.room_to_gui_y(round(obj_player.y)); if(gui_hires){ draw_sprite_ext(spr_arrow, 1, _arrow_x, _arrow_y - 64, 0.5, 0.5, 180, -1, 1); } else { diff --git a/objects/obj_player/Create_0.gml b/objects/obj_player/Create_0.gml index 88a4750..b4961b0 100644 --- a/objects/obj_player/Create_0.gml +++ b/objects/obj_player/Create_0.gml @@ -2,7 +2,7 @@ hspd = 0; vspd = 0; -spd = 1.17; +spd = 1.172; anim_spd = sprite_get_speed(spr_player_moving); diff --git a/rooms/rm_test/rm_test.yy b/rooms/rm_test/rm_test.yy index 066e994..1f37556 100644 --- a/rooms/rm_test/rm_test.yy +++ b/rooms/rm_test/rm_test.yy @@ -18,7 +18,7 @@ {"$GMRInstanceLayer":"","%Name":"Instances","depth":0,"effectEnabled":true,"effectType":null,"gridX":16,"gridY":16,"hierarchyFrozen":false,"inheritLayerDepth":false,"inheritLayerSettings":false,"inheritSubLayers":true,"inheritVisibility":true,"instances":[ {"$GMRInstance":"v4","%Name":"inst_4BF294D5","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_4BF294D5","objectId":{"name":"obj_ball","path":"objects/obj_ball/obj_ball.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":112.0,"y":80.0,}, {"$GMRInstance":"v4","%Name":"inst_28868B2A","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_28868B2A","objectId":{"name":"obj_camera","path":"objects/obj_camera/obj_camera.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":16.0,"y":16.0,}, - {"$GMRInstance":"v4","%Name":"inst_BEB4411","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_BEB4411","objectId":{"name":"obj_player","path":"objects/obj_player/obj_player.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":336.0,"y":32.0,}, + {"$GMRInstance":"v4","%Name":"inst_BEB4411","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_BEB4411","objectId":{"name":"obj_player","path":"objects/obj_player/obj_player.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":192.0,"y":208.0,}, {"$GMRInstance":"v4","%Name":"inst_42FFF7AC","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_42FFF7AC","objectId":{"name":"obj_stanncam_zone","path":"objects/obj_stanncam_zone/obj_stanncam_zone.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":10.0,"scaleY":12.0,"x":48.0,"y":32.0,}, {"$GMRInstance":"v4","%Name":"inst_3E1AFC53","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_3E1AFC53","objectId":{"name":"obj_player2","path":"objects/obj_player2/obj_player2.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":144.0,"y":128.0,}, {"$GMRInstance":"v4","%Name":"inst_451D11CD","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_451D11CD","objectId":{"name":"obj_tv","path":"objects/obj_tv/obj_tv.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":320.0,"y":48.0,}, diff --git a/scripts/stanncam/stanncam.gml b/scripts/stanncam/stanncam.gml index e856385..ceb4c80 100644 --- a/scripts/stanncam/stanncam.gml +++ b/scripts/stanncam/stanncam.gml @@ -76,7 +76,7 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf //zone constrain - //last list added to array the active list of zones + //last list added to array is the active list of zones __zone_lists_max = 4; __zone_lists = [noone]; //noone means no list of zones, ie, not constrained @@ -794,9 +794,14 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf /// @description updates the view position /// @ignore static __update_view_pos = function(){ + + //offseting is whole numbers with smooth_draw off + var _offset_x = smooth_draw ? offset_x : round(offset_x); + var _offset_y = smooth_draw ? offset_y : round(offset_y); + //update camera view - var _new_x = x + offset_x - (width / 2) + __shake_x; - var _new_y = y + offset_y - (height / 2) + __shake_y; + var _new_x = x + _offset_x - (width / 2) + __shake_x; + var _new_y = y + _offset_y - (height / 2) + __shake_y; var _zoom_whole = ceil(zoom_amount - 1); _new_x -= (width / 2) * _zoom_whole; @@ -828,10 +833,10 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf var _view_top = view_to_room_y(0) + 1; var _view_bottom = view_to_room_y(height) + 1; - _view_left += offset_x; - _view_right += offset_x; - _view_top += offset_y; - _view_bottom += offset_y; + _view_left += _offset_x; + _view_right += _offset_x; + _view_top += _offset_y; + _view_bottom += _offset_y; //zone constricting for (var l = 0; l < array_length(__zone_lists); l++) { @@ -880,7 +885,7 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf var _zone_width = (_zone_right - _zone_left); if((_view_right - _view_left) > _zone_width){ var _middle = ((_zone_left + _zone_right) / 2) - 1; - _constrain_offset_x[l] = _middle - x - offset_x; + _constrain_offset_x[l] = _middle - x - _offset_x; _zone_center_h = true; } } @@ -904,7 +909,7 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf var _zone_height = (_zone_bottom - _zone_top); if((_view_bottom - _view_top) > _zone_height){ var _middle = ((_zone_top + _zone_bottom) / 2) - 1; - _constrain_offset_y[l] = _middle - y - offset_y; + _constrain_offset_y[l] = _middle - y - _offset_y; _zone_center_v = true; } } @@ -926,11 +931,17 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf __constrain_offset_y = 0; for (var i = 0; i < array_length(__zone_lists_strength); i++) { - var _offset_x = _constrain_offset_x[i] * __zone_lists_strength[i]; - var _offset_y = _constrain_offset_y[i] * __zone_lists_strength[i]; + var _strength = __zone_lists_strength[i]; //with smooth draw on, it rounds the constraint transition - if(!smooth_draw && __zone_lists_strength[i] < 0.999){ + if(!smooth_draw){ + _strength = floor(_strength / 0.01 + 0.99) * 0.01; + } + + var _offset_x = _constrain_offset_x[i] * _strength; + var _offset_y = _constrain_offset_y[i] * _strength; + + if(!smooth_draw && _strength != 1){ _offset_x = round(_offset_x); _offset_y = round(_offset_y); } @@ -977,6 +988,9 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf #endregion + show_debug_message(_new_x); + show_debug_message(_new_y); + camera_set_view_pos(__camera, _new_x, _new_y); } #endregion @@ -994,8 +1008,11 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf var _pre_color = draw_get_color(); - var _x_offset = -offset_x - __constrain_offset_x; - var _y_offset = -offset_y - __constrain_offset_y; + var _x_offset = smooth_draw ? -offset_x : -round(offset_x); + var _y_offset = smooth_draw ? -offset_y : -round(offset_y); + + _x_offset -= __constrain_offset_x; + _y_offset -= __constrain_offset_y; var _zoom_whole = ceil(zoom_amount - 1); _x_offset += (width / 2) * _zoom_whole; @@ -1118,12 +1135,12 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf surface_reset_target(); - var _x_frac = 0; - var _y_frac = 0; + var _x_frac = __constrain_frac_x; + var _y_frac = __constrain_frac_y; if(smooth_draw){ - _x_frac = x_frac + __constrain_frac_x; - _y_frac = y_frac + __constrain_frac_y; + _x_frac += x_frac; + _y_frac += y_frac; } draw_surf(__surface_special, _x, _y, _scale_x, _scale_y, -_x_frac, -_y_frac, _surf_width, _surf_height); @@ -1162,8 +1179,8 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf var _y_frac = __constrain_frac_y; if(smooth_draw){ - _x_frac += x_frac// + __constrain_frac_x; - _y_frac += y_frac// + __constrain_frac_y; + _x_frac += x_frac; + _y_frac += y_frac; } var _zoom = __get_zoom(); diff --git a/scripts/stanncam_confiig/stanncam_confiig.gml b/scripts/stanncam_confiig/stanncam_confiig.gml new file mode 100644 index 0000000..92a670d --- /dev/null +++ b/scripts/stanncam_confiig/stanncam_confiig.gml @@ -0,0 +1,5 @@ +///STANNcam config macros, to change certain global behavior for all cameras +/// + +#macro STANNCAM_CONFIG_SNAP_TO_FOLLOW_ON_ROOM_START true //if a followed object is active at the start of a room, should the camera be snapped to it? +#macro STANNCAM_CONFIG_SNAP_TO_ZONE_ON_ROOM_START true //if a followed object is within a constrain zone at start of room, should thee camera be snapped to it? \ No newline at end of file diff --git a/scripts/stanncam_confiig/stanncam_confiig.yy b/scripts/stanncam_confiig/stanncam_confiig.yy new file mode 100644 index 0000000..4b34176 --- /dev/null +++ b/scripts/stanncam_confiig/stanncam_confiig.yy @@ -0,0 +1,13 @@ +{ + "$GMScript":"v1", + "%Name":"stanncam_confiig", + "isCompatibility":false, + "isDnD":false, + "name":"stanncam_confiig", + "parent":{ + "name":"STANNcam", + "path":"folders/STANNcam.yy", + }, + "resourceType":"GMScript", + "resourceVersion":"2.0", +} \ No newline at end of file diff --git a/scripts/stanncam_macros/stanncam_macros.gml b/scripts/stanncam_macros/stanncam_macros.gml index 00b140e..db65ab0 100644 --- a/scripts/stanncam_macros/stanncam_macros.gml +++ b/scripts/stanncam_macros/stanncam_macros.gml @@ -1,3 +1,2 @@ -#macro STANNCAM_VERSION "2.4.0" - +#macro STANNCAM_VERSION "2.4.2" show_debug_message("Using STANNcam version " + STANNCAM_VERSION); diff --git a/stanncam.resource_order b/stanncam.resource_order index 52b703b..bfce39b 100644 --- a/stanncam.resource_order +++ b/stanncam.resource_order @@ -10,6 +10,7 @@ {"name":"obj_stanncam_zone_blank","order":5,"path":"objects/obj_stanncam_zone_blank/obj_stanncam_zone_blank.yy",}, {"name":"obj_stanncam_zone_corner","order":3,"path":"objects/obj_stanncam_zone_corner/obj_stanncam_zone_corner.yy",}, {"name":"obj_stanncam_zone_u","order":4,"path":"objects/obj_stanncam_zone_u/obj_stanncam_zone_u.yy",}, + {"name":"stanncam_confiig","order":6,"path":"scripts/stanncam_confiig/stanncam_confiig.yy",}, {"name":"spr_stanncam_zone_1side","order":1,"path":"sprites/spr_stanncam_zone_1side/spr_stanncam_zone_1side.yy",}, {"name":"spr_stanncam_zone_2side","order":2,"path":"sprites/spr_stanncam_zone_2side/spr_stanncam_zone_2side.yy",}, {"name":"spr_stanncam_zone_connector","order":5,"path":"sprites/spr_stanncam_zone_connector/spr_stanncam_zone_connector.yy",}, diff --git a/stanncam.yyp b/stanncam.yyp index 3330ed6..5a9bdcf 100644 --- a/stanncam.yyp +++ b/stanncam.yyp @@ -70,6 +70,7 @@ {"id":{"name":"draw_text_outline","path":"scripts/draw_text_outline/draw_text_outline.yy",},}, {"id":{"name":"macros","path":"scripts/macros/macros.yy",},}, {"id":{"name":"stanncam_animcurve","path":"scripts/stanncam_animcurve/stanncam_animcurve.yy",},}, + {"id":{"name":"stanncam_confiig","path":"scripts/stanncam_confiig/stanncam_confiig.yy",},}, {"id":{"name":"stanncam_macros","path":"scripts/stanncam_macros/stanncam_macros.yy",},}, {"id":{"name":"stanncam_manager","path":"scripts/stanncam_manager/stanncam_manager.yy",},}, {"id":{"name":"stanncam_resolution_presets","path":"scripts/stanncam_resolution_presets/stanncam_resolution_presets.yy",},}, From fa483d08d69be540c9eeecafae6c593b07243df9 Mon Sep 17 00:00:00 2001 From: Jack Conradsen Date: Wed, 4 Mar 2026 21:55:08 +0100 Subject: [PATCH 03/19] changed version nr --- scripts/stanncam_macros/stanncam_macros.gml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/stanncam_macros/stanncam_macros.gml b/scripts/stanncam_macros/stanncam_macros.gml index db65ab0..a45a5f4 100644 --- a/scripts/stanncam_macros/stanncam_macros.gml +++ b/scripts/stanncam_macros/stanncam_macros.gml @@ -1,2 +1,2 @@ -#macro STANNCAM_VERSION "2.4.2" +#macro STANNCAM_VERSION "2.4.1" show_debug_message("Using STANNcam version " + STANNCAM_VERSION); From 2257fe416810a3ab7b5a1baa2e35ed150e9818aa Mon Sep 17 00:00:00 2001 From: Jack Conradsen Date: Wed, 4 Mar 2026 21:56:50 +0100 Subject: [PATCH 04/19] rename config file --- .../stanncam_config.gml} | 0 .../stanncam_config.yy} | 4 ++-- stanncam.resource_order | 2 +- stanncam.yyp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename scripts/{stanncam_confiig/stanncam_confiig.gml => stanncam_config/stanncam_config.gml} (100%) rename scripts/{stanncam_confiig/stanncam_confiig.yy => stanncam_config/stanncam_config.yy} (77%) diff --git a/scripts/stanncam_confiig/stanncam_confiig.gml b/scripts/stanncam_config/stanncam_config.gml similarity index 100% rename from scripts/stanncam_confiig/stanncam_confiig.gml rename to scripts/stanncam_config/stanncam_config.gml diff --git a/scripts/stanncam_confiig/stanncam_confiig.yy b/scripts/stanncam_config/stanncam_config.yy similarity index 77% rename from scripts/stanncam_confiig/stanncam_confiig.yy rename to scripts/stanncam_config/stanncam_config.yy index 4b34176..cf0412a 100644 --- a/scripts/stanncam_confiig/stanncam_confiig.yy +++ b/scripts/stanncam_config/stanncam_config.yy @@ -1,9 +1,9 @@ { "$GMScript":"v1", - "%Name":"stanncam_confiig", + "%Name":"stanncam_config", "isCompatibility":false, "isDnD":false, - "name":"stanncam_confiig", + "name":"stanncam_config", "parent":{ "name":"STANNcam", "path":"folders/STANNcam.yy", diff --git a/stanncam.resource_order b/stanncam.resource_order index bfce39b..4152403 100644 --- a/stanncam.resource_order +++ b/stanncam.resource_order @@ -10,7 +10,7 @@ {"name":"obj_stanncam_zone_blank","order":5,"path":"objects/obj_stanncam_zone_blank/obj_stanncam_zone_blank.yy",}, {"name":"obj_stanncam_zone_corner","order":3,"path":"objects/obj_stanncam_zone_corner/obj_stanncam_zone_corner.yy",}, {"name":"obj_stanncam_zone_u","order":4,"path":"objects/obj_stanncam_zone_u/obj_stanncam_zone_u.yy",}, - {"name":"stanncam_confiig","order":6,"path":"scripts/stanncam_confiig/stanncam_confiig.yy",}, + {"name":"stanncam_config","order":6,"path":"scripts/stanncam_config/stanncam_config.yy",}, {"name":"spr_stanncam_zone_1side","order":1,"path":"sprites/spr_stanncam_zone_1side/spr_stanncam_zone_1side.yy",}, {"name":"spr_stanncam_zone_2side","order":2,"path":"sprites/spr_stanncam_zone_2side/spr_stanncam_zone_2side.yy",}, {"name":"spr_stanncam_zone_connector","order":5,"path":"sprites/spr_stanncam_zone_connector/spr_stanncam_zone_connector.yy",}, diff --git a/stanncam.yyp b/stanncam.yyp index 5a9bdcf..150cd6c 100644 --- a/stanncam.yyp +++ b/stanncam.yyp @@ -70,7 +70,7 @@ {"id":{"name":"draw_text_outline","path":"scripts/draw_text_outline/draw_text_outline.yy",},}, {"id":{"name":"macros","path":"scripts/macros/macros.yy",},}, {"id":{"name":"stanncam_animcurve","path":"scripts/stanncam_animcurve/stanncam_animcurve.yy",},}, - {"id":{"name":"stanncam_confiig","path":"scripts/stanncam_confiig/stanncam_confiig.yy",},}, + {"id":{"name":"stanncam_config","path":"scripts/stanncam_config/stanncam_config.yy",},}, {"id":{"name":"stanncam_macros","path":"scripts/stanncam_macros/stanncam_macros.yy",},}, {"id":{"name":"stanncam_manager","path":"scripts/stanncam_manager/stanncam_manager.yy",},}, {"id":{"name":"stanncam_resolution_presets","path":"scripts/stanncam_resolution_presets/stanncam_resolution_presets.yy",},}, From e4b07e5fd047c732d9c6cf3d0e9a916d639b7276 Mon Sep 17 00:00:00 2001 From: Jack Conradsen Date: Wed, 4 Mar 2026 22:03:54 +0100 Subject: [PATCH 05/19] changed comments, and removed debug_message --- scripts/stanncam/stanncam.gml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/scripts/stanncam/stanncam.gml b/scripts/stanncam/stanncam.gml index ceb4c80..a4d1190 100644 --- a/scripts/stanncam/stanncam.gml +++ b/scripts/stanncam/stanncam.gml @@ -933,14 +933,15 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf for (var i = 0; i < array_length(__zone_lists_strength); i++) { var _strength = __zone_lists_strength[i]; - //with smooth draw on, it rounds the constraint transition + //with smooth draw off, it rounds the constraint transition if(!smooth_draw){ _strength = floor(_strength / 0.01 + 0.99) * 0.01; } var _offset_x = _constrain_offset_x[i] * _strength; var _offset_y = _constrain_offset_y[i] * _strength; - + + //when strength is 1, constraint fractions are present regardles of smooth_draw, so the constraints look correct at all zoom levels if(!smooth_draw && _strength != 1){ _offset_x = round(_offset_x); _offset_y = round(_offset_y); @@ -988,9 +989,6 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf #endregion - show_debug_message(_new_x); - show_debug_message(_new_y); - camera_set_view_pos(__camera, _new_x, _new_y); } #endregion From 32b456b1d8a5d96723e8211068742211969dcfea Mon Sep 17 00:00:00 2001 From: Jack Conradsen Date: Thu, 26 Mar 2026 17:37:21 +0100 Subject: [PATCH 06/19] fix zoom rounding error --- scripts/stanncam/stanncam.gml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/stanncam/stanncam.gml b/scripts/stanncam/stanncam.gml index f38d008..bafd64a 100644 --- a/scripts/stanncam/stanncam.gml +++ b/scripts/stanncam/stanncam.gml @@ -466,9 +466,10 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf /// @param {Real} [_duration=0] static zoom = function(_zoom, _duration=0){ if(_duration == 0){ //if duration is 0 the view is updated immediately - zoom_amount = _zoom; + zoom_amount = floor((_zoom / 0.001) + 0.9999) * 0.001; if(!get_paused()){ + __update_view_pos(); __update_view_size(); } } else { From b765c27c2de5da2cdf27ba0933c1895f733185f9 Mon Sep 17 00:00:00 2001 From: Jack Conradsen Date: Thu, 26 Mar 2026 17:48:30 +0100 Subject: [PATCH 07/19] options windows --- options/windows/options_windows.yy | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/options/windows/options_windows.yy b/options/windows/options_windows.yy index 473c981..ac5a69d 100644 --- a/options/windows/options_windows.yy +++ b/options/windows/options_windows.yy @@ -1,5 +1,5 @@ { - "$GMWindowsOptions":"v1", + "$GMWindowsOptions":"v2", "%Name":"Windows", "name":"Windows", "option_windows_allow_fullscreen_switching":false, @@ -29,6 +29,7 @@ "option_windows_start_fullscreen":false, "option_windows_steam_use_alternative_launcher":false, "option_windows_texture_page":"2048x2048", + "option_windows_use_raw_mouse":false, "option_windows_use_splash":false, "option_windows_version":"2.3.0.0", "option_windows_vsync":false, From 9d27a264087e8d820652df6a64c065a3c3e8c46a Mon Sep 17 00:00:00 2001 From: Jack Conradsen Date: Thu, 26 Mar 2026 18:02:28 +0100 Subject: [PATCH 08/19] ide --- rooms/rm_test/rm_test.yy | 8 +++++++- stanncam.yyp | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/rooms/rm_test/rm_test.yy b/rooms/rm_test/rm_test.yy index 1f37556..37f33f5 100644 --- a/rooms/rm_test/rm_test.yy +++ b/rooms/rm_test/rm_test.yy @@ -12,6 +12,9 @@ {"name":"inst_42FFF7AC","path":"rooms/rm_test/rm_test.yy",}, {"name":"inst_3E1AFC53","path":"rooms/rm_test/rm_test.yy",}, {"name":"inst_451D11CD","path":"rooms/rm_test/rm_test.yy",}, + {"name":"inst_569C41BC","path":"rooms/rm_test/rm_test.yy",}, + {"name":"inst_3B2E059F","path":"rooms/rm_test/rm_test.yy",}, + {"name":"inst_43E5C260","path":"rooms/rm_test/rm_test.yy",}, ], "isDnd":false, "layers":[ @@ -19,9 +22,12 @@ {"$GMRInstance":"v4","%Name":"inst_4BF294D5","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_4BF294D5","objectId":{"name":"obj_ball","path":"objects/obj_ball/obj_ball.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":112.0,"y":80.0,}, {"$GMRInstance":"v4","%Name":"inst_28868B2A","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_28868B2A","objectId":{"name":"obj_camera","path":"objects/obj_camera/obj_camera.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":16.0,"y":16.0,}, {"$GMRInstance":"v4","%Name":"inst_BEB4411","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_BEB4411","objectId":{"name":"obj_player","path":"objects/obj_player/obj_player.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":192.0,"y":208.0,}, - {"$GMRInstance":"v4","%Name":"inst_42FFF7AC","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_42FFF7AC","objectId":{"name":"obj_stanncam_zone","path":"objects/obj_stanncam_zone/obj_stanncam_zone.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":10.0,"scaleY":12.0,"x":48.0,"y":32.0,}, {"$GMRInstance":"v4","%Name":"inst_3E1AFC53","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_3E1AFC53","objectId":{"name":"obj_player2","path":"objects/obj_player2/obj_player2.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":144.0,"y":128.0,}, {"$GMRInstance":"v4","%Name":"inst_451D11CD","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_451D11CD","objectId":{"name":"obj_tv","path":"objects/obj_tv/obj_tv.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":320.0,"y":48.0,}, + {"$GMRInstance":"v4","%Name":"inst_42FFF7AC","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_42FFF7AC","objectId":{"name":"obj_stanncam_zone","path":"objects/obj_stanncam_zone/obj_stanncam_zone.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":10.0,"scaleY":12.0,"x":48.0,"y":32.0,}, + {"$GMRInstance":"v4","%Name":"inst_569C41BC","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_569C41BC","objectId":{"name":"obj_stanncam_zone","path":"objects/obj_stanncam_zone/obj_stanncam_zone.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":5.0,"scaleY":4.0,"x":240.0,"y":128.0,}, + {"$GMRInstance":"v4","%Name":"inst_3B2E059F","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_3B2E059F","objectId":{"name":"obj_stanncam_zone_2side","path":"objects/obj_stanncam_zone_2side/obj_stanncam_zone_2side.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":-90.0,"scaleX":4.0,"scaleY":3.0,"x":368.0,"y":128.0,}, + {"$GMRInstance":"v4","%Name":"inst_43E5C260","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_43E5C260","objectId":{"name":"obj_stanncam_zone_2side","path":"objects/obj_stanncam_zone_2side/obj_stanncam_zone_2side.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":-90.0,"scaleX":4.0,"scaleY":3.0,"x":416.0,"y":128.0,}, ],"layers":[],"name":"Instances","properties":[],"resourceType":"GMRInstanceLayer","resourceVersion":"2.0","userdefinedDepth":false,"visible":true,}, {"$GMRTileLayer":"","%Name":"Tiles_1","depth":100,"effectEnabled":true,"effectType":null,"gridX":16,"gridY":16,"hierarchyFrozen":false,"inheritLayerDepth":false,"inheritLayerSettings":false,"inheritSubLayers":true,"inheritVisibility":true,"layers":[],"name":"Tiles_1","properties":[],"resourceType":"GMRTileLayer","resourceVersion":"2.0","tiles":{"SerialiseHeight":8,"SerialiseWidth":14,"TileCompressedData":[-112,1,],"TileDataFormat":1,},"tilesetId":{"name":"TileSet1","path":"tilesets/TileSet1/TileSet1.yy",},"userdefinedDepth":false,"visible":true,"x":0,"y":0,}, {"$GMRBackgroundLayer":"","%Name":"Backgrounds_1","animationFPS":1.0,"animationSpeedType":1,"colour":4294967295,"depth":200,"effectEnabled":true,"effectType":null,"gridX":16,"gridY":16,"hierarchyFrozen":false,"hspeed":0.0,"htiled":true,"inheritLayerDepth":false,"inheritLayerSettings":false,"inheritSubLayers":true,"inheritVisibility":true,"layers":[],"name":"Backgrounds_1","properties":[],"resourceType":"GMRBackgroundLayer","resourceVersion":"2.0","spriteId":{"name":"spr_bg","path":"sprites/spr_bg/spr_bg.yy",},"stretch":false,"userdefinedAnimFPS":false,"userdefinedDepth":false,"visible":true,"vspeed":0.0,"vtiled":true,"x":0,"y":0,}, diff --git a/stanncam.yyp b/stanncam.yyp index 150cd6c..36a239f 100644 --- a/stanncam.yyp +++ b/stanncam.yyp @@ -35,7 +35,7 @@ "isEcma":false, "LibraryEmitters":[], "MetaData":{ - "IDEVersion":"2024.14.3.217", + "IDEVersion":"2024.14.4.221", }, "name":"stanncam", "resources":[ From 035016ba1480c05fe838843707aaca5e492082b5 Mon Sep 17 00:00:00 2001 From: Jack Conradsen Date: Thu, 26 Mar 2026 20:51:05 +0100 Subject: [PATCH 09/19] fixed zone constraint transition shake, added zone priority, and option for zones to start disabled --- objects/obj_stanncam_zone/Create_0.gml | 4 + .../obj_stanncam_zone/obj_stanncam_zone.yy | 2 + rooms/rm_test/rm_test.yy | 8 +- scripts/stanncam/stanncam.gml | 77 +++++++++++++------ scripts/stanncam_config/stanncam_config.gml | 6 +- 5 files changed, 64 insertions(+), 33 deletions(-) diff --git a/objects/obj_stanncam_zone/Create_0.gml b/objects/obj_stanncam_zone/Create_0.gml index 614979d..d3a9af1 100644 --- a/objects/obj_stanncam_zone/Create_0.gml +++ b/objects/obj_stanncam_zone/Create_0.gml @@ -16,3 +16,7 @@ if(instance_exists(included_zone1)) array_push(included_zones, included_zone1); if(instance_exists(included_zone2)) array_push(included_zones, included_zone2); if(instance_exists(included_zone3)) array_push(included_zones, included_zone3); if(instance_exists(included_zone4)) array_push(included_zones, included_zone4); + +if(start_disabled){ + instance_deactivate_object(id); +} \ No newline at end of file diff --git a/objects/obj_stanncam_zone/obj_stanncam_zone.yy b/objects/obj_stanncam_zone/obj_stanncam_zone.yy index 4eb2a44..cf82cbf 100644 --- a/objects/obj_stanncam_zone/obj_stanncam_zone.yy +++ b/objects/obj_stanncam_zone/obj_stanncam_zone.yy @@ -31,6 +31,8 @@ {"$GMObjectProperty":"v2","%Name":"included_zone2","filters":[],"listItems":[],"multiselect":false,"name":"included_zone2","rangeEnabled":false,"rangeMax":10.0,"rangeMin":0.0,"resourceType":"GMObjectProperty","resourceVersion":"2.0","value":"noone","varType":4,}, {"$GMObjectProperty":"v2","%Name":"included_zone3","filters":[],"listItems":[],"multiselect":false,"name":"included_zone3","rangeEnabled":false,"rangeMax":10.0,"rangeMin":0.0,"resourceType":"GMObjectProperty","resourceVersion":"2.0","value":"noone","varType":4,}, {"$GMObjectProperty":"v2","%Name":"included_zone4","filters":[],"listItems":[],"multiselect":false,"name":"included_zone4","rangeEnabled":false,"rangeMax":10.0,"rangeMin":0.0,"resourceType":"GMObjectProperty","resourceVersion":"2.0","value":"noone","varType":4,}, + {"$GMObjectProperty":"v2","%Name":"start_disabled","filters":[],"listItems":[],"multiselect":false,"name":"start_disabled","rangeEnabled":false,"rangeMax":10.0,"rangeMin":0.0,"resourceType":"GMObjectProperty","resourceVersion":"2.0","value":"False","varType":3,}, + {"$GMObjectProperty":"v2","%Name":"priority","filters":[],"listItems":[],"multiselect":false,"name":"priority","rangeEnabled":false,"rangeMax":10.0,"rangeMin":0.0,"resourceType":"GMObjectProperty","resourceVersion":"2.0","value":"0","varType":1,}, ], "resourceType":"GMObject", "resourceVersion":"2.0", diff --git a/rooms/rm_test/rm_test.yy b/rooms/rm_test/rm_test.yy index 37f33f5..b808b21 100644 --- a/rooms/rm_test/rm_test.yy +++ b/rooms/rm_test/rm_test.yy @@ -12,22 +12,16 @@ {"name":"inst_42FFF7AC","path":"rooms/rm_test/rm_test.yy",}, {"name":"inst_3E1AFC53","path":"rooms/rm_test/rm_test.yy",}, {"name":"inst_451D11CD","path":"rooms/rm_test/rm_test.yy",}, - {"name":"inst_569C41BC","path":"rooms/rm_test/rm_test.yy",}, - {"name":"inst_3B2E059F","path":"rooms/rm_test/rm_test.yy",}, - {"name":"inst_43E5C260","path":"rooms/rm_test/rm_test.yy",}, ], "isDnd":false, "layers":[ {"$GMRInstanceLayer":"","%Name":"Instances","depth":0,"effectEnabled":true,"effectType":null,"gridX":16,"gridY":16,"hierarchyFrozen":false,"inheritLayerDepth":false,"inheritLayerSettings":false,"inheritSubLayers":true,"inheritVisibility":true,"instances":[ {"$GMRInstance":"v4","%Name":"inst_4BF294D5","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_4BF294D5","objectId":{"name":"obj_ball","path":"objects/obj_ball/obj_ball.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":112.0,"y":80.0,}, {"$GMRInstance":"v4","%Name":"inst_28868B2A","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_28868B2A","objectId":{"name":"obj_camera","path":"objects/obj_camera/obj_camera.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":16.0,"y":16.0,}, - {"$GMRInstance":"v4","%Name":"inst_BEB4411","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_BEB4411","objectId":{"name":"obj_player","path":"objects/obj_player/obj_player.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":192.0,"y":208.0,}, {"$GMRInstance":"v4","%Name":"inst_3E1AFC53","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_3E1AFC53","objectId":{"name":"obj_player2","path":"objects/obj_player2/obj_player2.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":144.0,"y":128.0,}, {"$GMRInstance":"v4","%Name":"inst_451D11CD","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_451D11CD","objectId":{"name":"obj_tv","path":"objects/obj_tv/obj_tv.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":320.0,"y":48.0,}, {"$GMRInstance":"v4","%Name":"inst_42FFF7AC","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_42FFF7AC","objectId":{"name":"obj_stanncam_zone","path":"objects/obj_stanncam_zone/obj_stanncam_zone.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":10.0,"scaleY":12.0,"x":48.0,"y":32.0,}, - {"$GMRInstance":"v4","%Name":"inst_569C41BC","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_569C41BC","objectId":{"name":"obj_stanncam_zone","path":"objects/obj_stanncam_zone/obj_stanncam_zone.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":5.0,"scaleY":4.0,"x":240.0,"y":128.0,}, - {"$GMRInstance":"v4","%Name":"inst_3B2E059F","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_3B2E059F","objectId":{"name":"obj_stanncam_zone_2side","path":"objects/obj_stanncam_zone_2side/obj_stanncam_zone_2side.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":-90.0,"scaleX":4.0,"scaleY":3.0,"x":368.0,"y":128.0,}, - {"$GMRInstance":"v4","%Name":"inst_43E5C260","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_43E5C260","objectId":{"name":"obj_stanncam_zone_2side","path":"objects/obj_stanncam_zone_2side/obj_stanncam_zone_2side.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":-90.0,"scaleX":4.0,"scaleY":3.0,"x":416.0,"y":128.0,}, + {"$GMRInstance":"v4","%Name":"inst_BEB4411","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_BEB4411","objectId":{"name":"obj_player","path":"objects/obj_player/obj_player.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":272.0,"y":160.0,}, ],"layers":[],"name":"Instances","properties":[],"resourceType":"GMRInstanceLayer","resourceVersion":"2.0","userdefinedDepth":false,"visible":true,}, {"$GMRTileLayer":"","%Name":"Tiles_1","depth":100,"effectEnabled":true,"effectType":null,"gridX":16,"gridY":16,"hierarchyFrozen":false,"inheritLayerDepth":false,"inheritLayerSettings":false,"inheritSubLayers":true,"inheritVisibility":true,"layers":[],"name":"Tiles_1","properties":[],"resourceType":"GMRTileLayer","resourceVersion":"2.0","tiles":{"SerialiseHeight":8,"SerialiseWidth":14,"TileCompressedData":[-112,1,],"TileDataFormat":1,},"tilesetId":{"name":"TileSet1","path":"tilesets/TileSet1/TileSet1.yy",},"userdefinedDepth":false,"visible":true,"x":0,"y":0,}, {"$GMRBackgroundLayer":"","%Name":"Backgrounds_1","animationFPS":1.0,"animationSpeedType":1,"colour":4294967295,"depth":200,"effectEnabled":true,"effectType":null,"gridX":16,"gridY":16,"hierarchyFrozen":false,"hspeed":0.0,"htiled":true,"inheritLayerDepth":false,"inheritLayerSettings":false,"inheritSubLayers":true,"inheritVisibility":true,"layers":[],"name":"Backgrounds_1","properties":[],"resourceType":"GMRBackgroundLayer","resourceVersion":"2.0","spriteId":{"name":"spr_bg","path":"sprites/spr_bg/spr_bg.yy",},"stretch":false,"userdefinedAnimFPS":false,"userdefinedDepth":false,"visible":true,"vspeed":0.0,"vtiled":true,"x":0,"y":0,}, diff --git a/scripts/stanncam/stanncam.gml b/scripts/stanncam/stanncam.gml index 1af1540..357bdf4 100644 --- a/scripts/stanncam/stanncam.gml +++ b/scripts/stanncam/stanncam.gml @@ -204,11 +204,29 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf var _zone_list = ds_list_create(); var _zone_count = instance_position_list(follow.x, follow.y, obj_stanncam_zone, _zone_list, false); + + //only highest priority zones are evaluated + var highest_priority_ = -9999; + if(_zone_count != 0){ - + for (var j = 0; j < _zone_count; j++) { + var priority_ = _zone_list[| j].priority; + if ( priority_ > highest_priority_) highest_priority_ = priority_; + } + } + + if(_zone_count != 0){ //adds included zones to list for (var j = 0; j < _zone_count; j++) { var _zone = _zone_list[| j]; + + if(_zone.priority < highest_priority_){ + ds_list_delete(_zone_list,j); + _zone_count = ds_list_size(_zone_list); + j--; + continue; + } + var _included_zones_count = array_length(_zone.included_zones); if(_included_zones_count > 0){ @@ -260,8 +278,14 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf for (var k = 0; k <= _len; k++) { if(k != _len){ __zone_lists_strength[k] = lerp(__zone_lists_strength[k], 0, __constrain_spd); + + //snaps faster if smoothdraw is off + if(!STANNCAM_CONFIG_ZONE_CONSTRAIN_ALWAYS_SMOOTH && !smooth_draw && __zone_lists_strength[k] < 0.01) __zone_lists_strength[k] = 0; } else { __zone_lists_strength[k] = lerp(__zone_lists_strength[k], 1, __constrain_spd); + + //snaps faster if smoothdraw is off + if(!STANNCAM_CONFIG_ZONE_CONSTRAIN_ALWAYS_SMOOTH && !smooth_draw && __zone_lists_strength[k] > 0.99) __zone_lists_strength[k] = 1; } if(__zone_lists_strength[k] == 0){ @@ -934,19 +958,9 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf for (var i = 0; i < array_length(__zone_lists_strength); i++) { var _strength = __zone_lists_strength[i]; - //with smooth draw off, it rounds the constraint transition - if(!smooth_draw){ - _strength = floor(_strength / 0.01 + 0.99) * 0.01; - } - var _offset_x = _constrain_offset_x[i] * _strength; var _offset_y = _constrain_offset_y[i] * _strength; - - //when strength is 1, constraint fractions are present regardles of smooth_draw, so the constraints look correct at all zoom levels - if(!smooth_draw && _strength != 1){ - _offset_x = round(_offset_x); - _offset_y = round(_offset_y); - } + __constrain_offset_x += _offset_x; __constrain_offset_y += _offset_y; } @@ -969,18 +983,33 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf #region fractional constraint - __constrain_frac_x = frac(__constrain_offset_x); - if(__constrain_offset_x > 0){ - __constrain_offset_x = floor(__constrain_offset_x); - } else if (__constrain_offset_x < 0) { - __constrain_offset_x = ceil(__constrain_offset_x); - } - - __constrain_frac_y = frac(__constrain_offset_y); - if(__constrain_offset_y > 0){ - __constrain_offset_y = floor(__constrain_offset_y); - } else if (__constrain_offset_y < 0){ - __constrain_offset_y = ceil(__constrain_offset_y); + if(STANNCAM_CONFIG_ZONE_CONSTRAIN_ALWAYS_SMOOTH || smooth_draw){ //smooth drawing fractional seperation + __constrain_frac_x = frac(__constrain_offset_x); + if(__constrain_offset_x > 0){ + __constrain_offset_x = floor(__constrain_offset_x); + } else if (__constrain_offset_x < 0) { + __constrain_offset_x = ceil(__constrain_offset_x); + } + + __constrain_frac_y = frac(__constrain_offset_y); + if(__constrain_offset_y > 0){ + __constrain_offset_y = floor(__constrain_offset_y); + } else if (__constrain_offset_y < 0){ + __constrain_offset_y = ceil(__constrain_offset_y); + } + + } else { //smooth draw off, no fractions + if(__constrain_offset_x > 0){ + __constrain_offset_x = ceil(__constrain_offset_x); + } else if(__constrain_offset_x < 0){ + __constrain_offset_x = floor(__constrain_offset_x); + } + + if(__constrain_offset_y > 0){ + __constrain_offset_y = ceil(__constrain_offset_y); + } else if(__constrain_offset_y < 0){ + __constrain_offset_y = floor(__constrain_offset_y); + } } #endregion diff --git a/scripts/stanncam_config/stanncam_config.gml b/scripts/stanncam_config/stanncam_config.gml index 92a670d..b6366fd 100644 --- a/scripts/stanncam_config/stanncam_config.gml +++ b/scripts/stanncam_config/stanncam_config.gml @@ -1,5 +1,7 @@ ///STANNcam config macros, to change certain global behavior for all cameras /// -#macro STANNCAM_CONFIG_SNAP_TO_FOLLOW_ON_ROOM_START true //if a followed object is active at the start of a room, should the camera be snapped to it? -#macro STANNCAM_CONFIG_SNAP_TO_ZONE_ON_ROOM_START true //if a followed object is within a constrain zone at start of room, should thee camera be snapped to it? \ No newline at end of file +#macro STANNCAM_CONFIG_SNAP_TO_FOLLOW_ON_ROOM_START true //Default: true //if a followed object is active at the start of a room, should the camera be snapped to it? +#macro STANNCAM_CONFIG_SNAP_TO_ZONE_ON_ROOM_START true //Default: true //if a followed object is within a constrain zone at start of room, should thee camera be snapped to it? + +#macro STANNCAM_CONFIG_ZONE_CONSTRAIN_ALWAYS_SMOOTH false //Default: false //if true, the transition will be smooth regardless of smooth_draw \ No newline at end of file From 4725159418a73dd2200ba926dbb44f36739402d4 Mon Sep 17 00:00:00 2001 From: Jack Conradsen Date: Thu, 26 Mar 2026 21:18:02 +0100 Subject: [PATCH 10/19] replaced -9999 with -infinity --- scripts/stanncam/stanncam.gml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/stanncam/stanncam.gml b/scripts/stanncam/stanncam.gml index 357bdf4..b30ff2b 100644 --- a/scripts/stanncam/stanncam.gml +++ b/scripts/stanncam/stanncam.gml @@ -206,7 +206,7 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf var _zone_count = instance_position_list(follow.x, follow.y, obj_stanncam_zone, _zone_list, false); //only highest priority zones are evaluated - var highest_priority_ = -9999; + var highest_priority_ = -infinity; if(_zone_count != 0){ for (var j = 0; j < _zone_count; j++) { From d7292dbe1d1de5eb24b20806cc5a654738d22aab Mon Sep 17 00:00:00 2001 From: Jack Conradsen Date: Thu, 26 Mar 2026 21:21:04 +0100 Subject: [PATCH 11/19] updated version nr --- scripts/stanncam_macros/stanncam_macros.gml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/stanncam_macros/stanncam_macros.gml b/scripts/stanncam_macros/stanncam_macros.gml index a45a5f4..db65ab0 100644 --- a/scripts/stanncam_macros/stanncam_macros.gml +++ b/scripts/stanncam_macros/stanncam_macros.gml @@ -1,2 +1,2 @@ -#macro STANNCAM_VERSION "2.4.1" +#macro STANNCAM_VERSION "2.4.2" show_debug_message("Using STANNcam version " + STANNCAM_VERSION); From 64d143aa5d68533f34d1a6da9217b22187ec46e0 Mon Sep 17 00:00:00 2001 From: Jack Conradsen Date: Thu, 26 Mar 2026 21:31:44 +0100 Subject: [PATCH 12/19] replaced use_app_surface variable, with inline code it was only used in that one line --- scripts/stanncam/stanncam.gml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/scripts/stanncam/stanncam.gml b/scripts/stanncam/stanncam.gml index b30ff2b..56e5928 100644 --- a/scripts/stanncam/stanncam.gml +++ b/scripts/stanncam/stanncam.gml @@ -26,9 +26,6 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf #endregion #region variables - //the first camera uses the application surface - use_app_surface = cam_id == 0 - x = _x; y = _y; @@ -751,7 +748,7 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf /// @description checks if surface & surface_extra exists and else creates it /// @ignore static __check_surface = function(){ - if(use_app_surface){ + if(cam_id == 0){ //the first camera uses the application surface surface = application_surface; } else { if (!surface_exists(surface)){ From 0a9ededb2988bf7a065c6843e23523f03326ebb1 Mon Sep 17 00:00:00 2001 From: Jack Conradsen Date: Thu, 26 Mar 2026 23:52:14 +0100 Subject: [PATCH 13/19] rounding zone bbox values to fix rounding errors, and remove stanncam_debug_set_draw_zones in favor of config macro --- objects/__obj_stanncam_manager/Create_0.gml | 2 -- objects/obj_camera/Create_0.gml | 2 -- objects/obj_camera_sidescroller/Create_0.gml | 2 -- objects/obj_camera_sidescroller/Draw_64.gml | 2 +- objects/obj_camera_sidescroller/Step_0.gml | 3 +-- objects/obj_stanncam_zone/Create_0.gml | 6 +----- objects/obj_stanncam_zone/Draw_0.gml | 8 +++++++- objects/obj_stanncam_zone/obj_stanncam_zone.yy | 12 ++++++------ rooms/rm_test/rm_test.yy | 6 ++++-- scripts/stanncam/stanncam.gml | 17 +++++++++-------- scripts/stanncam_config/stanncam_config.gml | 4 +++- scripts/stanncam_manager/stanncam_manager.gml | 7 ------- 12 files changed, 32 insertions(+), 39 deletions(-) diff --git a/objects/__obj_stanncam_manager/Create_0.gml b/objects/__obj_stanncam_manager/Create_0.gml index 0e21d7b..43120c2 100644 --- a/objects/__obj_stanncam_manager/Create_0.gml +++ b/objects/__obj_stanncam_manager/Create_0.gml @@ -13,8 +13,6 @@ __display_scale_y = 1; __switching_window_mode = false; -draw_zones = false; - __gui_res_w = 1; __gui_res_h = 1; __gui_x_scale = 1; diff --git a/objects/obj_camera/Create_0.gml b/objects/obj_camera/Create_0.gml index 0717632..0d70e20 100644 --- a/objects/obj_camera/Create_0.gml +++ b/objects/obj_camera/Create_0.gml @@ -40,5 +40,3 @@ gui_resolutions = [ {w:640, h:360}, {w:1280, h:720}, ]; - -stanncam_debug_set_draw_zones(true); diff --git a/objects/obj_camera_sidescroller/Create_0.gml b/objects/obj_camera_sidescroller/Create_0.gml index 8d179f9..a56ead0 100644 --- a/objects/obj_camera_sidescroller/Create_0.gml +++ b/objects/obj_camera_sidescroller/Create_0.gml @@ -44,8 +44,6 @@ gui_hires_scale = 6; //how much bigger the hires font is than the pixel one lookahead = false; -draw_zones = false; - surface = -1; diff --git a/objects/obj_camera_sidescroller/Draw_64.gml b/objects/obj_camera_sidescroller/Draw_64.gml index bf4946b..b912845 100644 --- a/objects/obj_camera_sidescroller/Draw_64.gml +++ b/objects/obj_camera_sidescroller/Draw_64.gml @@ -26,7 +26,7 @@ draw_text_outline(1, _offset * 6, "[SHIFT] " + _debug, _outline_width, _precisio draw_text_outline(1, _offset * 7, "[F] camera shake", _outline_width, _precision); draw_text_outline(1, _offset * 8, "[P] toggle camera paused: " + (cam1.get_paused() ? "ON" : "OFF"), _outline_width, _precision); draw_text_outline(1, _offset * 9, "[Tab] camera speed " + string(cam1.spd), _outline_width, _precision); -draw_text_outline(1, _offset * 10, "[Z] toggle showing camera zones: " + (draw_zones ? "ON" : "OFF"), _outline_width, _precision); +draw_text_outline(1, _offset * 10, "[Z] toggle showing camera zones: " + (__obj_stanncam_manager.draw_zones ? "ON" : "OFF"), _outline_width, _precision); draw_text_outline(1, _offset * 11, "[1 & 2 & 3] to switch between example rooms", _outline_width, _precision); //draw current resolution text diff --git a/objects/obj_camera_sidescroller/Step_0.gml b/objects/obj_camera_sidescroller/Step_0.gml index 6feb814..bd5c2d4 100644 --- a/objects/obj_camera_sidescroller/Step_0.gml +++ b/objects/obj_camera_sidescroller/Step_0.gml @@ -71,8 +71,7 @@ if(keyboard_check_pressed(ord("P"))){ //toggle drawing camera zones if(keyboard_check_pressed(ord("Z"))){ - draw_zones = !draw_zones; - stanncam_debug_set_draw_zones(draw_zones); + __obj_stanncam_manager.draw_zones } //switch resolutions diff --git a/objects/obj_stanncam_zone/Create_0.gml b/objects/obj_stanncam_zone/Create_0.gml index d3a9af1..1489ed2 100644 --- a/objects/obj_stanncam_zone/Create_0.gml +++ b/objects/obj_stanncam_zone/Create_0.gml @@ -15,8 +15,4 @@ included_zones = []; if(instance_exists(included_zone1)) array_push(included_zones, included_zone1); if(instance_exists(included_zone2)) array_push(included_zones, included_zone2); if(instance_exists(included_zone3)) array_push(included_zones, included_zone3); -if(instance_exists(included_zone4)) array_push(included_zones, included_zone4); - -if(start_disabled){ - instance_deactivate_object(id); -} \ No newline at end of file +if(instance_exists(included_zone4)) array_push(included_zones, included_zone4); \ No newline at end of file diff --git a/objects/obj_stanncam_zone/Draw_0.gml b/objects/obj_stanncam_zone/Draw_0.gml index 3faf9b6..e59b1c3 100644 --- a/objects/obj_stanncam_zone/Draw_0.gml +++ b/objects/obj_stanncam_zone/Draw_0.gml @@ -1,3 +1,9 @@ if(__obj_stanncam_manager.draw_zones){ - draw_self(); + if(active){ + draw_self(); + } else { + image_alpha = 0.2; + draw_self(); + image_alpha = 1; + } } diff --git a/objects/obj_stanncam_zone/obj_stanncam_zone.yy b/objects/obj_stanncam_zone/obj_stanncam_zone.yy index cf82cbf..c73976d 100644 --- a/objects/obj_stanncam_zone/obj_stanncam_zone.yy +++ b/objects/obj_stanncam_zone/obj_stanncam_zone.yy @@ -27,12 +27,12 @@ "physicsShapePoints":[], "physicsStartAwake":true, "properties":[ - {"$GMObjectProperty":"v2","%Name":"included_zone1","filters":[],"listItems":[],"multiselect":false,"name":"included_zone1","rangeEnabled":false,"rangeMax":10.0,"rangeMin":0.0,"resourceType":"GMObjectProperty","resourceVersion":"2.0","value":"noone","varType":4,}, - {"$GMObjectProperty":"v2","%Name":"included_zone2","filters":[],"listItems":[],"multiselect":false,"name":"included_zone2","rangeEnabled":false,"rangeMax":10.0,"rangeMin":0.0,"resourceType":"GMObjectProperty","resourceVersion":"2.0","value":"noone","varType":4,}, - {"$GMObjectProperty":"v2","%Name":"included_zone3","filters":[],"listItems":[],"multiselect":false,"name":"included_zone3","rangeEnabled":false,"rangeMax":10.0,"rangeMin":0.0,"resourceType":"GMObjectProperty","resourceVersion":"2.0","value":"noone","varType":4,}, - {"$GMObjectProperty":"v2","%Name":"included_zone4","filters":[],"listItems":[],"multiselect":false,"name":"included_zone4","rangeEnabled":false,"rangeMax":10.0,"rangeMin":0.0,"resourceType":"GMObjectProperty","resourceVersion":"2.0","value":"noone","varType":4,}, - {"$GMObjectProperty":"v2","%Name":"start_disabled","filters":[],"listItems":[],"multiselect":false,"name":"start_disabled","rangeEnabled":false,"rangeMax":10.0,"rangeMin":0.0,"resourceType":"GMObjectProperty","resourceVersion":"2.0","value":"False","varType":3,}, - {"$GMObjectProperty":"v2","%Name":"priority","filters":[],"listItems":[],"multiselect":false,"name":"priority","rangeEnabled":false,"rangeMax":10.0,"rangeMin":0.0,"resourceType":"GMObjectProperty","resourceVersion":"2.0","value":"0","varType":1,}, + {"$GMObjectProperty":"v2","%Name":"included_zone1","filters":[],"listItems":[],"multiselect":false,"name":"included_zone1","rangeEnabled":false,"rangeMax":10.0,"rangeMin":0.0,"resourceType":"GMObjectProperty","resourceVersion":"2.0","value":"noone","varDescription":"When within this zone, the named zone will also be evaluated","varFriendlyName":"Included Zone 1","varType":4,}, + {"$GMObjectProperty":"v2","%Name":"included_zone2","filters":[],"listItems":[],"multiselect":false,"name":"included_zone2","rangeEnabled":false,"rangeMax":10.0,"rangeMin":0.0,"resourceType":"GMObjectProperty","resourceVersion":"2.0","value":"noone","varDescription":"When within this zone, the named zone will also be evaluated","varFriendlyName":"Included Zone 2","varType":4,}, + {"$GMObjectProperty":"v2","%Name":"included_zone3","filters":[],"listItems":[],"multiselect":false,"name":"included_zone3","rangeEnabled":false,"rangeMax":10.0,"rangeMin":0.0,"resourceType":"GMObjectProperty","resourceVersion":"2.0","value":"noone","varDescription":"When within this zone, the named zone will also be evaluated","varFriendlyName":"Included Zone 3","varType":4,}, + {"$GMObjectProperty":"v2","%Name":"included_zone4","filters":[],"listItems":[],"multiselect":false,"name":"included_zone4","rangeEnabled":false,"rangeMax":10.0,"rangeMin":0.0,"resourceType":"GMObjectProperty","resourceVersion":"2.0","value":"noone","varDescription":"When within this zone, the named zone will also be evaluated","varFriendlyName":"Included Zone 4","varType":4,}, + {"$GMObjectProperty":"v2","%Name":"active","filters":[],"listItems":[],"multiselect":false,"name":"active","rangeEnabled":false,"rangeMax":10.0,"rangeMin":0.0,"resourceType":"GMObjectProperty","resourceVersion":"2.0","value":"True","varDescription":"Wether zone should actively constrain, you can set whilst in-game by using the zones instance name","varFriendlyName":"Active","varType":3,}, + {"$GMObjectProperty":"v2","%Name":"priority","filters":[],"listItems":[],"multiselect":false,"name":"priority","rangeEnabled":false,"rangeMax":10.0,"rangeMin":0.0,"resourceType":"GMObjectProperty","resourceVersion":"2.0","value":"0","varDescription":"Only the zones with the highest priority will be evaluated, when colliding with multiple zones.","varFriendlyName":"Priority","varType":1,}, ], "resourceType":"GMObject", "resourceVersion":"2.0", diff --git a/rooms/rm_test/rm_test.yy b/rooms/rm_test/rm_test.yy index b808b21..fa417f8 100644 --- a/rooms/rm_test/rm_test.yy +++ b/rooms/rm_test/rm_test.yy @@ -9,9 +9,10 @@ {"name":"inst_28868B2A","path":"rooms/rm_test/rm_test.yy",}, {"name":"inst_4BF294D5","path":"rooms/rm_test/rm_test.yy",}, {"name":"inst_BEB4411","path":"rooms/rm_test/rm_test.yy",}, - {"name":"inst_42FFF7AC","path":"rooms/rm_test/rm_test.yy",}, {"name":"inst_3E1AFC53","path":"rooms/rm_test/rm_test.yy",}, {"name":"inst_451D11CD","path":"rooms/rm_test/rm_test.yy",}, + {"name":"inst_65338469","path":"rooms/rm_test/rm_test.yy",}, + {"name":"inst_44B1A3C0","path":"rooms/rm_test/rm_test.yy",}, ], "isDnd":false, "layers":[ @@ -20,8 +21,9 @@ {"$GMRInstance":"v4","%Name":"inst_28868B2A","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_28868B2A","objectId":{"name":"obj_camera","path":"objects/obj_camera/obj_camera.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":16.0,"y":16.0,}, {"$GMRInstance":"v4","%Name":"inst_3E1AFC53","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_3E1AFC53","objectId":{"name":"obj_player2","path":"objects/obj_player2/obj_player2.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":144.0,"y":128.0,}, {"$GMRInstance":"v4","%Name":"inst_451D11CD","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_451D11CD","objectId":{"name":"obj_tv","path":"objects/obj_tv/obj_tv.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":320.0,"y":48.0,}, - {"$GMRInstance":"v4","%Name":"inst_42FFF7AC","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_42FFF7AC","objectId":{"name":"obj_stanncam_zone","path":"objects/obj_stanncam_zone/obj_stanncam_zone.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":10.0,"scaleY":12.0,"x":48.0,"y":32.0,}, {"$GMRInstance":"v4","%Name":"inst_BEB4411","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_BEB4411","objectId":{"name":"obj_player","path":"objects/obj_player/obj_player.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":272.0,"y":160.0,}, + {"$GMRInstance":"v4","%Name":"inst_65338469","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_65338469","objectId":{"name":"obj_stanncam_zone_u","path":"objects/obj_stanncam_zone_u/obj_stanncam_zone_u.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":180.0,"scaleX":13.0,"scaleY":3.0,"x":224.0,"y":176.0,}, + {"$GMRInstance":"v4","%Name":"inst_44B1A3C0","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_44B1A3C0","objectId":{"name":"obj_stanncam_zone_u","path":"objects/obj_stanncam_zone_u/obj_stanncam_zone_u.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":14.0,"scaleY":3.0,"x":224.0,"y":128.0,}, ],"layers":[],"name":"Instances","properties":[],"resourceType":"GMRInstanceLayer","resourceVersion":"2.0","userdefinedDepth":false,"visible":true,}, {"$GMRTileLayer":"","%Name":"Tiles_1","depth":100,"effectEnabled":true,"effectType":null,"gridX":16,"gridY":16,"hierarchyFrozen":false,"inheritLayerDepth":false,"inheritLayerSettings":false,"inheritSubLayers":true,"inheritVisibility":true,"layers":[],"name":"Tiles_1","properties":[],"resourceType":"GMRTileLayer","resourceVersion":"2.0","tiles":{"SerialiseHeight":8,"SerialiseWidth":14,"TileCompressedData":[-112,1,],"TileDataFormat":1,},"tilesetId":{"name":"TileSet1","path":"tilesets/TileSet1/TileSet1.yy",},"userdefinedDepth":false,"visible":true,"x":0,"y":0,}, {"$GMRBackgroundLayer":"","%Name":"Backgrounds_1","animationFPS":1.0,"animationSpeedType":1,"colour":4294967295,"depth":200,"effectEnabled":true,"effectType":null,"gridX":16,"gridY":16,"hierarchyFrozen":false,"hspeed":0.0,"htiled":true,"inheritLayerDepth":false,"inheritLayerSettings":false,"inheritSubLayers":true,"inheritVisibility":true,"layers":[],"name":"Backgrounds_1","properties":[],"resourceType":"GMRBackgroundLayer","resourceVersion":"2.0","spriteId":{"name":"spr_bg","path":"sprites/spr_bg/spr_bg.yy",},"stretch":false,"userdefinedAnimFPS":false,"userdefinedDepth":false,"visible":true,"vspeed":0.0,"vtiled":true,"x":0,"y":0,}, diff --git a/scripts/stanncam/stanncam.gml b/scripts/stanncam/stanncam.gml index 56e5928..21fc70b 100644 --- a/scripts/stanncam/stanncam.gml +++ b/scripts/stanncam/stanncam.gml @@ -217,7 +217,8 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf for (var j = 0; j < _zone_count; j++) { var _zone = _zone_list[| j]; - if(_zone.priority < highest_priority_){ + //if not active, or of a lower priority of ones collided with, not evaluated + if(!_zone.active || _zone.priority < highest_priority_){ ds_list_delete(_zone_list,j); _zone_count = ds_list_size(_zone_list); j--; @@ -877,23 +878,23 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf var _zone = __zone_lists[l][| z]; if(_zone.left ){ // if dist from the zone edge to the center is shorter than previous it takes over - if(_zone_left == undefined || _zone.bbox_left < _zone_left){ - _zone_left = _zone.bbox_left; + if(_zone_left == undefined || round(_zone.bbox_left) < _zone_left){ + _zone_left = round(_zone.bbox_left); } } if(_zone.right){ if(_zone_right == undefined || _zone.bbox_right > _zone_right){ - _zone_right = _zone.bbox_right; + _zone_right = round(_zone.bbox_right); } } if(_zone.top){ - if(_zone_top == undefined || _zone.bbox_top < _zone_top){ - _zone_top = _zone.bbox_top; + if(_zone_top == undefined || round(_zone.bbox_top) < _zone_top){ + _zone_top = round(_zone.bbox_top); } } if(_zone.bottom){ - if(_zone_bottom == undefined || _zone.bbox_bottom > _zone_bottom){ - _zone_bottom = _zone.bbox_bottom; + if(_zone_bottom == undefined || round(_zone.bbox_bottom) > _zone_bottom){ + _zone_bottom = round(_zone.bbox_bottom); } } } diff --git a/scripts/stanncam_config/stanncam_config.gml b/scripts/stanncam_config/stanncam_config.gml index b6366fd..7f52797 100644 --- a/scripts/stanncam_config/stanncam_config.gml +++ b/scripts/stanncam_config/stanncam_config.gml @@ -4,4 +4,6 @@ #macro STANNCAM_CONFIG_SNAP_TO_FOLLOW_ON_ROOM_START true //Default: true //if a followed object is active at the start of a room, should the camera be snapped to it? #macro STANNCAM_CONFIG_SNAP_TO_ZONE_ON_ROOM_START true //Default: true //if a followed object is within a constrain zone at start of room, should thee camera be snapped to it? -#macro STANNCAM_CONFIG_ZONE_CONSTRAIN_ALWAYS_SMOOTH false //Default: false //if true, the transition will be smooth regardless of smooth_draw \ No newline at end of file +#macro STANNCAM_CONFIG_ZONE_CONSTRAIN_ALWAYS_SMOOTH false //Default: false //if true, the transition will be smooth regardless of smooth_draw + +#macro STANNCAM_CONFIG_DRAW_CAMERA_ZONES false //Default: __obj_stanncam_manager.draw_zones //set to whichever global variable you like to easily control if zones should be drawn \ No newline at end of file diff --git a/scripts/stanncam_manager/stanncam_manager.gml b/scripts/stanncam_manager/stanncam_manager.gml index 7633f72..f6811c5 100644 --- a/scripts/stanncam_manager/stanncam_manager.gml +++ b/scripts/stanncam_manager/stanncam_manager.gml @@ -353,13 +353,6 @@ function stanncam_get_preset_resolution_range(_start_i=0, _end_i=array_length(gl return _res_array; } -/// @function stanncam_debug_set_draw_zones -/// @description sets whether or not zones should be drawn in the room, for debugging -/// @param {Bool} _should_draw -function stanncam_debug_set_draw_zones(_should_draw){ - __obj_stanncam_manager.draw_zones = _should_draw; -} - /// @function stanncam_toggle_cameras_paused /// @description toggles camera's paused state function stanncam_toggle_cameras_paused(){ From ee7360308aaec6038663eeab222f804d90efe655 Mon Sep 17 00:00:00 2001 From: Jack Conradsen Date: Fri, 27 Mar 2026 00:09:23 +0100 Subject: [PATCH 14/19] added back in the set draw_zones_function back, but you can still overide the macro though --- objects/__obj_stanncam_manager/Create_0.gml | 4 +++- objects/obj_camera/Create_0.gml | 2 ++ objects/obj_camera_sidescroller/Step_0.gml | 2 +- scripts/stanncam_config/stanncam_config.gml | 2 +- scripts/stanncam_manager/stanncam_manager.gml | 7 +++++++ 5 files changed, 14 insertions(+), 3 deletions(-) diff --git a/objects/__obj_stanncam_manager/Create_0.gml b/objects/__obj_stanncam_manager/Create_0.gml index 43120c2..dc4629c 100644 --- a/objects/__obj_stanncam_manager/Create_0.gml +++ b/objects/__obj_stanncam_manager/Create_0.gml @@ -16,4 +16,6 @@ __switching_window_mode = false; __gui_res_w = 1; __gui_res_h = 1; __gui_x_scale = 1; -__gui_y_scale = 1; \ No newline at end of file +__gui_y_scale = 1; + +draw_zones = false; \ No newline at end of file diff --git a/objects/obj_camera/Create_0.gml b/objects/obj_camera/Create_0.gml index 0d70e20..d8bf3a1 100644 --- a/objects/obj_camera/Create_0.gml +++ b/objects/obj_camera/Create_0.gml @@ -40,3 +40,5 @@ gui_resolutions = [ {w:640, h:360}, {w:1280, h:720}, ]; + +stanncam_debug_set_draw_zones(true); \ No newline at end of file diff --git a/objects/obj_camera_sidescroller/Step_0.gml b/objects/obj_camera_sidescroller/Step_0.gml index bd5c2d4..14da208 100644 --- a/objects/obj_camera_sidescroller/Step_0.gml +++ b/objects/obj_camera_sidescroller/Step_0.gml @@ -71,7 +71,7 @@ if(keyboard_check_pressed(ord("P"))){ //toggle drawing camera zones if(keyboard_check_pressed(ord("Z"))){ - __obj_stanncam_manager.draw_zones + stanncam_debug_set_draw_zones(!__obj_stanncam_manager.draw_zones); } //switch resolutions diff --git a/scripts/stanncam_config/stanncam_config.gml b/scripts/stanncam_config/stanncam_config.gml index 7f52797..7a37db0 100644 --- a/scripts/stanncam_config/stanncam_config.gml +++ b/scripts/stanncam_config/stanncam_config.gml @@ -6,4 +6,4 @@ #macro STANNCAM_CONFIG_ZONE_CONSTRAIN_ALWAYS_SMOOTH false //Default: false //if true, the transition will be smooth regardless of smooth_draw -#macro STANNCAM_CONFIG_DRAW_CAMERA_ZONES false //Default: __obj_stanncam_manager.draw_zones //set to whichever global variable you like to easily control if zones should be drawn \ No newline at end of file +#macro STANNCAM_CONFIG_DRAW_CAMERA_ZONES __obj_stanncam_manager.draw_zones //Default: __obj_stanncam_manager.draw_zones //set to whichever global variable you like to easily control if zones should be drawn \ No newline at end of file diff --git a/scripts/stanncam_manager/stanncam_manager.gml b/scripts/stanncam_manager/stanncam_manager.gml index f6811c5..7633f72 100644 --- a/scripts/stanncam_manager/stanncam_manager.gml +++ b/scripts/stanncam_manager/stanncam_manager.gml @@ -353,6 +353,13 @@ function stanncam_get_preset_resolution_range(_start_i=0, _end_i=array_length(gl return _res_array; } +/// @function stanncam_debug_set_draw_zones +/// @description sets whether or not zones should be drawn in the room, for debugging +/// @param {Bool} _should_draw +function stanncam_debug_set_draw_zones(_should_draw){ + __obj_stanncam_manager.draw_zones = _should_draw; +} + /// @function stanncam_toggle_cameras_paused /// @description toggles camera's paused state function stanncam_toggle_cameras_paused(){ From 8528ecd9d49fd23b599da43d34b47f4730a1a9cc Mon Sep 17 00:00:00 2001 From: Jack Conradsen Date: Fri, 27 Mar 2026 18:10:21 +0100 Subject: [PATCH 15/19] fixed constrain zone transition twitch because of rounding errors --- rooms/rm_test/rm_test.yy | 6 +- scripts/stanncam/stanncam.gml | 70 +++++++++++---------- scripts/stanncam_config/stanncam_config.gml | 3 +- 3 files changed, 41 insertions(+), 38 deletions(-) diff --git a/rooms/rm_test/rm_test.yy b/rooms/rm_test/rm_test.yy index fa417f8..411efb4 100644 --- a/rooms/rm_test/rm_test.yy +++ b/rooms/rm_test/rm_test.yy @@ -11,8 +11,7 @@ {"name":"inst_BEB4411","path":"rooms/rm_test/rm_test.yy",}, {"name":"inst_3E1AFC53","path":"rooms/rm_test/rm_test.yy",}, {"name":"inst_451D11CD","path":"rooms/rm_test/rm_test.yy",}, - {"name":"inst_65338469","path":"rooms/rm_test/rm_test.yy",}, - {"name":"inst_44B1A3C0","path":"rooms/rm_test/rm_test.yy",}, + {"name":"inst_37B6078F","path":"rooms/rm_test/rm_test.yy",}, ], "isDnd":false, "layers":[ @@ -22,8 +21,7 @@ {"$GMRInstance":"v4","%Name":"inst_3E1AFC53","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_3E1AFC53","objectId":{"name":"obj_player2","path":"objects/obj_player2/obj_player2.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":144.0,"y":128.0,}, {"$GMRInstance":"v4","%Name":"inst_451D11CD","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_451D11CD","objectId":{"name":"obj_tv","path":"objects/obj_tv/obj_tv.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":320.0,"y":48.0,}, {"$GMRInstance":"v4","%Name":"inst_BEB4411","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_BEB4411","objectId":{"name":"obj_player","path":"objects/obj_player/obj_player.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":272.0,"y":160.0,}, - {"$GMRInstance":"v4","%Name":"inst_65338469","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_65338469","objectId":{"name":"obj_stanncam_zone_u","path":"objects/obj_stanncam_zone_u/obj_stanncam_zone_u.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":180.0,"scaleX":13.0,"scaleY":3.0,"x":224.0,"y":176.0,}, - {"$GMRInstance":"v4","%Name":"inst_44B1A3C0","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_44B1A3C0","objectId":{"name":"obj_stanncam_zone_u","path":"objects/obj_stanncam_zone_u/obj_stanncam_zone_u.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":14.0,"scaleY":3.0,"x":224.0,"y":128.0,}, + {"$GMRInstance":"v4","%Name":"inst_37B6078F","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_37B6078F","objectId":{"name":"obj_stanncam_zone","path":"objects/obj_stanncam_zone/obj_stanncam_zone.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":11.0,"scaleY":11.0,"x":32.0,"y":32.0,}, ],"layers":[],"name":"Instances","properties":[],"resourceType":"GMRInstanceLayer","resourceVersion":"2.0","userdefinedDepth":false,"visible":true,}, {"$GMRTileLayer":"","%Name":"Tiles_1","depth":100,"effectEnabled":true,"effectType":null,"gridX":16,"gridY":16,"hierarchyFrozen":false,"inheritLayerDepth":false,"inheritLayerSettings":false,"inheritSubLayers":true,"inheritVisibility":true,"layers":[],"name":"Tiles_1","properties":[],"resourceType":"GMRTileLayer","resourceVersion":"2.0","tiles":{"SerialiseHeight":8,"SerialiseWidth":14,"TileCompressedData":[-112,1,],"TileDataFormat":1,},"tilesetId":{"name":"TileSet1","path":"tilesets/TileSet1/TileSet1.yy",},"userdefinedDepth":false,"visible":true,"x":0,"y":0,}, {"$GMRBackgroundLayer":"","%Name":"Backgrounds_1","animationFPS":1.0,"animationSpeedType":1,"colour":4294967295,"depth":200,"effectEnabled":true,"effectType":null,"gridX":16,"gridY":16,"hierarchyFrozen":false,"hspeed":0.0,"htiled":true,"inheritLayerDepth":false,"inheritLayerSettings":false,"inheritSubLayers":true,"inheritVisibility":true,"layers":[],"name":"Backgrounds_1","properties":[],"resourceType":"GMRBackgroundLayer","resourceVersion":"2.0","spriteId":{"name":"spr_bg","path":"sprites/spr_bg/spr_bg.yy",},"stretch":false,"userdefinedAnimFPS":false,"userdefinedDepth":false,"visible":true,"vspeed":0.0,"vtiled":true,"x":0,"y":0,}, diff --git a/scripts/stanncam/stanncam.gml b/scripts/stanncam/stanncam.gml index 21fc70b..81e02e8 100644 --- a/scripts/stanncam/stanncam.gml +++ b/scripts/stanncam/stanncam.gml @@ -87,7 +87,7 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf __constrain_frac_x = 0; __constrain_frac_y = 0; - __constrain_spd = 0.1; + __constrain_spd = 0.15; paused = false; @@ -274,16 +274,28 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf var _len = array_length(__zone_lists_strength) - 1; for (var k = 0; k <= _len; k++) { - if(k != _len){ - __zone_lists_strength[k] = lerp(__zone_lists_strength[k], 0, __constrain_spd); + if(k == _len){ //last list_string fades to 1, all previous fades to 0 + __zone_lists_strength[k] = lerp(__zone_lists_strength[k], 1, __constrain_spd); //snaps faster if smoothdraw is off - if(!STANNCAM_CONFIG_ZONE_CONSTRAIN_ALWAYS_SMOOTH && !smooth_draw && __zone_lists_strength[k] < 0.01) __zone_lists_strength[k] = 0; + if( + !STANNCAM_CONFIG_ZONE_CONSTRAIN_ALWAYS_SMOOTH && + !smooth_draw && + __zone_lists_strength[k] > (1-STANNCAM_CONFIG_ZONE_CONSTRAIN_TRANSITION_SNAP_THRESHOLD) + ){ + __zone_lists_strength[k] = 1; + } } else { - __zone_lists_strength[k] = lerp(__zone_lists_strength[k], 1, __constrain_spd); + __zone_lists_strength[k] = lerp(__zone_lists_strength[k], 0, __constrain_spd); //snaps faster if smoothdraw is off - if(!STANNCAM_CONFIG_ZONE_CONSTRAIN_ALWAYS_SMOOTH && !smooth_draw && __zone_lists_strength[k] > 0.99) __zone_lists_strength[k] = 1; + if( + !STANNCAM_CONFIG_ZONE_CONSTRAIN_ALWAYS_SMOOTH && + !smooth_draw && + __zone_lists_strength[k] < STANNCAM_CONFIG_ZONE_CONSTRAIN_TRANSITION_SNAP_THRESHOLD + ){ + __zone_lists_strength[k] = 0; + } } if(__zone_lists_strength[k] == 0){ @@ -348,7 +360,6 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf zoom_amount = stanncam_animcurve(__t_zoom, __zoomStart, __zoomTo, __zoom_duration, anim_curve_zoom); __t_zoom = min(__t_zoom + 1, __zoom_duration); - if(__t_zoom >= __zoom_duration) { __zooming = false; zoom_amount = __zoomTo; @@ -952,6 +963,8 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf __constrain_offset_x = 0; __constrain_offset_y = 0; + __constrain_frac_x = 0; + __constrain_frac_y = 0; for (var i = 0; i < array_length(__zone_lists_strength); i++) { var _strength = __zone_lists_strength[i]; @@ -964,6 +977,7 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf } if(room_constrain){ + //Horizontal if((_view_right - _view_left) < room_width) { __constrain_offset_x = clamp(__constrain_offset_x, -_view_left, room_width - 1 - _view_right); @@ -979,35 +993,25 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf } } - #region fractional constraint + __constrain_offset_x = floor((__constrain_offset_x / 0.01) + 0.999) * 0.01; + __constrain_offset_y = floor((__constrain_offset_y / 0.01) + 0.999) * 0.01; + + #region fractional constraint - if(STANNCAM_CONFIG_ZONE_CONSTRAIN_ALWAYS_SMOOTH || smooth_draw){ //smooth drawing fractional seperation + if(STANNCAM_CONFIG_ZONE_CONSTRAIN_ALWAYS_SMOOTH || smooth_draw){ __constrain_frac_x = frac(__constrain_offset_x); - if(__constrain_offset_x > 0){ - __constrain_offset_x = floor(__constrain_offset_x); - } else if (__constrain_offset_x < 0) { - __constrain_offset_x = ceil(__constrain_offset_x); - } - __constrain_frac_y = frac(__constrain_offset_y); - if(__constrain_offset_y > 0){ - __constrain_offset_y = floor(__constrain_offset_y); - } else if (__constrain_offset_y < 0){ - __constrain_offset_y = ceil(__constrain_offset_y); - } - - } else { //smooth draw off, no fractions - if(__constrain_offset_x > 0){ - __constrain_offset_x = ceil(__constrain_offset_x); - } else if(__constrain_offset_x < 0){ - __constrain_offset_x = floor(__constrain_offset_x); - } - - if(__constrain_offset_y > 0){ - __constrain_offset_y = ceil(__constrain_offset_y); - } else if(__constrain_offset_y < 0){ - __constrain_offset_y = floor(__constrain_offset_y); - } + } + + if(__constrain_offset_x > 0){ + __constrain_offset_x = floor(__constrain_offset_x); + } else if (__constrain_offset_x < 0) { + __constrain_offset_x = ceil(__constrain_offset_x); + } + if(__constrain_offset_y > 0){ + __constrain_offset_y = floor(__constrain_offset_y); + } else if (__constrain_offset_y < 0){ + __constrain_offset_y = ceil(__constrain_offset_y); } #endregion diff --git a/scripts/stanncam_config/stanncam_config.gml b/scripts/stanncam_config/stanncam_config.gml index 7a37db0..c2d014d 100644 --- a/scripts/stanncam_config/stanncam_config.gml +++ b/scripts/stanncam_config/stanncam_config.gml @@ -1,9 +1,10 @@ ///STANNcam config macros, to change certain global behavior for all cameras -/// #macro STANNCAM_CONFIG_SNAP_TO_FOLLOW_ON_ROOM_START true //Default: true //if a followed object is active at the start of a room, should the camera be snapped to it? #macro STANNCAM_CONFIG_SNAP_TO_ZONE_ON_ROOM_START true //Default: true //if a followed object is within a constrain zone at start of room, should thee camera be snapped to it? #macro STANNCAM_CONFIG_ZONE_CONSTRAIN_ALWAYS_SMOOTH false //Default: false //if true, the transition will be smooth regardless of smooth_draw +#macro STANNCAM_CONFIG_ZONE_CONSTRAIN_TRANSITION_SNAP_THRESHOLD 0.003 //Default 0.003 //with smooth_draw off, transitioning between zones, it will snap when over this threshold + #macro STANNCAM_CONFIG_DRAW_CAMERA_ZONES __obj_stanncam_manager.draw_zones //Default: __obj_stanncam_manager.draw_zones //set to whichever global variable you like to easily control if zones should be drawn \ No newline at end of file From f642838220adc7af3dd1cab01ee73690b8328894 Mon Sep 17 00:00:00 2001 From: Jack Conradsen Date: Fri, 27 Mar 2026 18:32:08 +0100 Subject: [PATCH 16/19] macro wasn't used --- objects/obj_stanncam_zone/Draw_0.gml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/objects/obj_stanncam_zone/Draw_0.gml b/objects/obj_stanncam_zone/Draw_0.gml index e59b1c3..f716668 100644 --- a/objects/obj_stanncam_zone/Draw_0.gml +++ b/objects/obj_stanncam_zone/Draw_0.gml @@ -1,4 +1,4 @@ -if(__obj_stanncam_manager.draw_zones){ +if(STANNCAM_CONFIG_DRAW_CAMERA_ZONES){ if(active){ draw_self(); } else { From 1e4f4d1232ca7b9c7a8f23e19000051c88a5f48d Mon Sep 17 00:00:00 2001 From: Jack Conradsen Date: Fri, 27 Mar 2026 18:42:31 +0100 Subject: [PATCH 17/19] ignore priority of deactivated zones --- scripts/stanncam/stanncam.gml | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/stanncam/stanncam.gml b/scripts/stanncam/stanncam.gml index 81e02e8..0b6427b 100644 --- a/scripts/stanncam/stanncam.gml +++ b/scripts/stanncam/stanncam.gml @@ -207,6 +207,7 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf if(_zone_count != 0){ for (var j = 0; j < _zone_count; j++) { + if(!_zone_list[| j].active) continue; //ignore deactivated zones var priority_ = _zone_list[| j].priority; if ( priority_ > highest_priority_) highest_priority_ = priority_; } From 61908c488f3c9b2794d69618201f1f48ac420f2a Mon Sep 17 00:00:00 2001 From: Jack Conradsen Date: Sun, 29 Mar 2026 21:52:38 +0200 Subject: [PATCH 18/19] offset and shake is not constained to zones --- rooms/rm_test/rm_test.yy | 4 ++-- scripts/stanncam/stanncam.gml | 29 +++++++++++++---------------- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/rooms/rm_test/rm_test.yy b/rooms/rm_test/rm_test.yy index 411efb4..2bcecdd 100644 --- a/rooms/rm_test/rm_test.yy +++ b/rooms/rm_test/rm_test.yy @@ -11,7 +11,7 @@ {"name":"inst_BEB4411","path":"rooms/rm_test/rm_test.yy",}, {"name":"inst_3E1AFC53","path":"rooms/rm_test/rm_test.yy",}, {"name":"inst_451D11CD","path":"rooms/rm_test/rm_test.yy",}, - {"name":"inst_37B6078F","path":"rooms/rm_test/rm_test.yy",}, + {"name":"inst_5F7D968C","path":"rooms/rm_test/rm_test.yy",}, ], "isDnd":false, "layers":[ @@ -21,7 +21,7 @@ {"$GMRInstance":"v4","%Name":"inst_3E1AFC53","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_3E1AFC53","objectId":{"name":"obj_player2","path":"objects/obj_player2/obj_player2.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":144.0,"y":128.0,}, {"$GMRInstance":"v4","%Name":"inst_451D11CD","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_451D11CD","objectId":{"name":"obj_tv","path":"objects/obj_tv/obj_tv.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":320.0,"y":48.0,}, {"$GMRInstance":"v4","%Name":"inst_BEB4411","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_BEB4411","objectId":{"name":"obj_player","path":"objects/obj_player/obj_player.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":272.0,"y":160.0,}, - {"$GMRInstance":"v4","%Name":"inst_37B6078F","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_37B6078F","objectId":{"name":"obj_stanncam_zone","path":"objects/obj_stanncam_zone/obj_stanncam_zone.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":11.0,"scaleY":11.0,"x":32.0,"y":32.0,}, + {"$GMRInstance":"v4","%Name":"inst_5F7D968C","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"name":"inst_5F7D968C","objectId":{"name":"obj_stanncam_zone","path":"objects/obj_stanncam_zone/obj_stanncam_zone.yy",},"properties":[],"resourceType":"GMRInstance","resourceVersion":"2.0","rotation":0.0,"scaleX":11.0,"scaleY":12.0,"x":32.0,"y":32.0,}, ],"layers":[],"name":"Instances","properties":[],"resourceType":"GMRInstanceLayer","resourceVersion":"2.0","userdefinedDepth":false,"visible":true,}, {"$GMRTileLayer":"","%Name":"Tiles_1","depth":100,"effectEnabled":true,"effectType":null,"gridX":16,"gridY":16,"hierarchyFrozen":false,"inheritLayerDepth":false,"inheritLayerSettings":false,"inheritSubLayers":true,"inheritVisibility":true,"layers":[],"name":"Tiles_1","properties":[],"resourceType":"GMRTileLayer","resourceVersion":"2.0","tiles":{"SerialiseHeight":8,"SerialiseWidth":14,"TileCompressedData":[-112,1,],"TileDataFormat":1,},"tilesetId":{"name":"TileSet1","path":"tilesets/TileSet1/TileSet1.yy",},"userdefinedDepth":false,"visible":true,"x":0,"y":0,}, {"$GMRBackgroundLayer":"","%Name":"Backgrounds_1","animationFPS":1.0,"animationSpeedType":1,"colour":4294967295,"depth":200,"effectEnabled":true,"effectType":null,"gridX":16,"gridY":16,"hierarchyFrozen":false,"hspeed":0.0,"htiled":true,"inheritLayerDepth":false,"inheritLayerSettings":false,"inheritSubLayers":true,"inheritVisibility":true,"layers":[],"name":"Backgrounds_1","properties":[],"resourceType":"GMRBackgroundLayer","resourceVersion":"2.0","spriteId":{"name":"spr_bg","path":"sprites/spr_bg/spr_bg.yy",},"stretch":false,"userdefinedAnimFPS":false,"userdefinedDepth":false,"visible":true,"vspeed":0.0,"vtiled":true,"x":0,"y":0,}, diff --git a/scripts/stanncam/stanncam.gml b/scripts/stanncam/stanncam.gml index 0b6427b..66cfc42 100644 --- a/scripts/stanncam/stanncam.gml +++ b/scripts/stanncam/stanncam.gml @@ -179,7 +179,7 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf //gradually moves camera into position based on duration x = stanncam_animcurve(__t, __xStart, __xTo, __duration, anim_curve); y = stanncam_animcurve(__t, __yStart, __yTo, __duration, anim_curve); - + __t = min(__t + 1, __duration); if(__t >= __duration){ @@ -260,7 +260,7 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf if(_active_list_compare != _zone_list_compare){ array_push(__zone_lists_strength, 0); array_push(__zone_lists, _zone_list); - + //ensures that the zone lists array has a max size if(array_length(__zone_lists) > __zone_lists_max){ array_shift(__zone_lists_strength); @@ -829,14 +829,9 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf /// @description updates the view position /// @ignore static __update_view_pos = function(){ - - //offseting is whole numbers with smooth_draw off - var _offset_x = smooth_draw ? offset_x : round(offset_x); - var _offset_y = smooth_draw ? offset_y : round(offset_y); - //update camera view - var _new_x = x + _offset_x - (width / 2) + __shake_x; - var _new_y = y + _offset_y - (height / 2) + __shake_y; + var _new_x = x - (width / 2 ); + var _new_y = y - (height / 2); var _zoom_whole = ceil(zoom_amount - 1); _new_x -= (width / 2) * _zoom_whole; @@ -868,11 +863,6 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf var _view_top = view_to_room_y(0) + 1; var _view_bottom = view_to_room_y(height) + 1; - _view_left += _offset_x; - _view_right += _offset_x; - _view_top += _offset_y; - _view_bottom += _offset_y; - //zone constricting for (var l = 0; l < array_length(__zone_lists); l++) { @@ -920,7 +910,7 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf var _zone_width = (_zone_right - _zone_left); if((_view_right - _view_left) > _zone_width){ var _middle = ((_zone_left + _zone_right) / 2) - 1; - _constrain_offset_x[l] = _middle - x - _offset_x; + _constrain_offset_x[l] = _middle - x; _zone_center_h = true; } } @@ -944,7 +934,7 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf var _zone_height = (_zone_bottom - _zone_top); if((_view_bottom - _view_top) > _zone_height){ var _middle = ((_zone_top + _zone_bottom) / 2) - 1; - _constrain_offset_y[l] = _middle - y - _offset_y; + _constrain_offset_y[l] = _middle - y; _zone_center_v = true; } } @@ -1022,6 +1012,13 @@ function stanncam(_x=0, _y=0, _width=global.game_w, _height=global.game_h, _surf #endregion + //offseting is whole numbers with smooth_draw off + var _offset_x = smooth_draw ? offset_x : round(offset_x); + var _offset_y = smooth_draw ? offset_y : round(offset_y); + + _new_x += _offset_x + __shake_x; + _new_y += _offset_y + __shake_y; + camera_set_view_pos(__camera, _new_x, _new_y); } #endregion From de294e933d4cc527f182918698605618598ae4fb Mon Sep 17 00:00:00 2001 From: Jack Conradsen Date: Sun, 26 Apr 2026 02:12:30 +0200 Subject: [PATCH 19/19] zone list didn't get reset when changing rooms --- objects/__obj_stanncam_manager/Other_4.gml | 4 ++++ stanncam.yyp | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/objects/__obj_stanncam_manager/Other_4.gml b/objects/__obj_stanncam_manager/Other_4.gml index 5f016cb..77c240d 100644 --- a/objects/__obj_stanncam_manager/Other_4.gml +++ b/objects/__obj_stanncam_manager/Other_4.gml @@ -6,6 +6,10 @@ for (var i = 0; i < _len; ++i){ _cam.__check_viewports(); _cam.__step(); + _cam.__zone_lists_max = 4; + _cam.__zone_lists = [noone]; + _cam.__zone_lists_strength = [1]; + //if following something, snap the camera to it on room start if(STANNCAM_CONFIG_SNAP_TO_FOLLOW_ON_ROOM_START && instance_exists(_cam.follow)){ _cam.move(_cam.follow.x, _cam.follow.y, 0); diff --git a/stanncam.yyp b/stanncam.yyp index 36a239f..e6cb564 100644 --- a/stanncam.yyp +++ b/stanncam.yyp @@ -35,7 +35,7 @@ "isEcma":false, "LibraryEmitters":[], "MetaData":{ - "IDEVersion":"2024.14.4.221", + "IDEVersion":"2024.14.4.222", }, "name":"stanncam", "resources":[