From bce75a9a9730eab86ef7b6ab3b329313a9743d0c Mon Sep 17 00:00:00 2001 From: Dan Baker Date: Fri, 3 May 2024 20:39:41 +0100 Subject: [PATCH] Bee flying animation, dancing drone --- entities/Bee.tscn | 59 ++++++++++++++++++++++++++- entities/Beehive.tscn | 22 ++++++++++ entities/DancerDrone.tscn | 12 +++++- entities/bee/states/bee_gather.gd | 1 + entities/bee/states/bee_idle.gd | 2 +- entities/bee/states/bee_sleeping.gd | 17 ++++++++ entities/bee/states/bee_travelling.gd | 12 +++--- entities/scripts/bee.gd | 10 ++++- entities/scripts/beehive.gd | 18 ++++++++ project.godot | 1 - scenes/scripts/bee_spawner.gd | 4 +- scenes/scripts/drone_manager.gd | 6 +++ scenes/test_level.tscn | 11 ++--- 13 files changed, 154 insertions(+), 21 deletions(-) create mode 100644 entities/Beehive.tscn create mode 100644 entities/bee/states/bee_sleeping.gd create mode 100644 entities/scripts/beehive.gd diff --git a/entities/Bee.tscn b/entities/Bee.tscn index d5ba402..df85c63 100644 --- a/entities/Bee.tscn +++ b/entities/Bee.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=8 format=3 uid="uid://deek6uv574xas"] +[gd_scene load_steps=13 format=3 uid="uid://deek6uv574xas"] [ext_resource type="Script" path="res://entities/scripts/bee.gd" id="1_pnu7x"] [ext_resource type="Script" path="res://entities/scripts/finite_state_machine.gd" id="1_t3s5d"] @@ -6,14 +6,64 @@ [ext_resource type="Script" path="res://entities/bee/states/bee_gather.gd" id="5_4vs4l"] [ext_resource type="Script" path="res://entities/scripts/bee_hit_box.gd" id="5_agq38"] [ext_resource type="Script" path="res://entities/bee/states/bee_travelling.gd" id="5_qtx0r"] +[ext_resource type="Script" path="res://entities/bee/states/bee_sleeping.gd" id="7_6qlbu"] + +[sub_resource type="Animation" id="Animation_t75ra"] +resource_name = "Idle" + +[sub_resource type="Animation" id="Animation_iys4n"] +resource_name = "Flying" +length = 5.0 +loop_mode = 1 +step = 0.5 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Polygon2D:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 1.5, 2.5, 3.5, 5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(0, 0), Vector2(0, 10), Vector2(0, -10), Vector2(0, 10), Vector2(0, 0)] +} + +[sub_resource type="Animation" id="Animation_0encb"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Polygon2D:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 0)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_m27po"] +_data = { +"Flying": SubResource("Animation_iys4n"), +"Idle": SubResource("Animation_t75ra"), +"RESET": SubResource("Animation_0encb") +} [sub_resource type="CircleShape2D" id="CircleShape2D_86nxf"] radius = 22.0907 [node name="Bee" type="CharacterBody2D"] +z_index = 99 collision_mask = 0 script = ExtResource("1_pnu7x") +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_m27po") +} + [node name="CollisionShape2D" type="CollisionShape2D" parent="."] light_mask = 0 shape = SubResource("CircleShape2D_86nxf") @@ -40,9 +90,16 @@ script = ExtResource("5_qtx0r") [node name="Gathering" type="Node" parent="StateMachine"] script = ExtResource("5_4vs4l") +[node name="Sleeping" type="Node" parent="StateMachine"] +script = ExtResource("7_6qlbu") + [node name="Polygon2D" type="Polygon2D" parent="."] color = Color(1, 1, 0.0745098, 1) polygon = PackedVector2Array(-18, -11, -6, -21, 17, -19, 23, 1, 3, 12, -18, 7) +[node name="CPUParticles2D" type="CPUParticles2D" parent="Polygon2D"] +position = Vector2(0, 2.46663) +gravity = Vector2(0, 0) + [connection signal="area_entered" from="HitBox" to="HitBox" method="_on_area_entered"] [connection signal="area_exited" from="HitBox" to="HitBox" method="_on_area_exited"] diff --git a/entities/Beehive.tscn b/entities/Beehive.tscn new file mode 100644 index 0000000..583780b --- /dev/null +++ b/entities/Beehive.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=3 format=3 uid="uid://dyu4mucawjlu6"] + +[ext_resource type="Script" path="res://entities/scripts/beehive.gd" id="1_ej1r1"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_h6wmc"] +radius = 250.0 + +[node name="Beehive" type="Node2D"] +script = ExtResource("1_ej1r1") + +[node name="BeehivePlaceholder" type="Polygon2D" parent="."] +position = Vector2(1, 0) +color = Color(0.588235, 0.423529, 0.423529, 1) +polygon = PackedVector2Array(-58, -56, 80, -30, 60, 78, -51, 108) + +[node name="Area2D" type="Area2D" parent="."] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"] +shape = SubResource("CircleShape2D_h6wmc") + +[connection signal="area_entered" from="Area2D" to="." method="_on_area_2d_area_entered"] +[connection signal="area_exited" from="Area2D" to="." method="_on_area_2d_area_exited"] diff --git a/entities/DancerDrone.tscn b/entities/DancerDrone.tscn index 0cae613..739eeda 100644 --- a/entities/DancerDrone.tscn +++ b/entities/DancerDrone.tscn @@ -1,11 +1,19 @@ -[gd_scene load_steps=2 format=3 uid="uid://cx7cunaspu08a"] +[gd_scene load_steps=3 format=3 uid="uid://cx7cunaspu08a"] [ext_resource type="Script" path="res://entities/scripts/dancer_drone.gd" id="1_44a5b"] -[node name="DancerDrone" type="Node2D"] +[sub_resource type="CircleShape2D" id="CircleShape2D_xfqbx"] +radius = 25.0 + +[node name="DancerDrone" type="Node2D" groups=["dancer"]] script = ExtResource("1_44a5b") [node name="Polygon2D" type="Polygon2D" parent="."] position = Vector2(1, -1) color = Color(0.354435, 0.719091, 0.745333, 1) polygon = PackedVector2Array(-28, -25, 25, -28, 26, 33, -32, 19) + +[node name="HitBox" type="Area2D" parent="." groups=["dancer"]] + +[node name="HitBoxShape" type="CollisionShape2D" parent="HitBox"] +shape = SubResource("CircleShape2D_xfqbx") diff --git a/entities/bee/states/bee_gather.gd b/entities/bee/states/bee_gather.gd index 3711147..5723b97 100644 --- a/entities/bee/states/bee_gather.gd +++ b/entities/bee/states/bee_gather.gd @@ -8,6 +8,7 @@ var time_at_patch : float = 0.0 func enter(_msg := {}): Log.pr("I am going to attempt to gather some stuff!") + bee.just_gathering = true #animator.play("Idle") #if !bee.in_range_of_flowers: diff --git a/entities/bee/states/bee_idle.gd b/entities/bee/states/bee_idle.gd index 045781c..8522419 100644 --- a/entities/bee/states/bee_idle.gd +++ b/entities/bee/states/bee_idle.gd @@ -3,7 +3,7 @@ class_name BeeIdle @export var animator : AnimationPlayer -@onready var bee = get_parent().get_parent() # I think this is bad but I dont care it works +@onready var bee = get_parent().get_parent() as Bee # I think this is bad but I dont care it works var idle_time : float = 0.0 diff --git a/entities/bee/states/bee_sleeping.gd b/entities/bee/states/bee_sleeping.gd new file mode 100644 index 0000000..83ee7fd --- /dev/null +++ b/entities/bee/states/bee_sleeping.gd @@ -0,0 +1,17 @@ +extends State +class_name BeeSleeping + +@onready var bee = get_parent().get_parent() as Bee # I think this is bad but I dont care it works + +var time_at_patch : float = 0.0 + +func enter(_msg := {}): + Log.pr("BuzzzZZZzzzZZZZzzz (Sleeping)!") + #animator.play("Idle") + +func update(_delta : float): + + # If there is a dancing bee in range of the hive then + # we have a chance to wake up the bee... + + pass \ No newline at end of file diff --git a/entities/bee/states/bee_travelling.gd b/entities/bee/states/bee_travelling.gd index 0de329e..2251d9d 100644 --- a/entities/bee/states/bee_travelling.gd +++ b/entities/bee/states/bee_travelling.gd @@ -1,8 +1,6 @@ extends State class_name BeeTravelling -@export var animator : AnimationPlayer - @export var target : Drone = null @onready var bee = get_parent().get_parent() as Bee # I think this is bad but I dont care it works @@ -12,13 +10,17 @@ var t = 0 func enter(_msg := {}): Log.pr("I am on the move!") ## Get the next target location from the bee - target = bee.get_next_target() + if bee.just_gathering: + target = bee.get_current_director() # We want to go back the way we came + bee.just_gathering = false + else: + target = bee.get_next_target() - #animator.play("Idle") + bee.animation_player.play("Flying") pass -func update(delta : float): +func update(delta : float) -> void: if target: if bee.position.distance_to(target.position) > 3: diff --git a/entities/scripts/bee.gd b/entities/scripts/bee.gd index 0eb7e55..d7d7f2e 100644 --- a/entities/scripts/bee.gd +++ b/entities/scripts/bee.gd @@ -3,6 +3,7 @@ class_name Bee @onready var fsm = $StateMachine as FiniteStateMachine @onready var drone_manager = get_tree().get_first_node_in_group("dronemanager") as DroneManager +@onready var animation_player = $AnimationPlayer as AnimationPlayer @export var nectar : int = 0 @export var speed : int = 30 @@ -10,13 +11,20 @@ class_name Bee var latest_target_director : int = 0 # This is updated when the bee enters or exits a flower patch -var in_range_of_flowers : bool = false +var in_range_of_flowers : bool = false +var just_gathering : bool = false # Used to check if the bee has just been gathering to return to their previous director func _ready(): + + speed = randi_range(35,55) # Randomise the bee speed a bit + Log.pr("I have never bee-n so ready!") Log.pr(fsm.current_state.name) +func get_current_director(): + return drone_manager.get_director(latest_target_director) + ## Get the next target to move to ## If we have no nectar, we need to go up the director list ## If we have nectar, we need to go down the director list diff --git a/entities/scripts/beehive.gd b/entities/scripts/beehive.gd new file mode 100644 index 0000000..cd192ba --- /dev/null +++ b/entities/scripts/beehive.gd @@ -0,0 +1,18 @@ +extends Node2D +class_name Beehive + +var dancer_in_range : bool = false + +func _ready(): + Log.pr("Beehive has joined the party") + +func _on_area_2d_area_entered(area:Area2D): + Log.pr("Beehive: Area entered", area) + if area.is_in_group("dancer"): + dancer_in_range = true + print("Dancer in range") + +func _on_area_2d_area_exited(area:Area2D): + if area.is_in_group("dancer"): + dancer_in_range = false + print("Dancer out of range") diff --git a/project.godot b/project.godot index 7b0fc16..da053f7 100644 --- a/project.godot +++ b/project.godot @@ -19,7 +19,6 @@ config/icon="res://icon.svg" window/size/viewport_width=1280 window/size/viewport_height=720 -window/vsync/vsync_mode=0 [editor_plugins] diff --git a/scenes/scripts/bee_spawner.gd b/scenes/scripts/bee_spawner.gd index d247eba..58bd0ee 100644 --- a/scenes/scripts/bee_spawner.gd +++ b/scenes/scripts/bee_spawner.gd @@ -16,13 +16,13 @@ func _ready(): func spawn_bee(): var bee_instance = bee.instantiate() add_child(bee_instance) - bee_instance.position = beehive.position + bee_instance.position = beehive.global_position # bee_instance.connect("bee_died", self, "bee_died") func _process(delta): spawn_timer += delta - if spawn_timer > spawn_interval and bee_count < max_bees: + if spawn_timer > spawn_interval and bee_count < max_bees and beehive.dancer_in_range: spawn_bee() spawn_timer = 0.0 bee_count += 1 diff --git a/scenes/scripts/drone_manager.gd b/scenes/scripts/drone_manager.gd index 19f1245..2c7c3d1 100644 --- a/scenes/scripts/drone_manager.gd +++ b/scenes/scripts/drone_manager.gd @@ -90,6 +90,12 @@ func update_director_drone_list(): Log.pr(director_drones.size()) +func get_director(drone_number : int) -> DirectorDrone: + for drone in director_drones: + if drone.visit_order == drone_number: + return drone + return null + func get_next_director(current_director_number : int) -> DirectorDrone: for drone in director_drones: if drone.visit_order == current_director_number + 1: diff --git a/scenes/test_level.tscn b/scenes/test_level.tscn index e1cea4a..0d48409 100644 --- a/scenes/test_level.tscn +++ b/scenes/test_level.tscn @@ -1,10 +1,10 @@ [gd_scene load_steps=7 format=3 uid="uid://mk5n0hrwk4yi"] [ext_resource type="Script" path="res://scenes/scripts/test_level.gd" id="1_lgt1m"] +[ext_resource type="PackedScene" uid="uid://dyu4mucawjlu6" path="res://entities/Beehive.tscn" id="2_5ueyo"] [ext_resource type="Script" path="res://scenes/scripts/drone_manager.gd" id="2_474nc"] [ext_resource type="Script" path="res://scenes/scripts/bee_spawner.gd" id="2_qqqq4"] [ext_resource type="Script" path="res://scenes/scripts/drone_controls.gd" id="3_rqkyv"] -[ext_resource type="PackedScene" uid="uid://deek6uv574xas" path="res://entities/Bee.tscn" id="4_336fp"] [sub_resource type="CircleShape2D" id="CircleShape2D_usqp5"] radius = 142.316 @@ -17,10 +17,8 @@ position = Vector2(52, -26) color = Color(0.329412, 0.494118, 0.392157, 1) polygon = PackedVector2Array(-141, -86, 1456, -97, 1337, 753, -193, 771) -[node name="Beehive" type="Polygon2D" parent="."] -position = Vector2(-37, 87) -color = Color(0.588235, 0.423529, 0.423529, 1) -polygon = PackedVector2Array(95, 146, 203, 134, 186, 274, 78, 287) +[node name="Beehive" parent="." instance=ExtResource("2_5ueyo")] +position = Vector2(163, 489) [node name="Flower" type="Polygon2D" parent="."] position = Vector2(278, -97) @@ -112,9 +110,6 @@ layout_mode = 2 tooltip_text = "Spawn a dancing drone that will encourage bees to leave the hive. Best to put this near to the hive. " text = "Dancer" -[node name="Bee" parent="." instance=ExtResource("4_336fp")] -position = Vector2(704, 196) - [connection signal="pressed" from="DroneManager/Control/MarginContainer/DroneControls/SpawnDirector" to="DroneManager" method="_on_spawn_director_pressed"] [connection signal="pressed" from="DroneManager/Control/MarginContainer/DroneControls/SpawnCollector" to="DroneManager" method="_on_spawn_collector_pressed"] [connection signal="pressed" from="DroneManager/Control/MarginContainer/DroneControls/SpawnDistractor" to="DroneManager" method="_on_spawn_distractor_pressed"]