Update spawner to be scene-based.

This commit is contained in:
Henry Faber 2026-06-30 20:16:26 +01:00
parent 8fe05e0c70
commit da9f947788
9 changed files with 59 additions and 46 deletions

View file

@ -3,11 +3,13 @@
[ext_resource type="PackedScene" uid="uid://ddpclu2vdy2ve" path="res://scenes/player_weapons/weapon_stock.tscn" id="1_pn64g"] [ext_resource type="PackedScene" uid="uid://ddpclu2vdy2ve" path="res://scenes/player_weapons/weapon_stock.tscn" id="1_pn64g"]
[ext_resource type="Script" uid="uid://7n1itonn35fm" path="res://scripts/weapon_shot.gd" id="2_4b7mw"] [ext_resource type="Script" uid="uid://7n1itonn35fm" path="res://scripts/weapon_shot.gd" id="2_4b7mw"]
[ext_resource type="Script" uid="uid://d0ios82vubijg" path="res://scripts/weapon_projectile_group.gd" id="2_ak5x4"] [ext_resource type="Script" uid="uid://d0ios82vubijg" path="res://scripts/weapon_projectile_group.gd" id="2_ak5x4"]
[ext_resource type="Texture2D" uid="uid://dwc5fjwhqikoo" path="res://graphics/spread.png" id="3_ak5x4"]
[resource] [resource]
script = ExtResource("2_4b7mw") script = ExtResource("2_4b7mw")
shot_name = "spread" shot_name = "spread"
bullet_scene = ExtResource("1_pn64g") bullet_scene = ExtResource("1_pn64g")
pickup_icon = ExtResource("3_ak5x4")
damage = 5 damage = 5
speed = 720 speed = 720
projectiles = 5 projectiles = 5

View file

@ -3,11 +3,13 @@
[ext_resource type="PackedScene" uid="uid://ddpclu2vdy2ve" path="res://scenes/player_weapons/weapon_stock.tscn" id="1_lcw6o"] [ext_resource type="PackedScene" uid="uid://ddpclu2vdy2ve" path="res://scenes/player_weapons/weapon_stock.tscn" id="1_lcw6o"]
[ext_resource type="Script" uid="uid://d0ios82vubijg" path="res://scripts/weapon_projectile_group.gd" id="2_e245k"] [ext_resource type="Script" uid="uid://d0ios82vubijg" path="res://scripts/weapon_projectile_group.gd" id="2_e245k"]
[ext_resource type="Script" uid="uid://7n1itonn35fm" path="res://scripts/weapon_shot.gd" id="2_ym48c"] [ext_resource type="Script" uid="uid://7n1itonn35fm" path="res://scripts/weapon_shot.gd" id="2_ym48c"]
[ext_resource type="Texture2D" uid="uid://dtggedl0127vk" path="res://graphics/stock.png" id="3_e245k"]
[resource] [resource]
script = ExtResource("2_ym48c") script = ExtResource("2_ym48c")
shot_name = "stock" shot_name = "stock"
bullet_scene = ExtResource("1_lcw6o") bullet_scene = ExtResource("1_lcw6o")
pickup_icon = ExtResource("3_e245k")
damage = 2 damage = 2
speed = 650 speed = 650
horizontal_offset = 12.0 horizontal_offset = 12.0

View file

@ -1,13 +1,15 @@
[gd_resource type="Resource" script_class="WeaponShot" format=3 uid="uid://cck3gmnhu5agc"] [gd_resource type="Resource" script_class="WeaponShot" format=3 uid="uid://cck3gmnhu5agc"]
[ext_resource type="PackedScene" uid="uid://clpyd8qfwthk2" path="res://scenes/player_weapons/weapon_spreadshot.tscn" id="1_07hyh"] [ext_resource type="PackedScene" uid="uid://ddpclu2vdy2ve" path="res://scenes/player_weapons/weapon_stock.tscn" id="1_bhv8k"]
[ext_resource type="Script" uid="uid://d0ios82vubijg" path="res://scripts/weapon_projectile_group.gd" id="2_bhv8k"] [ext_resource type="Script" uid="uid://d0ios82vubijg" path="res://scripts/weapon_projectile_group.gd" id="2_bhv8k"]
[ext_resource type="Script" uid="uid://7n1itonn35fm" path="res://scripts/weapon_shot.gd" id="2_syw6j"] [ext_resource type="Script" uid="uid://7n1itonn35fm" path="res://scripts/weapon_shot.gd" id="2_syw6j"]
[ext_resource type="Texture2D" uid="uid://cne450xyao5xl" path="res://graphics/tri.png" id="3_fw2v3"]
[resource] [resource]
script = ExtResource("2_syw6j") script = ExtResource("2_syw6j")
shot_name = "tri" shot_name = "tri"
bullet_scene = ExtResource("1_07hyh") bullet_scene = ExtResource("1_bhv8k")
pickup_icon = ExtResource("3_fw2v3")
damage = 3 damage = 3
speed = 700 speed = 700
projectiles = 3 projectiles = 3

View file

@ -4,11 +4,13 @@
[ext_resource type="Script" uid="uid://d0ios82vubijg" path="res://scripts/weapon_projectile_group.gd" id="2_qeb4b"] [ext_resource type="Script" uid="uid://d0ios82vubijg" path="res://scripts/weapon_projectile_group.gd" id="2_qeb4b"]
[ext_resource type="Script" uid="uid://7n1itonn35fm" path="res://scripts/weapon_shot.gd" id="3_fh2eq"] [ext_resource type="Script" uid="uid://7n1itonn35fm" path="res://scripts/weapon_shot.gd" id="3_fh2eq"]
[ext_resource type="Resource" uid="uid://ch8qch6lx1mdx" path="res://resources/player_weapon_resources/patterns/phallanx.tres" id="3_qeb4b"] [ext_resource type="Resource" uid="uid://ch8qch6lx1mdx" path="res://resources/player_weapon_resources/patterns/phallanx.tres" id="3_qeb4b"]
[ext_resource type="Texture2D" uid="uid://dsjhp3mh5pqg3" path="res://graphics/vanguard+.png" id="4_fh2eq"]
[resource] [resource]
script = ExtResource("3_fh2eq") script = ExtResource("3_fh2eq")
shot_name = "vanguard+" shot_name = "vanguard+"
bullet_scene = ExtResource("1_lqlv8") bullet_scene = ExtResource("1_lqlv8")
pickup_icon = ExtResource("4_fh2eq")
damage = 5 damage = 5
speed = 500 speed = 500
projectiles = 5 projectiles = 5

View file

@ -3,11 +3,13 @@
[ext_resource type="PackedScene" uid="uid://ddpclu2vdy2ve" path="res://scenes/player_weapons/weapon_stock.tscn" id="1_hm46f"] [ext_resource type="PackedScene" uid="uid://ddpclu2vdy2ve" path="res://scenes/player_weapons/weapon_stock.tscn" id="1_hm46f"]
[ext_resource type="Script" uid="uid://7n1itonn35fm" path="res://scripts/weapon_shot.gd" id="2_w7xlm"] [ext_resource type="Script" uid="uid://7n1itonn35fm" path="res://scripts/weapon_shot.gd" id="2_w7xlm"]
[ext_resource type="Script" uid="uid://d0ios82vubijg" path="res://scripts/weapon_projectile_group.gd" id="2_xf183"] [ext_resource type="Script" uid="uid://d0ios82vubijg" path="res://scripts/weapon_projectile_group.gd" id="2_xf183"]
[ext_resource type="Texture2D" uid="uid://b34vaaw3u84ae" path="res://graphics/vanguard.png" id="3_xf183"]
[resource] [resource]
script = ExtResource("2_w7xlm") script = ExtResource("2_w7xlm")
shot_name = "vanguard" shot_name = "vanguard"
bullet_scene = ExtResource("1_hm46f") bullet_scene = ExtResource("1_hm46f")
pickup_icon = ExtResource("3_xf183")
damage = 5 damage = 5
speed = 500 speed = 500
projectiles = 5 projectiles = 5

View file

@ -1,16 +1,20 @@
[gd_scene format=3 uid="uid://du5nub2keaty3"] [gd_scene format=3 uid="uid://du5nub2keaty3"]
[ext_resource type="Script" uid="uid://qf6mgn4117o" path="res://scripts/power_up_spawner.gd" id="1_85wk8"] [ext_resource type="PackedScene" uid="uid://c9k2p5m8xrq4" path="res://scenes/powerup_pickup.tscn" id="1_xk8p2"]
[ext_resource type="Script" uid="uid://7n1itonn35fm" path="res://scripts/weapon_shot.gd" id="2_07x44"] [ext_resource type="Script" uid="uid://qf6mgn4117o" path="res://scripts/power_up_spawner.gd" id="2_9m3n7"]
[ext_resource type="Resource" uid="uid://b75ae840k03dy" path="res://resources/player_weapon_resources/stock.tres" id="3_0eev3"] [ext_resource type="Script" uid="uid://7n1itonn35fm" path="res://scripts/weapon_shot.gd" id="3_07x44"]
[ext_resource type="Resource" uid="uid://cck3gmnhu5agc" path="res://resources/player_weapon_resources/tri.tres" id="4_qqjui"] [ext_resource type="Resource" uid="uid://b75ae840k03dy" path="res://resources/player_weapon_resources/stock.tres" id="4_0eev3"]
[ext_resource type="Resource" uid="uid://ds53sryglmf27" path="res://resources/player_weapon_resources/spread.tres" id="5_mwa7c"] [ext_resource type="Resource" uid="uid://cck3gmnhu5agc" path="res://resources/player_weapon_resources/tri.tres" id="5_qqjui"]
[ext_resource type="Resource" uid="uid://bhc6aja38vyr" path="res://resources/player_weapon_resources/vanguard.tres" id="6_vphcr"] [ext_resource type="Resource" uid="uid://ds53sryglmf27" path="res://resources/player_weapon_resources/spread.tres" id="6_mwa7c"]
[ext_resource type="Resource" uid="uid://c41aoyka7nfr8" path="res://resources/player_weapon_resources/vanguard+.tres" id="7_g67dp"] [ext_resource type="Resource" uid="uid://bhc6aja38vyr" path="res://resources/player_weapon_resources/vanguard.tres" id="7_vphcr"]
[ext_resource type="Resource" uid="uid://c41aoyka7nfr8" path="res://resources/player_weapon_resources/vanguard+.tres" id="8_g67dp"]
[node name="PowerUpSpawner" type="Node2D" unique_id=1191463626] [node name="PowerUpSpawner" type="Node2D" unique_id=1191463626]
script = ExtResource("1_85wk8") script = ExtResource("2_9m3n7")
all_weapon_shots = Array[ExtResource("2_07x44")]([ExtResource("3_0eev3"), ExtResource("4_qqjui"), ExtResource("5_mwa7c"), ExtResource("6_vphcr"), ExtResource("7_g67dp")]) pickup_scene = ExtResource("1_xk8p2")
all_weapon_shots = Array[ExtResource("3_07x44")](
[ExtResource("4_0eev3"), ExtResource("5_qqjui"), ExtResource("6_mwa7c"), ExtResource("7_vphcr"), ExtResource("8_g67dp")]
)
[node name="SpawnTimer" type="Timer" parent="." unique_id=173111015] [node name="SpawnTimer" type="Timer" parent="." unique_id=173111015]
wait_time = 5.0 wait_time = 5.0

View file

