konkr_game_3d/scripts/Utils.gd
ProgramSnail 5408d75267 init
2023-08-09 23:12:19 +03:00

44 lines
1.6 KiB
GDScript

extends Spatial
onready var tiles : GridMap = get_node("/root/Level/Map/Tiles")
onready var camera : Camera = get_node("/root/Level/Camera")
func mouse_position():
var position_2d = get_viewport().get_mouse_position()
var drop_plane = Plane(Vector3(0, 1, 0), 1)
var position_3d = drop_plane.intersects_ray(
camera.project_ray_origin(position_2d),
camera.project_ray_normal(position_2d))
return position_3d
func position_to_string(position : Vector3):
return str([int(round(position.x)), int(round(position.y)), int(round(position.z))])
export var TILE_OFFSET : Vector3 = Vector3(0.5, 0, 0.5)
func world_to_grid_position(position : Vector3):
position += Vector3(TILE_OFFSET.x * tiles.cell_size.x,
TILE_OFFSET.y * tiles.cell_size.y,
TILE_OFFSET.z * tiles.cell_size.z)
var diagonal_steps_amount = position.z / (2 * tiles.cell_size.z)
var forward_steps_amount = (position.x - diagonal_steps_amount * tiles.cell_size.x) \
/ (2 * tiles.cell_size.x)
var hex_ceil_z = int(round(diagonal_steps_amount))
var hex_ceil_x = int(round(forward_steps_amount + hex_ceil_z / 2))
var row_is_moved = (int(abs(hex_ceil_z)) % 2 == 1)
return Vector3(int(hex_ceil_x * 2 + (sign(hex_ceil_z) if row_is_moved else 0.0) - 1), 0, int(hex_ceil_z * 2 - 1))
func grid_to_world_position(position : Vector3):
return tiles.map_to_world(int(round(position.x)), int(round(position.y)), int(round(position.z)))
func spawn_on_position(scene, world_position : Vector3):
var instance = scene.instance()
add_child(instance)
instance.translation = grid_to_world_position(world_position)
return instance