Updated goose_talk to allow for interruptions (unfinished); improved

chicken animation, reduced scale in-engine.
This commit is contained in:
Henry 2026-02-14 17:46:02 +00:00
parent 462b0fc4b0
commit 2a7e1a2b6c
16 changed files with 221 additions and 254 deletions

View file

@ -134,7 +134,7 @@ _data = {
&"explode": SubResource("Animation_epg4t")
}
[node name="EnemyTest" type="Area2D" unique_id=1433837580 groups=["enemies"]]
[node name="Enemy" type="Area2D" unique_id=1433837580 groups=["enemies"]]
script = ExtResource("1_4gyqm")
[node name="Sprite2D" type="Sprite2D" parent="." unique_id=2115910138]

57
scenes/enemy_chicken.gd Normal file
View file

@ -0,0 +1,57 @@
extends Area2D
var bullet_scene = preload("res://scenes/enemy_bullet.tscn")
var start_pos = Vector2.ZERO
var speed = 0
var tween_speed: float = 1.4
var exploding = false
var enemy_move_aggression = randf_range(5, 20)
var enemy_shoot_aggression = randf_range(4, 20)
@onready var screensize = get_viewport_rect().size
func start(pos):
speed = 0
position = Vector2(pos.x, -pos.y)
start_pos = pos
await get_tree().create_timer(randf_range(0.25, 0.55)).timeout
var tween = create_tween().set_trans(Tween.TRANS_BACK)
tween.tween_property(self, "position:y", start_pos.y, tween_speed)
await tween.finished
$MoveTimer.wait_time = enemy_move_aggression
$MoveTimer.start()
$ShootTimer.wait_time = enemy_shoot_aggression
$ShootTimer.start()
func _on_timer_timeout() -> void:
speed = randf_range(75, 100)
func _on_shoot_timer_timeout():
var b = bullet_scene.instantiate()
get_tree().root.add_child(b)
b.start(position)
$ShootTimer.wait_time = randf_range(4, 20)
$ShootTimer.start()
func _process(delta):
position.y += speed * delta
if position.y > screensize.y + 32:
start(start_pos)
func explode():
if exploding: return
exploding = true
print_debug("Enemy explode!")
EventBus.enemy_hit.emit(5)
speed = 0
#$AnimationPlayer.play("explode")
#set_deferred("monitoring", false)
#await $AnimationPlayer.animation_finished
queue_free()
EventBus.enemy_died.emit()

View file

@ -0,0 +1 @@
uid://i0r17jo6838m

72
scenes/enemy_chicken.tscn Normal file
View file

@ -0,0 +1,72 @@
[gd_scene format=3 uid="uid://drwm27rxxpq3t"]
[ext_resource type="Script" uid="uid://i0r17jo6838m" path="res://scenes/enemy_chicken.gd" id="1_s7c3p"]
[ext_resource type="Texture2D" uid="uid://cy4jggxmnohbb" path="res://sprites/chicken.png" id="2_h1rgn"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_4gyqm"]
size = Vector2(21, 23)
[sub_resource type="Animation" id="Animation_h1rgn"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Sprite2D:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [0]
}
[sub_resource type="Animation" id="Animation_s7c3p"]
resource_name = "flap"
length = 0.4
loop_mode = 2
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Sprite2D:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0.0009999999, 0.2, 0.4),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [0, 1, 2]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_7ellt"]
_data = {
&"RESET": SubResource("Animation_h1rgn"),
&"flap": SubResource("Animation_s7c3p")
}
[node name="EnemyChicken" type="Area2D" unique_id=1433837580 groups=["enemies"]]
scale = Vector2(0.7, 0.7)
script = ExtResource("1_s7c3p")
[node name="Sprite2D" type="Sprite2D" parent="." unique_id=2115910138]
texture = ExtResource("2_h1rgn")
hframes = 3
region_enabled = true
region_rect = Rect2(0, 0, 84, 32)
[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=1841693239]
scale = Vector2(1.5384617, 1.5384617)
shape = SubResource("RectangleShape2D_4gyqm")
[node name="MoveTimer" type="Timer" parent="." unique_id=1928257014]
one_shot = true
[node name="ShootTimer" type="Timer" parent="." unique_id=1985644907]
one_shot = true
[node name="AnimationPlayer" type="AnimationPlayer" parent="." unique_id=702523492]
libraries/ = SubResource("AnimationLibrary_7ellt")
autoplay = &"flap"
[connection signal="timeout" from="MoveTimer" to="." method="_on_timer_timeout"]
[connection signal="timeout" from="ShootTimer" to="." method="_on_shoot_timer_timeout"]

View file

@ -1,225 +0,0 @@
[gd_scene format=3 uid="uid://drwm27rxxpq3t"]
[ext_resource type="Script" uid="uid://xoihsrr4hw4k" path="res://scenes/enemy.gd" id="1_ainam"]
[ext_resource type="Texture2D" uid="uid://deyu1prtitqcp" path="res://_graphics/Mini Pixel Pack 3/Enemies/Bon_Bon (16 x 16).png" id="2_mo2s0"]
[ext_resource type="Texture2D" uid="uid://h04wm5a27u0" path="res://_graphics/Mini Pixel Pack 3/Effects/Explosion (16 x 16).png" id="3_1yn4p"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_4gyqm"]
size = Vector2(14, 8)
[sub_resource type="Animation" id="Animation_iifgy"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Sprite2D:texture")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [ExtResource("2_mo2s0")]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Sprite2D:hframes")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [4]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Sprite2D:frame")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [2]
}
[sub_resource type="Animation" id="Animation_qi2p4"]
resource_name = "bounce"
loop_mode = 1
step = 0.05
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Sprite2D:texture")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [ExtResource("2_mo2s0")]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Sprite2D:hframes")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [4]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Sprite2D:frame")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.1023555, 0.2, 0.3, 0.35),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 1,
"values": [2, 1, 0, 3, 0]
}
[sub_resource type="Animation" id="Animation_epg4t"]
resource_name = "explode"
step = 0.05
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Sprite2D:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 1,
"values": [0, 1, 2, 4, 5]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Sprite2D:texture")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [ExtResource("3_1yn4p")]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Sprite2D:hframes")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [6]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_3yqyl"]
_data = {
&"RESET": SubResource("Animation_iifgy"),
&"bounce": SubResource("Animation_qi2p4"),
&"explode": SubResource("Animation_epg4t")
}
[sub_resource type="Animation" id="Animation_ainam"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".: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="Animation" id="Animation_mo2s0"]
resource_name = "wiggle"
length = 3.0
loop_mode = 1
tracks/0/type = "bezier"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:position:x")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"handle_modes": PackedInt32Array(0, 2, 0, 2, 2),
"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 8, -0.16666667, 0, 0.083333336, 0, 0, -0.16666667, 0, 0, 0, -7, -0.083333336, 1.1666667, 0, 0, 0, -0.16666667, -1.1666667, 0, 0),
"times": PackedFloat32Array(0, 1, 1.5, 2, 3)
}
tracks/1/type = "bezier"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath(".:position:y")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"handle_modes": PackedInt32Array(0, 2, 0, 2, 2),
"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 7.162058, -0.16666667, -1.3333334, 0.083333336, 0.6666667, 12, -0.16666667, -2, 0, 0, 8, -0.083333336, 0.6666667, 0, 0, 0, -0.16666667, 1.3333334, 0, 0),
"times": PackedFloat32Array(0, 1, 1.5, 2, 3)
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_1yn4p"]
_data = {
&"RESET": SubResource("Animation_ainam"),
&"wiggle": SubResource("Animation_mo2s0")
}
[sub_resource type="Curve2D" id="Curve2D_1yn4p"]
_data = {
"points": PackedVector2Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, -13, 0, 0, 0, 0, 30, 9, 0, 0, 0, 0, 10, 23, 8.891694, -1.4366493, -8.891694, 1.4366493, 0, 27, 0, 0, 0, 0, -18, 7, 0, 0, 0, 0, -14, -11, 0, 0, 0, 0, 0, 0)
}
point_count = 8
[node name="EnemyTest" type="Area2D" unique_id=1433837580 groups=["enemies"]]
script = ExtResource("1_ainam")
[node name="Sprite2D" type="Sprite2D" parent="." unique_id=2115910138]
texture = ExtResource("2_mo2s0")
hframes = 4
frame = 2
[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=1841693239]
shape = SubResource("RectangleShape2D_4gyqm")
[node name="AnimationPlayer" type="AnimationPlayer" parent="." unique_id=505814518]
libraries/ = SubResource("AnimationLibrary_3yqyl")
autoplay = &"bounce"
[node name="AnimationWiggle" type="AnimationPlayer" parent="." unique_id=800893512]
libraries/ = SubResource("AnimationLibrary_1yn4p")
autoplay = &"MoveAlongPath"
[node name="MoveTimer" type="Timer" parent="." unique_id=1928257014]
one_shot = true
[node name="ShootTimer" type="Timer" parent="." unique_id=1985644907]
one_shot = true
[node name="Path2D" type="Path2D" parent="." unique_id=1830415709]
visible = false
curve = SubResource("Curve2D_1yn4p")
[node name="PathFollow2D" type="PathFollow2D" parent="Path2D" unique_id=1294967533]
visible = false
rotation = -0.7140907
[connection signal="timeout" from="MoveTimer" to="." method="_on_timer_timeout"]
[connection signal="timeout" from="ShootTimer" to="." method="_on_shoot_timer_timeout"]

View file

@ -1,22 +1,45 @@
extends Area2D
var goose_talking: bool = false
func _ready() -> void:
EventBus.goose_talk.connect(_on_goose_talk)
func _on_goose_talk(frame_index: int):
print("QUACK")
self.show()
$DapperGoose/Bubble.set_frame(frame_index)
var tween = create_tween()
tween.tween_property(self, "position:x", position.x - 50, .5).set_ease(tween.EASE_OUT)
await tween.finished
$DapperGoose/Bubble.show()
await get_tree().create_timer(3).timeout
$DapperGoose/Bubble.hide()
tween = create_tween()
tween.tween_property(self, "position:x", position.x + 50, .5).set_ease(tween.EASE_IN)
await tween.finished
self.hide()
#var quacking = get_tree().create_timer(3).timeout
if goose_talking == false:
print("QUACK")
#goose_talking = true
self.show()
$DapperGoose/Bubble.set_frame(frame_index)
var tween = create_tween()
tween.tween_property(self, "position:x", position.x - 50, .5).set_ease(tween.EASE_OUT)
await tween.finished
$DapperGoose/Bubble.show()
$DapperGoose/Quacking.start()
await $DapperGoose/Quacking.timeout
$DapperGoose/Bubble.hide()
goose_talking = false
tween = create_tween()
tween.tween_property(self, "position:x", position.x + 50, .5).set_ease(tween.EASE_IN)
await tween.finished
self.hide()
if goose_talking == true:
print("I'm interrupting")
$DapperGoose/Quacking.stop()
$DapperGosse/Bubble.set_frame(frame_index)
$DapperGoose/Quacking.start()
await $DapperGoose/Quacking.timeout
$DapperGoose/Bubble.hide()
goose_talking = false
tween = create_tween()
tween.tween_property(self, "position:x", position.x + 50, .5).set_ease(tween.EASE_IN)
await tween.finished
self.hide()

View file

@ -16,7 +16,10 @@ texture = ExtResource("1_wo8sg")
[node name="Bubble" type="Sprite2D" parent="DapperGoose" unique_id=2012258473]
position = Vector2(-108, -21)
texture = ExtResource("3_g7ad0")
hframes = 3
hframes = 4
[node name="Quacking" type="Timer" parent="DapperGoose" unique_id=1836315393]
wait_time = 3.0
[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=1718121082]
position = Vector2(-18.5, 1)

View file

@ -1,6 +1,5 @@
extends Node2D
var enemy = preload("res://scenes/enemy.tscn")
var player = preload("res://scenes/player.tscn")
var instance = null
var playing: bool = false
@ -78,7 +77,7 @@ func _on_player_died():
# get_tree().call_group("enemies", "queue_free")
# $Player.set_process(false)
# get_tree().call_group("enemies", "set_process", false)
enemy_win()
EventBus.goose_talk.emit(3)
instance.queue_free()
game_over.show()
await get_tree().create_timer(2).timeout
@ -117,7 +116,7 @@ func new_game():
# Tell the enemies to spawn!
#await get_tree().create_timer(.5).timeout
$Wave.spawn_enemies()
$Wave.spawn_enemies()
# Tell the game we're playing.
@ -145,6 +144,3 @@ func win_game():
game_over.hide()
$CanvasLayer/Title.show()
start_button.show()
func enemy_win() -> void:
print("Enemy win!")

View file

@ -9,7 +9,7 @@ z_index = -100
self_modulate = Color(0.09185078, 0.09185078, 0.09185078, 1)
z_index = 5
scroll_scale = Vector2(-1, 1)
scroll_offset = Vector2(-87, -1)
scroll_offset = Vector2(-88, -1)
repeat_size = Vector2(0, 64)
autoscroll = Vector2(0, 12)
repeat_times = 6
@ -24,7 +24,7 @@ region_rect = Rect2(0, 0, 64, 64)
[node name="Sprite2D2" type="Sprite2D" parent="Foreground" unique_id=197485442]
texture_repeat = 2
position = Vector2(293, 160)
position = Vector2(296, 160)
texture = ExtResource("1_b1x6b")
flip_h = true
hframes = 4

View file

@ -2,11 +2,11 @@ extends Node2D
var wave_count: int = 0
var enemy_count: int = 0
var enemy = preload("res://scenes/enemy.tscn")
var enemy = preload("res://scenes/enemy_chicken.tscn")
@export var wave_complete: bool = false
const COLS: int = 9
const COLS: int = 5
const ROWS: int = 3
func _ready():
@ -18,8 +18,8 @@ func spawn_enemies():
print("Enemy Wave: ", wave_count)
for x in range(COLS):
for y in range(ROWS):
var e = enemy.instantiate()
var pos = Vector2(x * (16 + 8) + 24, 16 * 4 + y * 16)
var e = enemy.instantiate()
var pos = Vector2(x * (28 + 4) + 56, 28 * 2 + y * 38)
add_child(e)
e.start(pos)
enemy_count = ROWS * COLS

View file

@ -1,6 +1,6 @@
[gd_scene format=3 uid="uid://drf1k1iulvy6f"]
[ext_resource type="Script" uid="uid://cqnotqarpsavn" path="res://wave.gd" id="1_y5ysc"]
[ext_resource type="Script" uid="uid://cqnotqarpsavn" path="res://scenes/wave.gd" id="1_y5ysc"]
[node name="Wave" type="Node2D" unique_id=2117861058]
script = ExtResource("1_y5ysc")

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Before After
Before After

BIN
sprites/chicken.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cy4jggxmnohbb"
path="res://.godot/imported/chicken.png-fad9cdcbe0face9d67d25185baea2fd4.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/chicken.png"
dest_files=["res://.godot/imported/chicken.png-fad9cdcbe0face9d67d25185baea2fd4.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1