@ -0,0 +1,10 @@
[gd_scene format=3 uid="uid://dsqfuv86suu17"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_mmgg1"]
size = Vector2(14, 14)
[node name="PowerUpPickup" type="Area2D" unique_id=478708932]
collision_mask = 0
[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=347643413]
shape = SubResource("RectangleShape2D_mmgg1")

View file

@ -3,6 +3,9 @@ class_name PowerUpSpawner extends Node2D
@export var spawn_interval: float = 5.0 @export var spawn_interval: float = 5.0
@export var test_mode: bool = true @export var test_mode: bool = true
# PackedScene for the pickup template — configure in the scene editor.
@export var pickup_scene: PackedScene
@onready var screensize: Vector2 = get_viewport().content_scale_size @onready var screensize: Vector2 = get_viewport().content_scale_size
@onready var spawn_timer: Timer = $SpawnTimer @onready var spawn_timer: Timer = $SpawnTimer
@ -31,7 +34,8 @@ func _spawn_test_pickups() -> void:
for weapon: WeaponShot in all_weapon_shots: for weapon: WeaponShot in all_weapon_shots:
if weapon == null or weapon.shot_name.is_empty(): if weapon == null or weapon.shot_name.is_empty():
continue continue
var pickup := _create_pickup(weapon)
var pickup := _spawn_pickup(weapon)
if not is_instance_valid(pickup): if not is_instance_valid(pickup):
continue # skipped — no valid icon continue # skipped — no valid icon
@ -61,45 +65,27 @@ func pickup_collected() -> void:
_pickups_spawned = 0 _pickups_spawned = 0
func _create_pickup(weapon: WeaponShot) -> Area2D: func _spawn_pickup(weapon: WeaponShot) -> Area2D:
var pickup := Area2D.new() # Validate that the weapon has a pickup icon configured.
pickup.name = "PowerUpPickup" if weapon.pickup_icon == null:
printerr("[PowerUpSpawner] No pickup icon set for weapon: ", weapon.shot_name)
var dead := Area2D.new() # return a dead node — caller skips it
dead.queue_free()
return dead
# Icon texture — load from graphics/ matching the weapon's shot_name. # Instantiate the scene template and attach weapon metadata.
var icon_path := "res://graphics/" + weapon.shot_name.replace(" ", "") + ".png" var pickup := pickup_scene.instantiate() as Area2D
var icon_tex := load(icon_path) as Texture2D if pickup == null:
if icon_tex == null: printerr("[PowerUpSpawner] Failed to instantiate pickup scene.")
printerr("[PowerUpSpawner] No texture found for weapon: ", weapon.shot_name) return null
pickup.queue_free() # return a dead node — caller skips it
return pickup
pickup.set_meta("weapon_shot", weapon)
# Add the icon node at runtime (scene has no TextureRect to avoid null-dependency issues).
var icon := TextureRect.new() var icon := TextureRect.new()
icon.texture = icon_tex icon.texture = weapon.pickup_icon
icon.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED icon.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED
icon.size = Vector2(16, 16) icon.size = Vector2(16, 16)
pickup.add_child(icon) pickup.add_child(icon)
# Collision shape — small rectangle matching the icon.
var shape := RectangleShape2D.new()
shape.size = Vector2(14, 14)
var collision := CollisionShape2D.new()
collision.shape = shape
pickup.add_child(collision)
# Store the weapon reference so we know what to give the player.
pickup.set_meta("weapon_shot", weapon)
# Configure collision so HelpBoxArea (Layer 2, Mask 1) detects it.
pickup.collision_layer = 1
pickup.collision_mask = 0
return pickup return pickup
# --- Timer control ---
# Direct stop/start — no guard conditions. The timer's paused property
# can cause deadlock if the guard checks "not paused" after stop().

View file

@ -11,6 +11,9 @@ extends Resource
# PackedScene reference to the bullet / projectile scene instantiated on fire. # PackedScene reference to the bullet / projectile scene instantiated on fire.
@export var bullet_scene: PackedScene @export var bullet_scene: PackedScene
# Icon used when this weapon appears as a powerup pickup on the field.
@export var pickup_icon: Texture2D
@export_subgroup("Launch") @export_subgroup("Launch")