Placeable pieces
This commit is contained in:
@ -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
|
||||
|
||||
|
||||
@ -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")
|
||||
|
||||
Reference in New Issue
Block a user