diff --git a/autoloads/entity_manager.gd b/autoloads/entity_manager.gd index f5d0197..bcf28ef 100644 --- a/autoloads/entity_manager.gd +++ b/autoloads/entity_manager.gd @@ -1,3 +1,4 @@ extends Node signal create_block(id: String, position: Vector3) +signal drop_block(id: String, position: Vector3) diff --git a/scenes/blocks/block.gd b/scenes/blocks/block.gd index 343be75..923bdbf 100644 --- a/scenes/blocks/block.gd +++ b/scenes/blocks/block.gd @@ -2,6 +2,7 @@ class_name Block extends StaticBody3D +@onready var collision_shape: CollisionShape3D = $CollisionShape3D @onready var highlight_mesh: MeshInstance3D = $HighlightMesh @onready var east_face: MeshInstance3D = $BlockFaces/EastFace diff --git a/scenes/blocks/dropped_block.gd b/scenes/blocks/dropped_block.gd new file mode 100644 index 0000000..b065b38 --- /dev/null +++ b/scenes/blocks/dropped_block.gd @@ -0,0 +1,39 @@ +class_name DroppedBlock +extends Node3D + + +@export var block_tilt: float = 15.0 +@export var bounce_height: float = 0.25 +@export var bounce_duration: float = 1.0 +@export var spin_duration: float = 2.0 +@export var block_size_scale: float = 0.25 + +@onready var start_position: Vector3 = self.position + +var tween: Tween + + +func drop_block(block_id: String) -> void: + _create_block(block_id) + _run_animation() + +func remove_block() -> void: + queue_free() + + +func _create_block(block_id: String) -> void: + var block: Block = World.BLOCK_PREFAB.instantiate() + block.rotation.z = block_tilt + block.set_id(block_id) + block.scale = Vector3(block_size_scale, block_size_scale, block_size_scale) + add_child(block) + block.collision_shape.disabled = true + +func _run_animation() -> void: + tween = create_tween().set_loops() + tween.tween_property( + self, + "rotation_degrees", + Vector3(0, 360, 0), + spin_duration + ).from_current() diff --git a/scenes/blocks/dropped_block.gd.uid b/scenes/blocks/dropped_block.gd.uid new file mode 100644 index 0000000..e1e5666 --- /dev/null +++ b/scenes/blocks/dropped_block.gd.uid @@ -0,0 +1 @@ +uid://bnqhdn88dg38n diff --git a/scenes/blocks/dropped_block.tscn b/scenes/blocks/dropped_block.tscn new file mode 100644 index 0000000..b6380db --- /dev/null +++ b/scenes/blocks/dropped_block.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://cadej8hyabido"] + +[ext_resource type="Script" uid="uid://bnqhdn88dg38n" path="res://scenes/blocks/dropped_block.gd" id="1_50ggx"] + +[node name="DroppedBlock" type="Node3D"] +script = ExtResource("1_50ggx") diff --git a/scenes/world/world.gd b/scenes/world/world.gd index 6cffb14..35d3c48 100644 --- a/scenes/world/world.gd +++ b/scenes/world/world.gd @@ -3,19 +3,23 @@ extends Node3D const BLOCK_PREFAB: PackedScene = preload("res://scenes/blocks/block.tscn") +const DROPPED_BLOCK_PREFAB: PackedScene = preload("res://scenes/blocks/dropped_block.tscn") func _ready() -> void: Input.mouse_mode = Input.MOUSE_MODE_CAPTURED EntityManager.create_block.connect(create_block.bind()) + EntityManager.drop_block.connect(create_dropped_block.bind()) _initialize_ground() - create_block("001", Vector3(2,1, 2)) - create_block("002", Vector3(2,1, 1)) - create_block("003", Vector3(1,1, 2)) - create_block("004", Vector3(1,2, 2)) - create_block("003", Vector3(-2,3, 2)) + create_block("001", Vector3(2, 1, 2)) + create_block("002", Vector3(2, 1, 1)) + create_block("003", Vector3(1, 1, 2)) + create_block("004", Vector3(1, 2, 2)) + create_block("003", Vector3(-2, 3, 2)) + + create_dropped_block("004", Vector3(0, 2, -2)) func create_block(id: String, block_position: Vector3) -> void: @@ -25,6 +29,11 @@ func create_block(id: String, block_position: Vector3) -> void: add_child(block) +func create_dropped_block(id: String, block_position: Vector3) -> void: + var block: DroppedBlock = DROPPED_BLOCK_PREFAB.instantiate() + block.position = block_position + add_child(block) + block.drop_block(id) func _initialize_ground() -> void: for x: int in range(-10, 11):