Class GBPositioning2DUtils
- Namespace
- GridPlacement.GDScript
- Assembly
- MoonBark.GridPlacement.GDScript.dll
GBPositioning2DUtils Static utility functions for 2D grid-based positioning and tile movement operations.\n\nThis class provides pure functions for common 2D game positioning tasks including: - Converting between world coordinates, viewport coordinates, and tile coordinates - Moving nodes to tile centers with proper alignment - Viewport-to-world coordinate transformations using Camera2D - Distance-limited movement with adjacency constraints - Direction vector normalization for tile-based movement\n\nAll functions are static and depend only on provided parameters, making them highly testable and reusable. Extracted from GridPositioner2D to reduce class coupling and improve maintainability.\n\n[b]⭐ CAMERA2D REQUIRED[/b] - Add a Camera2D node to your scene before using Grid Building operations. World coordinate calculations from mouse position depend on Camera2D for accurate positioning.\n\n[b]Requirements:[/b] Designed for 2D games using TileMapLayer and Camera2D nodes.
class GBPositioning2DUtils extends RefCounted
Properties
map_position
var map_position = map.to_local(global_position)
tile_center_local
var tile_center_local = map.map_to_local(tile)
tile_center_global
var tile_center_global = map.to_global(tile_center_local)
used_rect
var used_rect: Rect2i = map.get_used_rect()
resolved_tile
var resolved_tile: Vector2i = target_tile
effective_region
var effective_region = region
snapped_target
var snapped_target = snap_tile_to_region(target_tile, effective_region)
max_steps
var max_steps = max(settings.max_tile_distance, 0)
astar_result
var astar_result = _limit_using_astar(source, snapped_target, map, astar_grid, max_steps, effective_region)
min_x
var min_x = region.position.x
max_x
var max_x = region.position.x + region.size.x - 1
min_y
var min_y = region.position.y
max_y
var max_y = region.position.y + region.size.y - 1
snapped
var snapped = tile
local
var local = map.to_local(node.global_position)
source_tile
var source_tile = get_tile_from_node_position(source, map)
path
var path: PackedVector2Array = astar_grid.get_point_path(source_tile, target_tile)
index
var index = clamp(max_steps, 0, path.size() - 1)
waypoint
var waypoint: Vector2 = path[index]
tile
var tile = get_tile_from_global_position(world_position, map)
current
var current = get_tile_from_node_position(source, map)
steps
var steps = max_steps
step
var step = _step_toward(current, target_tile, diagonal_mode)
dx
var dx = target.x - current.x
dy
var dy = target.y - current.y
step_x
var step_x = 0
step_y
var step_y = 0
current_tile
var current_tile: Vector2i = get_tile_from_node_position(node, target_map)
new_tile
var new_tile: Vector2i = current_tile + p_tile_delta
camera
var camera: Camera2D = viewport.get_camera_2d()
canvas_transform
var canvas_transform: Transform2D = viewport.get_canvas_transform()
world_pos
var world_pos: Vector2 = canvas_transform.affine_inverse() * screen_pos
center_viewport
var center_viewport: Vector2 = viewport.get_visible_rect().get_center()
world_position
var world_position: Vector2 = viewport_center_to_world_position(viewport)
tile
var tile = get_tile_from_global_position(world_position, map)
n
var n = direction.normalized()
sx
var sx = 0
sy
var sy = 0
Methods
get_tile_from_global_position
static func get_tile_from_global_position(global_position: Vector2, map: TileMapLayer) -> Vector2i:
Parameters
global_positionmap
Returns
move_to_tile_center
static func move_to_tile_center(node: Node2D, tile: Vector2i, map: TileMapLayer) -> Vector2i:
Parameters
nodetilemap
Returns
move_to_closest_valid_tile_center
static func move_to_closest_valid_tile_center(node: Node2D, target_tile: Vector2i, source: Node2D, map: TileMapLayer, settings: GridTargetingSettings) -> Vector2i:
Parameters
nodetarget_tilesourcemapsettings
Returns
limit_tile_to_max_distance
static func limit_tile_to_max_distance(source: Node2D, target_tile: Vector2i, map: TileMapLayer, settings: GridTargetingSettings, region: Rect2i = Rect2i(), astar_grid: AStarGrid2D = null) -> Vector2i:
Parameters
sourcetarget_tilemapsettingsregionastar_grid
Returns
is_region_valid
static func is_region_valid(region: Rect2i) -> bool:
Parameters
region
Returns
snap_tile_to_region
static func snap_tile_to_region(tile: Vector2i, region: Rect2i) -> Vector2i:
Parameters
tileregion
Returns
get_tile_from_node_position
static func get_tile_from_node_position(node: Node2D, map: TileMapLayer) -> Vector2i:
Parameters
nodemap
Returns
move_node_by_tiles
static func move_node_by_tiles(node: Node2D, p_tile_delta: Vector2i, target_map: TileMapLayer) -> Vector2i:
Parameters
nodep_tile_deltatarget_map
Returns
convert_screen_to_world_position
static func convert_screen_to_world_position(screen_pos: Vector2, viewport: Viewport) -> Vector2:
Parameters
screen_posviewport
Returns
viewport_center_to_world_position
static func viewport_center_to_world_position(viewport: Viewport) -> Vector2:
Parameters
viewport
Returns
move_node_to_tile_at_viewport_center
static func move_node_to_tile_at_viewport_center(node: Node2D, map: TileMapLayer, viewport: Viewport) -> Vector2i:
Parameters
nodemapviewport
Returns
direction_to_tile_delta
static func direction_to_tile_delta(direction: Vector2, threshold: float = 0.33) -> Vector2i:
Parameters
directionthreshold