Merge pull request #49409 from ekumlin/issue-32596

Enable Camera2D smoothing on limit change
This commit is contained in:
Rémi Verschelde 2021-07-01 08:14:21 +02:00 committed by GitHub
commit 8a4cb96856
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 11 deletions

View File

@ -161,6 +161,8 @@
</member> </member>
<member name="limit_smoothed" type="bool" setter="set_limit_smoothing_enabled" getter="is_limit_smoothing_enabled" default="false"> <member name="limit_smoothed" type="bool" setter="set_limit_smoothing_enabled" getter="is_limit_smoothing_enabled" default="false">
If [code]true[/code], the camera smoothly stops when reaches its limits. If [code]true[/code], the camera smoothly stops when reaches its limits.
This has no effect if smoothing is disabled.
[b]Note:[/b] To immediately update the camera's position to be within limits without smoothing, even with this setting enabled, invoke [method reset_smoothing].
</member> </member>
<member name="limit_top" type="int" setter="set_limit" getter="get_limit" default="-10000000"> <member name="limit_top" type="int" setter="set_limit" getter="get_limit" default="-10000000">
Top scroll limit in pixels. The camera stops moving when reaching this value. Top scroll limit in pixels. The camera stops moving when reaching this value.

View File

@ -178,20 +178,23 @@ Transform2D Camera2D::get_camera_transform() {
} }
Rect2 screen_rect(-screen_offset + ret_camera_pos, screen_size * zoom); Rect2 screen_rect(-screen_offset + ret_camera_pos, screen_size * zoom);
if (screen_rect.position.x < limit[SIDE_LEFT]) {
screen_rect.position.x = limit[SIDE_LEFT];
}
if (screen_rect.position.x + screen_rect.size.x > limit[SIDE_RIGHT]) { if (!limit_smoothing_enabled) {
screen_rect.position.x = limit[SIDE_RIGHT] - screen_rect.size.x; if (screen_rect.position.x < limit[SIDE_LEFT]) {
} screen_rect.position.x = limit[SIDE_LEFT];
}
if (screen_rect.position.y + screen_rect.size.y > limit[SIDE_BOTTOM]) { if (screen_rect.position.x + screen_rect.size.x > limit[SIDE_RIGHT]) {
screen_rect.position.y = limit[SIDE_BOTTOM] - screen_rect.size.y; screen_rect.position.x = limit[SIDE_RIGHT] - screen_rect.size.x;
} }
if (screen_rect.position.y < limit[SIDE_TOP]) { if (screen_rect.position.y + screen_rect.size.y > limit[SIDE_BOTTOM]) {
screen_rect.position.y = limit[SIDE_TOP]; screen_rect.position.y = limit[SIDE_BOTTOM] - screen_rect.size.y;
}
if (screen_rect.position.y < limit[SIDE_TOP]) {
screen_rect.position.y = limit[SIDE_TOP];
}
} }
if (offset != Vector2()) { if (offset != Vector2()) {