Refine large map viewport controls

This commit is contained in:
2026-06-19 18:53:03 +09:00
parent feac924a1c
commit f13f20939f
5 changed files with 67 additions and 16 deletions

View File

@@ -4399,11 +4399,13 @@ func _draw_target_preview_badge() -> void:
func _target_preview_badge_rect(cell: Vector2i, size: Vector2 = TARGET_PREVIEW_BADGE_SIZE) -> Rect2:
var cell_rect := _rect_for_cell(cell)
var position := cell_rect.position + Vector2((TILE_SIZE - size.x) * 0.5, 5.0)
var board := _board_rect()
var min_x := board.position.x + 2.0
var min_y := board.position.y + 2.0
var max_x := maxf(min_x, board.end.x - size.x - 2.0)
var max_y := maxf(min_y, board.end.y - size.y - 2.0)
var visible_board := _board_rect().intersection(_map_view_rect())
if visible_board.size.x <= 0.0 or visible_board.size.y <= 0.0:
visible_board = _board_rect()
var min_x := visible_board.position.x + 2.0
var min_y := visible_board.position.y + 2.0
var max_x := maxf(min_x, visible_board.end.x - size.x - 2.0)
var max_y := maxf(min_y, visible_board.end.y - size.y - 2.0)
position.x = clampf(position.x, min_x, max_x)
position.y = clampf(position.y, min_y, max_y)
return Rect2(position, size)
@@ -4654,10 +4656,15 @@ func _target_preview_badge_color(kind: String) -> Color:
func _cell_from_screen(screen_position: Vector2) -> Vector2i:
if not _map_view_rect().has_point(screen_position):
return Vector2i(-1, -1)
var local := screen_position - _board_origin()
if local.x < 0 or local.y < 0:
return Vector2i(-1, -1)
return Vector2i(int(floor(local.x / TILE_SIZE)), int(floor(local.y / TILE_SIZE)))
var cell := Vector2i(int(floor(local.x / TILE_SIZE)), int(floor(local.y / TILE_SIZE)))
if not state.is_inside(cell):
return Vector2i(-1, -1)
return cell
func _rect_for_cell(cell: Vector2i) -> Rect2: