Added rough CRT enemy; roughed in wave tracking and enemy switching; new

game resets wave_count to 0.
This commit is contained in:
Henry 2026-02-15 22:58:40 +00:00
parent 1da24eb0e6
commit 26803702b1
14 changed files with 383 additions and 16 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 599 B

After

Width:  |  Height:  |  Size: 169 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 629 B

After

Width:  |  Height:  |  Size: 184 B

Before After
Before After

56
scenes/enemy_crt.gd Normal file
View file

@ -0,0 +1,56 @@
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
EventBus.enemy_hit.emit(5)
speed = 0
$AnimationPlayer.play("explode")
#set_deferred("monitoring", false)
await $AnimationPlayer.animation_finished
queue_free()
EventBus.enemy_died.emit()

1
scenes/enemy_crt.gd.uid Normal file
View file

@ -0,0 +1 @@
uid://7ls7phfcupal

225
scenes/enemy_crt.tscn Normal file
View file

@ -0,0 +1,225 @@
[gd_scene format=3 uid="uid://dm0pkef7wmwuq"]
[ext_resource type="Script" uid="uid://i0r17jo6838m" path="res://scenes/enemy_chicken.gd" id="1_0vjqj"]
[ext_resource type="Texture2D" uid="uid://b5pswf7r8b7j4" path="res://sprites/crt.png" id="2_emiuq"]
[ext_resource type="Texture2D" uid="uid://cy4jggxmnohbb" path="res://sprites/chicken.png" id="2_ugdur"]
[ext_resource type="Texture2D" uid="uid://bm7fgqwqfqmf4" path="res://sprites/explosion_pallete-swap.png" id="3_emiuq"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_4gyqm"]
size = Vector2(45.71434, 40.000053)
[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]
}
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("2_ugdur")]
}
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": [3]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Sprite2D:region_rect")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Rect2(0, 0, 84, 32)]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("AnimationPlayer:speed_scale")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [1.0]
}
[sub_resource type="Animation" id="Animation_7ellt"]
resource_name = "explode"
step = 0.2
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("3_emiuq")]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Sprite2D:frame")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.2, 0.4, 0.6, 0.8),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 1,
"values": [0, 1, 2, 3, 4]
}
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": [5]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Sprite2D:region_rect")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Rect2(0, 0, 80, 16)]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("AnimationPlayer:speed_scale")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [1.5]
}
[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]
}
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("2_ugdur")]
}
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": [3]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Sprite2D:region_rect")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Rect2(0, 0, 84, 32)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_7ellt"]
_data = {
&"RESET": SubResource("Animation_h1rgn"),
&"explode": SubResource("Animation_7ellt"),
&"flap": SubResource("Animation_s7c3p")
}
[node name="EnemyCRT" type="Area2D" unique_id=1433837580 groups=["enemies"]]
scale = Vector2(1.1, 1.1)
script = ExtResource("1_0vjqj")
[node name="Sprite2D" type="Sprite2D" parent="." unique_id=2115910138]
scale = Vector2(1.44, 1.44)
texture = ExtResource("2_emiuq")
hframes = 3
region_enabled = true
region_rect = Rect2(0, 0, 96, 28)
[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=1841693239]
position = Vector2(-1.8732879e-06, -1.9584381e-06)
scale = Vector2(0.99999857, 0.99999857)
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]
active = false
libraries/ = SubResource("AnimationLibrary_7ellt")
[connection signal="timeout" from="MoveTimer" to="." method="_on_timer_timeout"]
[connection signal="timeout" from="ShootTimer" to="." method="_on_shoot_timer_timeout"]

View file

@ -116,6 +116,7 @@ func new_game():
# Tell the enemies to spawn!
#await get_tree().create_timer(.5).timeout
$Wave.wave_count = 0
$Wave.spawn_enemies()

View file

@ -79,11 +79,14 @@ offset_bottom = 36.0
[node name="Title" type="TextureRect" parent="CanvasLayer" unique_id=561106216]
self_modulate = Color(0.015236704, 0.015236706, 0.0152367065, 1)
material = SubResource("ShaderMaterial_kek77")
offset_left = 70.0
offset_top = 58.0
offset_right = 166.0
offset_bottom = 125.0
offset_left = 29.0
offset_top = 101.0
offset_right = 269.0
offset_bottom = 166.0
scale = Vector2(0.75, 0.75)
size_flags_horizontal = 4
texture = ExtResource("5_tipki")
stretch_mode = 3
[node name="CenterContainer" type="CenterContainer" parent="CanvasLayer" unique_id=1787047882]
anchors_preset = 15
@ -121,5 +124,6 @@ stream = ExtResource("10_choun")
volume_db = -0.5
[node name="Wave" parent="." unique_id=2117861058 instance=ExtResource("11_ya4ey")]
wave_complete = null
[connection signal="pressed" from="CanvasLayer/CenterContainer/Start" to="." method="_on_start_pressed"]

View file

@ -136,6 +136,7 @@ shape = SubResource("RectangleShape2D_op7ga")
one_shot = true
[node name="Explosion" parent="." unique_id=321630316 instance=ExtResource("8_dw050")]
visible = false
texture = ExtResource("10_d2wvv")
region_enabled = true
region_rect = Rect2(0, 0, 96, 16)

View file

@ -2,29 +2,49 @@ extends Node2D
var wave_count: int = 0
var enemy_count: int = 0
var enemy = preload("res://scenes/enemy_chicken.tscn")
var enemy = null
@export var wave_complete: bool = false
const COLS: int = 5
const ROWS: int = 3
const CHICKEN = preload("res://scenes/enemy_chicken.tscn")
const CRT = preload("res://scenes/enemy_CRT.tscn")
func _ready():
wave_count += 1
wave_count = 0
EventBus.enemy_died.connect(_on_enemy_died)
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 * (28 + 4) + 56, 28 * 2 + y * 38)
add_child(e)
e.start(pos)
enemy_count = ROWS * COLS
await get_tree().process_frame
print_debug("Remaining enemies: ", enemy_count, ", ", get_tree().get_nodes_in_group("enemies").size())
if wave_count == 0: #This is for CHICKENS
print("Enemy Wave: ", wave_count)
enemy = CHICKEN
for x in range(COLS):
for y in range(ROWS):
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
await get_tree().process_frame
print_debug("Remaining enemies: ", enemy_count, ", ", get_tree().get_nodes_in_group("enemies").size())
if wave_count == 1: #This is for CRTs
print("Enemy Wave: ", wave_count)
enemy = CRT
for x in range(COLS):
for y in range(ROWS):
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
await get_tree().process_frame
print_debug("Remaining enemies: ", enemy_count, ", ", get_tree().get_nodes_in_group("enemies").size())
func _on_enemy_died():

View file

@ -0,0 +1,18 @@
shader_type canvas_item;
uniform float flash_value : hint_range(0.0, 1.0) = 0.0;
void vertex() {
// Called for every vertex the material is visible on.
}
void fragment() {
vec4 original_color = COLOR;
vec4 flash_color = vec4(1.0, 1.0, 1.0, 1.0); // White color
COLOR = mix(original_color, flash_color, flash_value);
}
//void light() {
// // Called for every pixel for every light affecting the CanvasItem.
// // Uncomment to replace the default light processing function with this one.
//}

View file

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

BIN
sprites/crt.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 401 B

40
sprites/crt.png.import Normal file
View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b5pswf7r8b7j4"
path="res://.godot/imported/crt.png-e54154c66d7f8bd69bbbbb6583434a1a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/crt.png"
dest_files=["res://.godot/imported/crt.png-e54154c66d7f8bd69bbbbb6583434a1a.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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 422 B

After

Width:  |  Height:  |  Size: 692 B

Before After
Before After