Table of Contents

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
GBPositioning2DUtils

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_position
map

Returns

move_to_tile_center

static func move_to_tile_center(node: Node2D, tile: Vector2i, map: TileMapLayer) -> Vector2i:

Parameters

node
tile
map

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

node
target_tile
source
map
settings

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

source
target_tile
map
settings
region
astar_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

tile
region

Returns

get_tile_from_node_position

static func get_tile_from_node_position(node: Node2D, map: TileMapLayer) -> Vector2i:

Parameters

node
map

Returns

move_node_by_tiles

static func move_node_by_tiles(node: Node2D, p_tile_delta: Vector2i, target_map: TileMapLayer) -> Vector2i:

Parameters

node
p_tile_delta
target_map

Returns

convert_screen_to_world_position

static func convert_screen_to_world_position(screen_pos: Vector2, viewport: Viewport) -> Vector2:

Parameters

screen_pos
viewport

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

node
map
viewport

Returns

direction_to_tile_delta

static func direction_to_tile_delta(direction: Vector2, threshold: float = 0.33) -> Vector2i:

Parameters

direction
threshold

Returns