Placeable pieces

This commit is contained in:
olof.pettersson
2025-09-24 19:53:37 +02:00
parent 449a77184d
commit 57deb8403c
2 changed files with 32 additions and 9 deletions

View File

@ -109,31 +109,47 @@ func _update_preview_position():
var snapped_pos = viewport_2d.get_mouse_position().snapped(Vector2(grid_size, grid_size))
preview_piece.global_position = snapped_pos
preview_piece.rotation = rotation_angle
func _place_piece_from_preview(mouse_pos: Vector2):
print(mouse_pos)
if not is_instance_valid(preview_piece):
return
var viewport_2d = EditorInterface.get_editor_viewport_2d()
var snapped_pos = viewport_2d.get_mouse_position().snapped(Vector2(grid_size, grid_size))
# Find an existing module to attach to.
var nearby_modules = _find_nearby_modules(snapped_pos)
var target_module: Module
if not nearby_modules.is_empty():
# Use the nearest existing module.
target_module = nearby_modules[0]
else:
# No nearby module, so create a new one and add it to the scene.
var new_module_scene = preload("res://scenes/ship/builder/module.tscn")
target_module = new_module_scene.instantiate() as Module
EditorInterface.get_edited_scene_root().add_child(target_module)
print(target_module)
# Set its global position.
target_module.global_position = snapped_pos
var scene_root = EditorInterface.get_edited_scene_root()
scene_root.add_child(target_module)
target_module.owner = scene_root
# The preview piece is a temporary node; we need to make it permanent.
# We reparent it to the correct container inside the target module.
preview_piece.is_preview = false
preview_piece.reparent(target_module.structural_container)
preview_piece.position = target_module.structural_container.to_local(snapped_pos)
var piece_to_place = active_piece_scene.instantiate()
target_module.add_child(piece_to_place)
piece_to_place.owner = target_module
piece_to_place.position = target_module.structural_container.to_local(snapped_pos)
# After adding the piece, we must recalculate the module's physics.
target_module._recalculate_physics_properties()
# Re-activate the button's behavior to create a new preview piece.
_on_piece_button_pressed(active_piece_scene)
@ -141,7 +157,7 @@ func _find_nearby_modules(position: Vector2) -> Array[Module]:
var modules: Array[Module] = []
for node in get_tree().get_edited_scene_root().get_children():
if node is Module:
if node.global_position.distance_to(position) < grid_size * 2:
if node.global_position.distance_to(position) < grid_size * 3:
modules.append(node)
return modules

View File

@ -1,3 +1,10 @@
[gd_scene format=3 uid="uid://bvogqgqig1hps"]
[gd_scene load_steps=3 format=3 uid="uid://bvogqgqig1hps"]
[ext_resource type="PackedScene" uid="uid://cm0rohkr6khd1" path="res://scenes/ship/builder/module.tscn" id="1_23uw4"]
[ext_resource type="Script" uid="uid://6co67nfy8ngb" path="res://scenes/ship/builder/module.gd" id="2_anlqm"]
[node name="ShipBuildingTest" type="Node2D"]
[node name="Module" type="RigidBody2D" parent="." instance=ExtResource("1_23uw4")]
position = Vector2(-250, -150)
script = ExtResource("2_anlqm")