From 79122a074e0d2cf1081a2bd8d7d88e7b1e595cdb Mon Sep 17 00:00:00 2001 From: henry Date: Mon, 8 Jun 2026 22:36:07 +0100 Subject: [PATCH 1/8] Attempt to refactor components. --- scenes/{player_revision.tscn => _player.tscn} | 57 ++------ scenes/player.tscn | 54 ++++++-- {scripts => scenes}/player_component.gd | 12 +- {scripts => scenes}/player_component.gd.uid | 0 scenes/player_refactor.gd | 4 +- scenes/stock_weapon.gd | 13 +- scenes/stock_weapon_single_old.tscn | 1 - scenes/world.tscn | 3 +- scripts/components.gd | 131 ++++++++++++++++++ scripts/components.gd.uid | 1 + scripts/movement_component.gd | 63 +++++---- scripts/player_shot.gd | 2 +- scripts/shoot_component.gd | 2 +- scripts/weapon_component.gd | 7 +- scripts/weapon_shot.gd | 3 +- 15 files changed, 241 insertions(+), 112 deletions(-) rename scenes/{player_revision.tscn => _player.tscn} (62%) rename {scripts => scenes}/player_component.gd (94%) rename {scripts => scenes}/player_component.gd.uid (100%) create mode 100644 scripts/components.gd create mode 100644 scripts/components.gd.uid diff --git a/scenes/player_revision.tscn b/scenes/_player.tscn similarity index 62% rename from scenes/player_revision.tscn rename to scenes/_player.tscn index af64ddf..819bc2b 100644 --- a/scenes/player_revision.tscn +++ b/scenes/_player.tscn @@ -1,29 +1,24 @@ -[gd_scene format=3 uid="uid://6wq3ynesnsha"] +[gd_scene format=3 uid="uid://coix5dqblmu7r"] -[ext_resource type="Script" uid="uid://dulfr27gg4evl" path="res://scripts/player_component.gd" id="1_3ef36"] -[ext_resource type="PackedScene" uid="uid://ddpclu2vdy2ve" path="res://scenes/stock_weapon.tscn" id="2_l5qtw"] -[ext_resource type="Texture2D" uid="uid://cq4we1m1yv22s" path="res://graphics/ship.png" id="3_63g5k"] -[ext_resource type="Script" uid="uid://dss0dbwr71y6m" path="res://scripts/input_component.gd" id="4_14jeh"] -[ext_resource type="Texture2D" uid="uid://b0iavxi8vaxtj" path="res://graphics/ship_thrusters.png" id="4_tg2o1"] -[ext_resource type="Texture2D" uid="uid://crmbupr3qg0j" path="res://graphics/muzzle_flash.png" id="5_ohfsq"] -[ext_resource type="Script" uid="uid://c0rikbakpcags" path="res://scripts/movement_component.gd" id="6_l5qtw"] -[ext_resource type="Script" uid="uid://bgd1hwindc2ui" path="res://scripts/shoot_component.gd" id="7_63g5k"] -[ext_resource type="Script" uid="uid://ylmao2ndp22y" path="res://scripts/weapon_component.gd" id="8_ohfsq"] +[ext_resource type="Script" uid="uid://bqxrdf7mtx0ev" path="res://scenes/player_refactor.gd" id="1_qlg0r"] +[ext_resource type="Texture2D" uid="uid://cq4we1m1yv22s" path="res://graphics/ship.png" id="2_qhqgy"] +[ext_resource type="Texture2D" uid="uid://crmbupr3qg0j" path="res://graphics/muzzle_flash.png" id="4_dqkch"] +[ext_resource type="Texture2D" uid="uid://b0iavxi8vaxtj" path="res://graphics/ship_thrusters.png" id="5_qlg0r"] [sub_resource type="AtlasTexture" id="AtlasTexture_tuyoq"] -atlas = ExtResource("4_tg2o1") +atlas = ExtResource("5_qlg0r") region = Rect2(28, 0, 14, 6) [sub_resource type="AtlasTexture" id="AtlasTexture_fjrip"] -atlas = ExtResource("4_tg2o1") +atlas = ExtResource("5_qlg0r") region = Rect2(42, 0, 14, 6) [sub_resource type="AtlasTexture" id="AtlasTexture_smehm"] -atlas = ExtResource("4_tg2o1") +atlas = ExtResource("5_qlg0r") region = Rect2(1, 0, 14, 6) [sub_resource type="AtlasTexture" id="AtlasTexture_ur7pv"] -atlas = ExtResource("4_tg2o1") +atlas = ExtResource("5_qlg0r") region = Rect2(15, 0, 14, 6) [sub_resource type="SpriteFrames" id="SpriteFrames_y4r1p"] @@ -52,15 +47,15 @@ animations = [{ }] [sub_resource type="AtlasTexture" id="AtlasTexture_qlg0r"] -atlas = ExtResource("5_ohfsq") +atlas = ExtResource("4_dqkch") region = Rect2(0, 0, 15, 8) [sub_resource type="AtlasTexture" id="AtlasTexture_y4r1p"] -atlas = ExtResource("5_ohfsq") +atlas = ExtResource("4_dqkch") region = Rect2(15, 0, 15, 8) [sub_resource type="AtlasTexture" id="AtlasTexture_d2wvv"] -atlas = ExtResource("5_ohfsq") +atlas = ExtResource("4_dqkch") region = Rect2(30, 0, 15, 8) [sub_resource type="SpriteFrames" id="SpriteFrames_3v2ag"] @@ -90,11 +85,11 @@ size = Vector2(24, 30) size = Vector2(6, 5.75) [node name="Player" type="Area2D" unique_id=652131079] -script = ExtResource("1_3ef36") +script = ExtResource("1_qlg0r") [node name="Ship" type="Sprite2D" parent="." unique_id=1155866924] unique_name_in_owner = true -texture = ExtResource("3_63g5k") +texture = ExtResource("2_qhqgy") hframes = 3 region_rect = Rect2(0, 0, 62, 24.370766) @@ -106,7 +101,6 @@ autoplay = "fwd" [node name="MuzzleFlash" type="AnimatedSprite2D" parent="Ship" unique_id=1584132038] unique_name_in_owner = true -visible = false position = Vector2(0.5, -16) sprite_frames = SubResource("SpriteFrames_3v2ag") animation = &"stock" @@ -131,27 +125,4 @@ debug_color = Color(0.9843137, 0, 0, 0.80784315) [node name="WeaponCooldown" type="Timer" parent="." unique_id=269678170] -[node name="InputComponent" type="Node" parent="." unique_id=2022056363] -unique_name_in_owner = true -script = ExtResource("4_14jeh") -metadata/_custom_type_script = "uid://dss0dbwr71y6m" - -[node name="MovementComponent" type="Node" parent="." unique_id=964075256 node_paths=PackedStringArray("player")] -unique_name_in_owner = true -script = ExtResource("6_l5qtw") -player = NodePath("..") -speed = 200.0 -metadata/_custom_type_script = "uid://c0rikbakpcags" - -[node name="ShootComponent" type="Node" parent="." unique_id=623642425] -unique_name_in_owner = true -script = ExtResource("7_63g5k") -metadata/_custom_type_script = "uid://bgd1hwindc2ui" - -[node name="WeaponComponent" type="Node" parent="." unique_id=1648685183] -unique_name_in_owner = true -script = ExtResource("8_ohfsq") -weapon_current = ExtResource("2_l5qtw") -metadata/_custom_type_script = "uid://ylmao2ndp22y" - [connection signal="timeout" from="WeaponCooldown" to="." method="_on_weapon_cooldown_timeout"] diff --git a/scenes/player.tscn b/scenes/player.tscn index 819bc2b..613f498 100644 --- a/scenes/player.tscn +++ b/scenes/player.tscn @@ -1,9 +1,14 @@ -[gd_scene format=3 uid="uid://coix5dqblmu7r"] +[gd_scene format=3 uid="uid://6wq3ynesnsha"] -[ext_resource type="Script" uid="uid://bqxrdf7mtx0ev" path="res://scenes/player_refactor.gd" id="1_qlg0r"] +[ext_resource type="Script" uid="uid://dulfr27gg4evl" path="res://scenes/player_component.gd" id="1_ur7pv"] [ext_resource type="Texture2D" uid="uid://cq4we1m1yv22s" path="res://graphics/ship.png" id="2_qhqgy"] [ext_resource type="Texture2D" uid="uid://crmbupr3qg0j" path="res://graphics/muzzle_flash.png" id="4_dqkch"] +[ext_resource type="Script" uid="uid://dss0dbwr71y6m" path="res://scripts/input_component.gd" id="4_smehm"] [ext_resource type="Texture2D" uid="uid://b0iavxi8vaxtj" path="res://graphics/ship_thrusters.png" id="5_qlg0r"] +[ext_resource type="Script" uid="uid://c0rikbakpcags" path="res://scripts/movement_component.gd" id="5_ur7pv"] +[ext_resource type="Script" uid="uid://bgd1hwindc2ui" path="res://scripts/shoot_component.gd" id="6_y4r1p"] +[ext_resource type="Script" uid="uid://ylmao2ndp22y" path="res://scripts/weapon_component.gd" id="7_d2wvv"] +[ext_resource type="PackedScene" uid="uid://ddpclu2vdy2ve" path="res://scenes/stock_weapon.tscn" id="8_3v2ag"] [sub_resource type="AtlasTexture" id="AtlasTexture_tuyoq"] atlas = ExtResource("5_qlg0r") @@ -84,45 +89,70 @@ size = Vector2(24, 30) [sub_resource type="RectangleShape2D" id="RectangleShape2D_dqkch"] size = Vector2(6, 5.75) -[node name="Player" type="Area2D" unique_id=652131079] -script = ExtResource("1_qlg0r") +[node name="PlayerComponent" type="Node" unique_id=1732759225] -[node name="Ship" type="Sprite2D" parent="." unique_id=1155866924] +[node name="Player" type="Area2D" parent="." unique_id=652131079] +script = ExtResource("1_ur7pv") + +[node name="Ship" type="Sprite2D" parent="Player" unique_id=1155866924] unique_name_in_owner = true texture = ExtResource("2_qhqgy") hframes = 3 region_rect = Rect2(0, 0, 62, 24.370766) -[node name="Thrusters" type="AnimatedSprite2D" parent="Ship" unique_id=2096876587] +[node name="Thrusters" type="AnimatedSprite2D" parent="Player/Ship" unique_id=2096876587] position = Vector2(0, 15) sprite_frames = SubResource("SpriteFrames_y4r1p") animation = &"fwd" autoplay = "fwd" -[node name="MuzzleFlash" type="AnimatedSprite2D" parent="Ship" unique_id=1584132038] +[node name="MuzzleFlash" type="AnimatedSprite2D" parent="Player/Ship" unique_id=1584132038] unique_name_in_owner = true +visible = false position = Vector2(0.5, -16) sprite_frames = SubResource("SpriteFrames_3v2ag") animation = &"stock" autoplay = "stock" -[node name="MuzzleBox" type="CollisionShape2D" parent="." unique_id=1042837273] +[node name="MuzzleBox" type="CollisionShape2D" parent="Player" unique_id=1042837273] unique_name_in_owner = true position = Vector2(0, -17) shape = SubResource("RectangleShape2D_qlg0r") disabled = true debug_color = Color(1, 0.5058824, 0.21960784, 0.41960785) -[node name="HelpBox" type="CollisionShape2D" parent="." unique_id=938667427] +[node name="HelpBox" type="CollisionShape2D" parent="Player" unique_id=938667427] position = Vector2(0, 3) shape = SubResource("RectangleShape2D_tuyoq") debug_color = Color(0, 1, 0, 0.41960785) -[node name="HitBox" type="CollisionShape2D" parent="." unique_id=485826453] +[node name="HitBox" type="CollisionShape2D" parent="Player" unique_id=485826453] position = Vector2(0, 2) shape = SubResource("RectangleShape2D_dqkch") debug_color = Color(0.9843137, 0, 0, 0.80784315) -[node name="WeaponCooldown" type="Timer" parent="." unique_id=269678170] +[node name="WeaponCooldown" type="Timer" parent="Player" unique_id=269678170] -[connection signal="timeout" from="WeaponCooldown" to="." method="_on_weapon_cooldown_timeout"] +[node name="InputComponent" type="Node" parent="." unique_id=2022056363] +unique_name_in_owner = true +script = ExtResource("4_smehm") +metadata/_custom_type_script = "uid://dss0dbwr71y6m" + +[node name="MovementComponent" type="Node" parent="." unique_id=964075256] +unique_name_in_owner = true +script = ExtResource("5_ur7pv") +speed = 200.0 +metadata/_custom_type_script = "uid://c0rikbakpcags" + +[node name="ShootComponent" type="Node" parent="." unique_id=623642425] +unique_name_in_owner = true +script = ExtResource("6_y4r1p") +metadata/_custom_type_script = "uid://bgd1hwindc2ui" + +[node name="WeaponComponent" type="Node" parent="." unique_id=1648685183] +unique_name_in_owner = true +script = ExtResource("7_d2wvv") +weapon_current = ExtResource("8_3v2ag") +metadata/_custom_type_script = "uid://ylmao2ndp22y" + +[connection signal="timeout" from="Player/WeaponCooldown" to="Player" method="_on_weapon_cooldown_timeout"] diff --git a/scripts/player_component.gd b/scenes/player_component.gd similarity index 94% rename from scripts/player_component.gd rename to scenes/player_component.gd index e8d4a21..8e826f6 100644 --- a/scripts/player_component.gd +++ b/scenes/player_component.gd @@ -1,4 +1,4 @@ -class_name Player extends Area2D +class_name Player extends Node # Components managed by Player @onready var input_component: InputComponent = %InputComponent @@ -17,20 +17,18 @@ var travel: float = 0 func _process(delta) -> void: - + # Read Controls input_component.update() - + # Read Shooting if input_component.shooting: is_shooting = true else: is_shooting = false - + if is_shooting == true: shoot_component.shoot() - + # Read Movement Component movement_component.input = input_component.move_dir movement_component.tick(delta) - - diff --git a/scripts/player_component.gd.uid b/scenes/player_component.gd.uid similarity index 100% rename from scripts/player_component.gd.uid rename to scenes/player_component.gd.uid diff --git a/scenes/player_refactor.gd b/scenes/player_refactor.gd index 42a2119..5aca39a 100644 --- a/scenes/player_refactor.gd +++ b/scenes/player_refactor.gd @@ -101,7 +101,7 @@ func shoot(): # Instantiate the bullets var bullet = weapon_current.instantiate() get_tree().root.add_child(bullet) - prints(bullet_resource.speed,bullet_resource.projectiles, bullet_resource.projectile_spacing) + #prints(bullet.speed,bullet.projectiles, bullet.projectile_spacing) bullet.position = position + Vector2((b - (projectiles- 1) / 2.0) * PROJECTILE_SPACING /2, MUZZLE_HEIGHT) # Get weapon speed and spacing for equidistant calculations @@ -110,6 +110,6 @@ func shoot(): #bullet_speed = bullet_resource.speed # Print which weapon is firing - prints(bullet.shot_data.shot_name, "weapon fired") + #prints(bullet.shot_data.shot_name, "weapon fired") #travel -= weapon_spacing diff --git a/scenes/stock_weapon.gd b/scenes/stock_weapon.gd index 169c82e..578b645 100644 --- a/scenes/stock_weapon.gd +++ b/scenes/stock_weapon.gd @@ -2,13 +2,14 @@ extends Area2D @onready var bullet: PackedScene = load("res://scenes/stock_weapon.tscn") -@export var shot_data: PlayerShot +@export var shot_data: WeaponShot func _process(delta): - - #Calculation position along Y axis - position.y -= shot_data.speed * delta - + + #Calculation position along Y axis + position.y -= shot_data.speed * delta # Original Speed + #position.y -= 330 * delta # non-shot_data testing + func _on_visible_on_screen_notifier_2d_screen_exited() -> void: - queue_free() + queue_free() diff --git a/scenes/stock_weapon_single_old.tscn b/scenes/stock_weapon_single_old.tscn index d804e00..a58db17 100644 --- a/scenes/stock_weapon_single_old.tscn +++ b/scenes/stock_weapon_single_old.tscn @@ -9,7 +9,6 @@ script = ExtResource("2_5286c") shot_name = "Stock" speed = 350 projectiles = 3 -projectile_spacing = 10.0 metadata/_custom_type_script = "uid://ccdohs4gduee5" [sub_resource type="RectangleShape2D" id="RectangleShape2D_mvdrj"] diff --git a/scenes/world.tscn b/scenes/world.tscn index 08f585a..50bf2a4 100644 --- a/scenes/world.tscn +++ b/scenes/world.tscn @@ -2,7 +2,7 @@ [ext_resource type="PackedScene" uid="uid://14fhj8834pkq" path="res://scenes/ui.tscn" id="1_nnsk1"] [ext_resource type="Texture2D" uid="uid://b3dqvd23nbmrm" path="res://graphics/cloud layers.png" id="3_4wyf3"] -[ext_resource type="PackedScene" uid="uid://6wq3ynesnsha" path="res://scenes/player_revision.tscn" id="3_k0juu"] +[ext_resource type="PackedScene" uid="uid://6wq3ynesnsha" path="res://scenes/player.tscn" id="3_k0juu"] [node name="World" type="Node2D" unique_id=1317852169] @@ -78,4 +78,3 @@ hframes = 4 frame = 3 [node name="Player" parent="Level" unique_id=652131079 instance=ExtResource("3_k0juu")] -position = Vector2(106, 312) diff --git a/scripts/components.gd b/scripts/components.gd new file mode 100644 index 0000000..04874fb --- /dev/null +++ b/scripts/components.gd @@ -0,0 +1,131 @@ +# Component types for the game's architecture +# All components extend Node and are meant to be attached to parent objects + +class_name compoents extends Node + +var move_dir: Vector2 = Vector2.ZERO +var shoot_pressed: bool = false +var shooting: bool = false + + +func update() -> void: + move_dir = Input.get_vector("left", "right", "up", "down") + shoot_pressed = Input.is_action_just_pressed("shoot") + shooting = Input.is_action_pressed("shoot") + + +class_name MovementComponent extends Node + +@export var player: Area2D +@export var speed: float = 275 +@export var bounds_x: int = 12 +@export var bounds_y: int = 12 + +@onready var weapon_component: Node = %WeaponComponent + +@onready var screensize = get_viewport().content_scale_size + +var input = Input.get_vector("left", "right", "up", "down") + +func tick(delta: float): + # Check to see if there's a player to move + if player == null: return + + # Shorten variable for accessing weapon_component for clarity + var weapon_system = weapon_component.data + + # Calculate ship to bullet displacement + player.ship_displacement = player.position.y - player.previous_position.y + player.travel += abs(weapon_system.speed) * delta + (player.ship_displacement) + player.travel = clamp(player.travel, 0, 1.9 * weapon_system.spacing) + + # Thruster animation in relation to player movement + if input.x > 0: + player.position.x = player.position.x + 1 + %Ship.frame = 2 + %Ship/Thrusters.flip_h = true + %Ship/Thrusters.animation = "banked" + elif input.x < 0: + player.position.x = player.position.x - 1 + %Ship.frame = 1 + %Ship/Thrusters.flip_h = false + %Ship/Thrusters.animation = "banked" + else: + %Ship.frame = 0 + player.position.x = player.position.x + %Ship/Thrusters.flip_h = false + %Ship/Thrusters.animation = "fwd" + +# Get previous position for equidistant bullet calculation + player.previous_position = player.position + +# Move player within screen bounds + player.position += input * speed * delta + player.position = player.position.clamp(Vector2i(bounds_x, bounds_y), screensize - Vector2i(bounds_x, bounds_y)) + + +class_name ShootComponent extends Node + +@onready var weapon_component: Node = %WeaponComponent +@onready var player: PlayerComponent = $".." + +func shoot(): + + # Shorten variable for accessing weapon_component for clarity + var weapon_system = weapon_component.data + + if player.travel > weapon_system.spacing: + + for b in range(weapon_system.projectiles): + + # Instantiate the bullets + var bullet = weapon_component.weapon_current.instantiate() + get_tree().root.add_child(bullet) + # Adjust bullet spacing before firing + + bullet.position = player.position + Vector2((b - (weapon_system.projectiles - 1) / 2.0) * round(round((weapon_system.projectiles + weapon_system.spacing / 2)) / 2), weapon_system.origin) + print(b, bullet.position.x) + + # Print which weapon is firing + print(b, bullet.shot_data.shot_name, "weapon fired") + + # Subtract projectile spacing from current Player travel for next + player.travel -= weapon_system.spacing + + else: return + + +class_name PlayerComponent extends Area2D + +# Components managed by Player +@onready var input_component: InputComponent = $InputComponent +@onready var movement_component: MovementComponent = $MovementComponent +@onready var shoot_component: ShootComponent = $ShootComponent +@onready var weapon_component: WeaponComponent = $WeaponComponent + +# Variables for Player shooting status +@export var can_shoot: bool = true +@export var is_shooting: bool = false + +# Variables for Player position calculations for equidistant bullets +var previous_position: Vector2 +var ship_displacement: float +var travel: float = 0 + + +func _process(delta) -> void: + + # Read Controls + input_component.update() + + # Read Shooting + if input_component.shooting: + is_shooting = true + else: is_shooting = false + + if is_shooting == true: + shoot_component.shoot() + + # Read Movement Component + movement_component.input = input_component.move_dir + movement_component.tick(delta) diff --git a/scripts/components.gd.uid b/scripts/components.gd.uid new file mode 100644 index 0000000..e83f81e --- /dev/null +++ b/scripts/components.gd.uid @@ -0,0 +1 @@ +uid://imu0upeiufxn diff --git a/scripts/movement_component.gd b/scripts/movement_component.gd index b065b69..4ad1bcf 100644 --- a/scripts/movement_component.gd +++ b/scripts/movement_component.gd @@ -1,48 +1,51 @@ class_name MovementComponent extends Node -@export var player: Area2D + @export var speed: float = 275 @export var bounds_x: int = 12 @export var bounds_y: int = 12 -@onready var weapon_component: WeaponComponent = %WeaponComponent +@onready var weapon_component: Node = %WeaponComponent +@onready var player = $"../Player" @onready var screensize = get_viewport().content_scale_size var input = Input.get_vector("left", "right", "up","down") func tick(delta: float): + prints(tick) + # Check to see if there's a player to move - if player == null: return - + if player == null: return + # Shorten variable for accessing weapon_component for clarity - var weapon_system = weapon_component.data - + var weapon_system = weapon_component.data + # Calculate ship to bullet displacement - player.ship_displacement = player.position.y - player.previous_position.y - player.travel += abs(weapon_system.speed) * delta + (player.ship_displacement) - player.travel = clamp(player.travel, 0, 1.9 * weapon_system.spacing) - + player.ship_displacement = player.position.y - player.previous_position.y + player.travel += abs(weapon_system.speed) * delta + (player.ship_displacement) + player.travel = clamp(player.travel, 0, 1.9 * weapon_system.spacing) + # Thruster animation in relation to player movement - if input.x > 0: - player.position.x = player.position.x+1 - %Ship.frame = 2 - %Ship/Thrusters.flip_h = true - %Ship/Thrusters.animation = "banked" - elif input.x < 0: - player.position.x = player.position.x-1 - %Ship.frame = 1 - %Ship/Thrusters.flip_h = false - %Ship/Thrusters.animation = "banked" - else: - %Ship.frame = 0 - player.position.x = player.position.x - %Ship/Thrusters.flip_h = false - %Ship/Thrusters.animation = "fwd" - + if input.x > 0: + player.position.x = player.position.x+1 + %Ship.frame = 2 + %Ship/Thrusters.flip_h = true + %Ship/Thrusters.animation = "banked" + elif input.x < 0: + player.position.x = player.position.x-1 + %Ship.frame = 1 + %Ship/Thrusters.flip_h = false + %Ship/Thrusters.animation = "banked" + else: + %Ship.frame = 0 + player.position.x = player.position.x + %Ship/Thrusters.flip_h = false + %Ship/Thrusters.animation = "fwd" + # Get previous positon for equidistant bullet calculation - player.previous_position = player.position - + player.previous_position = player.position + # Move player within screenbounds - player.position += input * speed * delta - player.position = player.position.clamp(Vector2i(bounds_x,bounds_y), screensize - Vector2i(bounds_x,bounds_y)) + player.position += input * speed * delta + player.position = player.position.clamp(Vector2i(bounds_x,bounds_y), screensize - Vector2i(bounds_x,bounds_y)) diff --git a/scripts/player_shot.gd b/scripts/player_shot.gd index 128079b..667bd1b 100644 --- a/scripts/player_shot.gd +++ b/scripts/player_shot.gd @@ -1,4 +1,4 @@ -class_name PlayerShotResource +class_name PlayerShot extends Resource @export_category("Info") diff --git a/scripts/shoot_component.gd b/scripts/shoot_component.gd index 9942ec2..1a9027d 100644 --- a/scripts/shoot_component.gd +++ b/scripts/shoot_component.gd @@ -1,7 +1,7 @@ class_name ShootComponent extends Node @onready var weapon_component: Node = %WeaponComponent -@onready var player: Player = $".." +@onready var player = $"../Player" func shoot(): diff --git a/scripts/weapon_component.gd b/scripts/weapon_component.gd index b8ec8fb..2c335e8 100644 --- a/scripts/weapon_component.gd +++ b/scripts/weapon_component.gd @@ -1,7 +1,7 @@ class_name WeaponComponent extends Node @export var weapon_current : PackedScene -var data: PlayerShot = load("res://resources/player_weapons/shot_stock.tres") +var data : PlayerShot = load("res://resources/player_weapons/shot_stock.tres") #@export var projectile_origin: int = -23 #@export_category("Temp Bullet Data") @@ -14,8 +14,3 @@ var data: PlayerShot = load("res://resources/player_weapons/shot_stock.tres") #var rate: float = 0.1 #var cooldown: float = 0.25 #var projectile_spacing: float = 10 - - - - - diff --git a/scripts/weapon_shot.gd b/scripts/weapon_shot.gd index 667bd1b..b551493 100644 --- a/scripts/weapon_shot.gd +++ b/scripts/weapon_shot.gd @@ -1,4 +1,5 @@ -class_name PlayerShot +class_name WeaponShot + extends Resource @export_category("Info") From bdbc3b015f6fa6ed4538f5433afa18f04833d568 Mon Sep 17 00:00:00 2001 From: henry Date: Tue, 9 Jun 2026 13:57:40 +0100 Subject: [PATCH 2/8] Refactored weapon and shoot component use and resources. --- Deprecated/_player.gd | 108 +++++++++++++++ Deprecated/_player.gd.uid | 1 + {scenes => Deprecated}/_player.tscn | 2 +- {scenes => Deprecated}/player_refactor.gd | 2 +- {scenes => Deprecated}/player_refactor.gd.uid | 0 Deprecated/stock_weapon.gd | 15 ++ {scenes => Deprecated}/stock_weapon.gd.uid | 0 .../stock_weapon_single_old.tscn | 11 +- resources/player_weapons/shot_stock.tres | 11 -- .../player_weapons/shot_stock_static.tres | 10 -- .../player_weapons}/weapon_shot.gd | 5 +- .../player_weapons}/weapon_shot.gd.uid | 0 .../player_weapons/weapon_shot_stock.tres | 14 ++ scenes/player.gd | 116 +++------------- scenes/player.gd.uid | 2 +- scenes/player.tscn | 27 ++-- scenes/player_component.gd | 34 ----- scenes/player_component.gd.uid | 1 - scenes/stock_weapon.gd | 15 -- .../{stock_weapon.tscn => weapon_stock.tscn} | 10 +- scripts/components.gd | 131 ------------------ scripts/components.gd.uid | 1 - scripts/movement_component.gd | 52 ++++--- scripts/player_shot.gd | 13 -- scripts/player_shot.gd.uid | 1 - scripts/shoot_component.gd | 53 +++---- scripts/weapon_component.gd | 17 +-- scripts/weapon_component_original.gd | 21 --- scripts/weapon_component_original.gd.uid | 1 - 29 files changed, 239 insertions(+), 435 deletions(-) create mode 100644 Deprecated/_player.gd create mode 100644 Deprecated/_player.gd.uid rename {scenes => Deprecated}/_player.tscn (98%) rename {scenes => Deprecated}/player_refactor.gd (99%) rename {scenes => Deprecated}/player_refactor.gd.uid (100%) create mode 100644 Deprecated/stock_weapon.gd rename {scenes => Deprecated}/stock_weapon.gd.uid (100%) rename {scenes => Deprecated}/stock_weapon_single_old.tscn (70%) delete mode 100644 resources/player_weapons/shot_stock.tres delete mode 100644 resources/player_weapons/shot_stock_static.tres rename {scripts => resources/player_weapons}/weapon_shot.gd (71%) rename {scripts => resources/player_weapons}/weapon_shot.gd.uid (100%) create mode 100644 resources/player_weapons/weapon_shot_stock.tres delete mode 100644 scenes/player_component.gd delete mode 100644 scenes/player_component.gd.uid delete mode 100644 scenes/stock_weapon.gd rename scenes/{stock_weapon.tscn => weapon_stock.tscn} (73%) delete mode 100644 scripts/components.gd delete mode 100644 scripts/components.gd.uid delete mode 100644 scripts/player_shot.gd delete mode 100644 scripts/player_shot.gd.uid delete mode 100644 scripts/weapon_component_original.gd delete mode 100644 scripts/weapon_component_original.gd.uid diff --git a/Deprecated/_player.gd b/Deprecated/_player.gd new file mode 100644 index 0000000..c60c9bf --- /dev/null +++ b/Deprecated/_player.gd @@ -0,0 +1,108 @@ +extends Area2D + +@export var speed: int = 150 +@export var shield_max: int = 10 + +#var ship = %Ship + +var shield: int = 0: set = shield_set +var can_shoot: bool = true +var is_shooting: bool = false +var previous_position: Vector2 +var ship_displacement: float +var travel: float = 0 +var bullet_speed: int = 150 + +@export var weapon_current : PackedScene + +#var weapon_current = load("res://scenes/stock_weapon.tscn") +var weapon_cooldown = Timer +var weapon_rate: float = 0.1 +var weapon_timer: float = 0.0 +var weapon_spacing: float = 0.1 + +@onready var screensize = get_viewport_rect().size +@onready var muzzle_damage = %MuzzleBox + + +func _process(delta): + var input = Input.get_vector("left", "right", "up","down") + ship_displacement = position.y - previous_position.y + travel += bullet_speed * delta + abs(ship_displacement) + travel = clamp(travel, 0, 1.9 * weapon_spacing) + + # Sprite feedback based one player input + if input.x > 0: + %Ship/Thrusters.position.x = $Ship.position.x+1 + %Ship.frame = 2 + %Ship/Thrusters.flip_h = true + %Ship/Thrusters.animation = "banked" + elif input.x < 0: + %Ship/Thrusters.position.x = $Ship.position.x-1 + %Ship.frame = 1 + %Ship/Thrusters.flip_h = false + %Ship/Thrusters.animation = "banked" + else: + %Ship.frame = 0 + %Ship/Thrusters.position.x = $Ship.position.x + %Ship/Thrusters.flip_h = false + %Ship/Thrusters.animation = "fwd" + + # Get previous positon for equidistant bullet calculation + previous_position = position + + # Move the ship based on input within the screen bounds + position += input * speed * delta + position = position.clamp(Vector2(12,12), screensize - Vector2(12,12)) + + # Enable muzzle damage hitbox upon firing + if Input.is_action_pressed("shoot"): + is_shooting = true + muzzle_damage.set("disabled", false) + + else: + is_shooting = false + + if is_shooting == true: + %MuzzleFlash.show() + %Ship/MuzzleFlash.animation = "stock" + + # Adjust bullet spacing before firing + if travel > weapon_spacing: + shoot() + travel -= weapon_spacing + + if is_shooting == false: + %MuzzleFlash.hide() + muzzle_damage.set("disabled", true) + +func shield_set(_value: int): + return + + +func _on_weapon_cooldown_timeout() -> void: + #print("You can shoot again!") + #can_shoot = true + return + + +func shoot(): + var projectiles: int = 3 + const PROJECTILE_SPACING: float = 10 + const MUZZLE_HEIGHT: int = -23 + for b in projectiles: + + # Instantiate the bullets + var bullet = weapon_current.instantiate() + get_tree().root.add_child(bullet) + bullet.position = position + Vector2((b - (projectiles - 1) / 2.0) * PROJECTILE_SPACING, MUZZLE_HEIGHT) + + # Get weapon speed and spacing for equidistant calculations + weapon_rate = bullet.shot_data.rate + weapon_spacing = bullet.shot_data.projectile_spacing + bullet_speed = bullet.shot_data.speed + + # Print which weapon is firing + prints(bullet.shot_data.shot_name, "weapon fired") + + diff --git a/Deprecated/_player.gd.uid b/Deprecated/_player.gd.uid new file mode 100644 index 0000000..6f7dbe2 --- /dev/null +++ b/Deprecated/_player.gd.uid @@ -0,0 +1 @@ +uid://otm88638j7f8 diff --git a/scenes/_player.tscn b/Deprecated/_player.tscn similarity index 98% rename from scenes/_player.tscn rename to Deprecated/_player.tscn index 819bc2b..4045e95 100644 --- a/scenes/_player.tscn +++ b/Deprecated/_player.tscn @@ -1,6 +1,6 @@ [gd_scene format=3 uid="uid://coix5dqblmu7r"] -[ext_resource type="Script" uid="uid://bqxrdf7mtx0ev" path="res://scenes/player_refactor.gd" id="1_qlg0r"] +[ext_resource type="Script" uid="uid://bqxrdf7mtx0ev" path="res://Deprecated/player_refactor.gd" id="1_qlg0r"] [ext_resource type="Texture2D" uid="uid://cq4we1m1yv22s" path="res://graphics/ship.png" id="2_qhqgy"] [ext_resource type="Texture2D" uid="uid://crmbupr3qg0j" path="res://graphics/muzzle_flash.png" id="4_dqkch"] [ext_resource type="Texture2D" uid="uid://b0iavxi8vaxtj" path="res://graphics/ship_thrusters.png" id="5_qlg0r"] diff --git a/scenes/player_refactor.gd b/Deprecated/player_refactor.gd similarity index 99% rename from scenes/player_refactor.gd rename to Deprecated/player_refactor.gd index 5aca39a..f77a391 100644 --- a/scenes/player_refactor.gd +++ b/Deprecated/player_refactor.gd @@ -13,7 +13,7 @@ var travel: float = 0 var bullet_speed: int = 150 var weapon_spacing: float = 0.1 -@export var weapon_current : PackedScene = preload("res://scenes/stock_weapon.tscn") +@export var weapon_current : PackedScene = preload("res://scenes/weapon_stock.tscn") #var weapon_current = load("res://scenes/stock_weapon.tscn") #var weapon_cooldown = Timer diff --git a/scenes/player_refactor.gd.uid b/Deprecated/player_refactor.gd.uid similarity index 100% rename from scenes/player_refactor.gd.uid rename to Deprecated/player_refactor.gd.uid diff --git a/Deprecated/stock_weapon.gd b/Deprecated/stock_weapon.gd new file mode 100644 index 0000000..71537c4 --- /dev/null +++ b/Deprecated/stock_weapon.gd @@ -0,0 +1,15 @@ +extends Area2D + +@onready var bullet: PackedScene = load("res://scenes/weapon_stock.tscn") + +@onready var shot_data: = load("res://resources/player_weapons/weapon_shot_stock.tres") + + +func _process(delta): + + #Calculation position along Y axis + position.y -= shot_data.speed * delta # Original Speed + #position.y -= 330 * delta # non-shot_data testing + +func _on_visible_on_screen_notifier_2d_screen_exited() -> void: + queue_free() diff --git a/scenes/stock_weapon.gd.uid b/Deprecated/stock_weapon.gd.uid similarity index 100% rename from scenes/stock_weapon.gd.uid rename to Deprecated/stock_weapon.gd.uid diff --git a/scenes/stock_weapon_single_old.tscn b/Deprecated/stock_weapon_single_old.tscn similarity index 70% rename from scenes/stock_weapon_single_old.tscn rename to Deprecated/stock_weapon_single_old.tscn index a58db17..7741f1a 100644 --- a/scenes/stock_weapon_single_old.tscn +++ b/Deprecated/stock_weapon_single_old.tscn @@ -1,22 +1,13 @@ [gd_scene format=3 uid="uid://b2ltmeb14nc17"] -[ext_resource type="Script" uid="uid://d1rwqotmrag1r" path="res://scenes/stock_weapon.gd" id="1_kx6bj"] -[ext_resource type="Script" uid="uid://ccdohs4gduee5" path="res://scripts/player_shot.gd" id="2_5286c"] +[ext_resource type="Script" uid="uid://d1rwqotmrag1r" path="res://Deprecated/stock_weapon.gd" id="1_kx6bj"] [ext_resource type="Texture2D" uid="uid://ti1uy42vnnhw" path="res://graphics/shot.png" id="3_58qml"] -[sub_resource type="Resource" id="Resource_4ihvg"] -script = ExtResource("2_5286c") -shot_name = "Stock" -speed = 350 -projectiles = 3 -metadata/_custom_type_script = "uid://ccdohs4gduee5" - [sub_resource type="RectangleShape2D" id="RectangleShape2D_mvdrj"] size = Vector2(12, 8) [node name="StockWeapon" type="Area2D" unique_id=1832200900] script = ExtResource("1_kx6bj") -shot_data = SubResource("Resource_4ihvg") [node name="Sprite2D" type="Sprite2D" parent="." unique_id=2134507225] texture = ExtResource("3_58qml") diff --git a/resources/player_weapons/shot_stock.tres b/resources/player_weapons/shot_stock.tres deleted file mode 100644 index 012b2a8..0000000 --- a/resources/player_weapons/shot_stock.tres +++ /dev/null @@ -1,11 +0,0 @@ -[gd_resource type="Resource" script_class="PlayerShot" format=3 uid="uid://cels8t3hqjtsu"] - -[ext_resource type="Script" uid="uid://ccdohs4gduee5" path="res://scripts/player_shot.gd" id="1_t07sl"] -[ext_resource type="Texture2D" uid="uid://ti1uy42vnnhw" path="res://graphics/shot.png" id="2_xc6g1"] - -[resource] -script = ExtResource("1_t07sl") -shot_name = "Stock" -speed = 500 -spacing = 28.0 -metadata/_custom_type_script = "uid://ccdohs4gduee5" diff --git a/resources/player_weapons/shot_stock_static.tres b/resources/player_weapons/shot_stock_static.tres deleted file mode 100644 index 7a3de32..0000000 --- a/resources/player_weapons/shot_stock_static.tres +++ /dev/null @@ -1,10 +0,0 @@ -[gd_resource type="Resource" script_class="PlayerShot" format=3 uid="uid://c4c7anpgfq2po"] - -[ext_resource type="Script" uid="uid://ccdohs4gduee5" path="res://scripts/player_shot.gd" id="1_reevt"] -[ext_resource type="Texture2D" uid="uid://ti1uy42vnnhw" path="res://graphics/shot.png" id="2_xsuf1"] - -[resource] -script = ExtResource("1_reevt") -shot_name = "Stock" -speed = 500 -metadata/_custom_type_script = "uid://ccdohs4gduee5" diff --git a/scripts/weapon_shot.gd b/resources/player_weapons/weapon_shot.gd similarity index 71% rename from scripts/weapon_shot.gd rename to resources/player_weapons/weapon_shot.gd index b551493..70c64c6 100644 --- a/scripts/weapon_shot.gd +++ b/resources/player_weapons/weapon_shot.gd @@ -1,10 +1,11 @@ class_name WeaponShot - extends Resource @export_category("Info") @export var shot_name: String -@export var sprite: Texture2D = preload("res://graphics/shot.png") +@export var bullet_scene: PackedScene = null + +#@export var sprite: Texture2D = preload("res://graphics/shot.png") @export_category("Shot Data") @export var damage: int = 1 diff --git a/scripts/weapon_shot.gd.uid b/resources/player_weapons/weapon_shot.gd.uid similarity index 100% rename from scripts/weapon_shot.gd.uid rename to resources/player_weapons/weapon_shot.gd.uid diff --git a/resources/player_weapons/weapon_shot_stock.tres b/resources/player_weapons/weapon_shot_stock.tres new file mode 100644 index 0000000..5fb1b26 --- /dev/null +++ b/resources/player_weapons/weapon_shot_stock.tres @@ -0,0 +1,14 @@ +[gd_resource type="Resource" script_class="WeaponShot" format=3 uid="uid://b75ae840k03dy"] + +[ext_resource type="PackedScene" uid="uid://ddpclu2vdy2ve" path="res://scenes/weapon_stock.tscn" id="1_by0nb"] +[ext_resource type="Script" uid="uid://7n1itonn35fm" path="res://resources/player_weapons/weapon_shot.gd" id="2_by0nb"] + +[resource] +script = ExtResource("2_by0nb") +shot_name = "Stock Shot" +bullet_scene = ExtResource("1_by0nb") +speed = 375 +projectiles = 3 +spacing = 25.0 +origin = -20 +metadata/_custom_type_script = "uid://7n1itonn35fm" diff --git a/scenes/player.gd b/scenes/player.gd index c60c9bf..2fdf567 100644 --- a/scenes/player.gd +++ b/scenes/player.gd @@ -1,108 +1,34 @@ -extends Area2D +class_name Player extends Area2D -@export var speed: int = 150 -@export var shield_max: int = 10 +# Components managed by Player +@onready var input_component: InputComponent = %InputComponent +@onready var movement_component: MovementComponent = %MovementComponent +@onready var shoot_component: ShootComponent = %ShootComponent +@onready var weapon_component: WeaponComponent = %WeaponComponent -#var ship = %Ship +# Variables for Player shooting status +@export var can_shoot: bool = true +@export var is_shooting: bool = false -var shield: int = 0: set = shield_set -var can_shoot: bool = true -var is_shooting: bool = false +# Variables for Player position calculations for equidistant bullets var previous_position: Vector2 var ship_displacement: float var travel: float = 0 -var bullet_speed: int = 150 -@export var weapon_current : PackedScene -#var weapon_current = load("res://scenes/stock_weapon.tscn") -var weapon_cooldown = Timer -var weapon_rate: float = 0.1 -var weapon_timer: float = 0.0 -var weapon_spacing: float = 0.1 - -@onready var screensize = get_viewport_rect().size -@onready var muzzle_damage = %MuzzleBox +func _process(delta) -> void: - -func _process(delta): - var input = Input.get_vector("left", "right", "up","down") - ship_displacement = position.y - previous_position.y - travel += bullet_speed * delta + abs(ship_displacement) - travel = clamp(travel, 0, 1.9 * weapon_spacing) - - # Sprite feedback based one player input - if input.x > 0: - %Ship/Thrusters.position.x = $Ship.position.x+1 - %Ship.frame = 2 - %Ship/Thrusters.flip_h = true - %Ship/Thrusters.animation = "banked" - elif input.x < 0: - %Ship/Thrusters.position.x = $Ship.position.x-1 - %Ship.frame = 1 - %Ship/Thrusters.flip_h = false - %Ship/Thrusters.animation = "banked" - else: - %Ship.frame = 0 - %Ship/Thrusters.position.x = $Ship.position.x - %Ship/Thrusters.flip_h = false - %Ship/Thrusters.animation = "fwd" - - # Get previous positon for equidistant bullet calculation - previous_position = position - - # Move the ship based on input within the screen bounds - position += input * speed * delta - position = position.clamp(Vector2(12,12), screensize - Vector2(12,12)) - - # Enable muzzle damage hitbox upon firing - if Input.is_action_pressed("shoot"): + # Read Controls + input_component.update() + + # Read Shooting + if input_component.shooting: is_shooting = true - muzzle_damage.set("disabled", false) + else: is_shooting = false - else: - is_shooting = false - if is_shooting == true: - %MuzzleFlash.show() - %Ship/MuzzleFlash.animation = "stock" - - # Adjust bullet spacing before firing - if travel > weapon_spacing: - shoot() - travel -= weapon_spacing - - if is_shooting == false: - %MuzzleFlash.hide() - muzzle_damage.set("disabled", true) + shoot_component.shoot() -func shield_set(_value: int): - return - - -func _on_weapon_cooldown_timeout() -> void: - #print("You can shoot again!") - #can_shoot = true - return - - -func shoot(): - var projectiles: int = 3 - const PROJECTILE_SPACING: float = 10 - const MUZZLE_HEIGHT: int = -23 - for b in projectiles: - - # Instantiate the bullets - var bullet = weapon_current.instantiate() - get_tree().root.add_child(bullet) - bullet.position = position + Vector2((b - (projectiles - 1) / 2.0) * PROJECTILE_SPACING, MUZZLE_HEIGHT) - - # Get weapon speed and spacing for equidistant calculations - weapon_rate = bullet.shot_data.rate - weapon_spacing = bullet.shot_data.projectile_spacing - bullet_speed = bullet.shot_data.speed - - # Print which weapon is firing - prints(bullet.shot_data.shot_name, "weapon fired") - - + # Read Movement Component + movement_component.input = input_component.move_dir + movement_component.tick(delta) diff --git a/scenes/player.gd.uid b/scenes/player.gd.uid index 6f7dbe2..fe02507 100644 --- a/scenes/player.gd.uid +++ b/scenes/player.gd.uid @@ -1 +1 @@ -uid://otm88638j7f8 +uid://dulfr27gg4evl diff --git a/scenes/player.tscn b/scenes/player.tscn index 613f498..d3645ea 100644 --- a/scenes/player.tscn +++ b/scenes/player.tscn @@ -1,6 +1,6 @@ [gd_scene format=3 uid="uid://6wq3ynesnsha"] -[ext_resource type="Script" uid="uid://dulfr27gg4evl" path="res://scenes/player_component.gd" id="1_ur7pv"] +[ext_resource type="Script" uid="uid://dulfr27gg4evl" path="res://scenes/player.gd" id="1_ur7pv"] [ext_resource type="Texture2D" uid="uid://cq4we1m1yv22s" path="res://graphics/ship.png" id="2_qhqgy"] [ext_resource type="Texture2D" uid="uid://crmbupr3qg0j" path="res://graphics/muzzle_flash.png" id="4_dqkch"] [ext_resource type="Script" uid="uid://dss0dbwr71y6m" path="res://scripts/input_component.gd" id="4_smehm"] @@ -8,7 +8,6 @@ [ext_resource type="Script" uid="uid://c0rikbakpcags" path="res://scripts/movement_component.gd" id="5_ur7pv"] [ext_resource type="Script" uid="uid://bgd1hwindc2ui" path="res://scripts/shoot_component.gd" id="6_y4r1p"] [ext_resource type="Script" uid="uid://ylmao2ndp22y" path="res://scripts/weapon_component.gd" id="7_d2wvv"] -[ext_resource type="PackedScene" uid="uid://ddpclu2vdy2ve" path="res://scenes/stock_weapon.tscn" id="8_3v2ag"] [sub_resource type="AtlasTexture" id="AtlasTexture_tuyoq"] atlas = ExtResource("5_qlg0r") @@ -89,24 +88,22 @@ size = Vector2(24, 30) [sub_resource type="RectangleShape2D" id="RectangleShape2D_dqkch"] size = Vector2(6, 5.75) -[node name="PlayerComponent" type="Node" unique_id=1732759225] - -[node name="Player" type="Area2D" parent="." unique_id=652131079] +[node name="Player" type="Area2D" unique_id=652131079] script = ExtResource("1_ur7pv") -[node name="Ship" type="Sprite2D" parent="Player" unique_id=1155866924] +[node name="Ship" type="Sprite2D" parent="." unique_id=1155866924] unique_name_in_owner = true texture = ExtResource("2_qhqgy") hframes = 3 region_rect = Rect2(0, 0, 62, 24.370766) -[node name="Thrusters" type="AnimatedSprite2D" parent="Player/Ship" unique_id=2096876587] +[node name="Thrusters" type="AnimatedSprite2D" parent="Ship" unique_id=2096876587] position = Vector2(0, 15) sprite_frames = SubResource("SpriteFrames_y4r1p") animation = &"fwd" autoplay = "fwd" -[node name="MuzzleFlash" type="AnimatedSprite2D" parent="Player/Ship" unique_id=1584132038] +[node name="MuzzleFlash" type="AnimatedSprite2D" parent="Ship" unique_id=1584132038] unique_name_in_owner = true visible = false position = Vector2(0.5, -16) @@ -114,33 +111,34 @@ sprite_frames = SubResource("SpriteFrames_3v2ag") animation = &"stock" autoplay = "stock" -[node name="MuzzleBox" type="CollisionShape2D" parent="Player" unique_id=1042837273] +[node name="MuzzleBox" type="CollisionShape2D" parent="." unique_id=1042837273] unique_name_in_owner = true position = Vector2(0, -17) shape = SubResource("RectangleShape2D_qlg0r") disabled = true debug_color = Color(1, 0.5058824, 0.21960784, 0.41960785) -[node name="HelpBox" type="CollisionShape2D" parent="Player" unique_id=938667427] +[node name="HelpBox" type="CollisionShape2D" parent="." unique_id=938667427] position = Vector2(0, 3) shape = SubResource("RectangleShape2D_tuyoq") debug_color = Color(0, 1, 0, 0.41960785) -[node name="HitBox" type="CollisionShape2D" parent="Player" unique_id=485826453] +[node name="HitBox" type="CollisionShape2D" parent="." unique_id=485826453] position = Vector2(0, 2) shape = SubResource("RectangleShape2D_dqkch") debug_color = Color(0.9843137, 0, 0, 0.80784315) -[node name="WeaponCooldown" type="Timer" parent="Player" unique_id=269678170] +[node name="WeaponCooldown" type="Timer" parent="." unique_id=269678170] [node name="InputComponent" type="Node" parent="." unique_id=2022056363] unique_name_in_owner = true script = ExtResource("4_smehm") metadata/_custom_type_script = "uid://dss0dbwr71y6m" -[node name="MovementComponent" type="Node" parent="." unique_id=964075256] +[node name="MovementComponent" type="Node" parent="." unique_id=964075256 node_paths=PackedStringArray("player")] unique_name_in_owner = true script = ExtResource("5_ur7pv") +player = NodePath("..") speed = 200.0 metadata/_custom_type_script = "uid://c0rikbakpcags" @@ -152,7 +150,6 @@ metadata/_custom_type_script = "uid://bgd1hwindc2ui" [node name="WeaponComponent" type="Node" parent="." unique_id=1648685183] unique_name_in_owner = true script = ExtResource("7_d2wvv") -weapon_current = ExtResource("8_3v2ag") metadata/_custom_type_script = "uid://ylmao2ndp22y" -[connection signal="timeout" from="Player/WeaponCooldown" to="Player" method="_on_weapon_cooldown_timeout"] +[connection signal="timeout" from="WeaponCooldown" to="." method="_on_weapon_cooldown_timeout"] diff --git a/scenes/player_component.gd b/scenes/player_component.gd deleted file mode 100644 index 8e826f6..0000000 --- a/scenes/player_component.gd +++ /dev/null @@ -1,34 +0,0 @@ -class_name Player extends Node - -# Components managed by Player -@onready var input_component: InputComponent = %InputComponent -@onready var movement_component: MovementComponent = %MovementComponent -@onready var shoot_component: ShootComponent = %ShootComponent -@onready var weapon_component: WeaponComponent = %WeaponComponent - -# Variables for Player shooting status -@export var can_shoot: bool = true -@export var is_shooting: bool = false - -# Variables for Player position calculations for equidistant bullets -var previous_position: Vector2 -var ship_displacement: float -var travel: float = 0 - - -func _process(delta) -> void: - - # Read Controls - input_component.update() - - # Read Shooting - if input_component.shooting: - is_shooting = true - else: is_shooting = false - - if is_shooting == true: - shoot_component.shoot() - - # Read Movement Component - movement_component.input = input_component.move_dir - movement_component.tick(delta) diff --git a/scenes/player_component.gd.uid b/scenes/player_component.gd.uid deleted file mode 100644 index fe02507..0000000 --- a/scenes/player_component.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dulfr27gg4evl diff --git a/scenes/stock_weapon.gd b/scenes/stock_weapon.gd deleted file mode 100644 index 578b645..0000000 --- a/scenes/stock_weapon.gd +++ /dev/null @@ -1,15 +0,0 @@ -extends Area2D - -@onready var bullet: PackedScene = load("res://scenes/stock_weapon.tscn") - -@export var shot_data: WeaponShot - - -func _process(delta): - - #Calculation position along Y axis - position.y -= shot_data.speed * delta # Original Speed - #position.y -= 330 * delta # non-shot_data testing - -func _on_visible_on_screen_notifier_2d_screen_exited() -> void: - queue_free() diff --git a/scenes/stock_weapon.tscn b/scenes/weapon_stock.tscn similarity index 73% rename from scenes/stock_weapon.tscn rename to scenes/weapon_stock.tscn index 0ea5fe4..998e37b 100644 --- a/scenes/stock_weapon.tscn +++ b/scenes/weapon_stock.tscn @@ -1,18 +1,16 @@ [gd_scene format=3 uid="uid://ddpclu2vdy2ve"] -[ext_resource type="Script" uid="uid://d1rwqotmrag1r" path="res://scenes/stock_weapon.gd" id="1_hsma2"] -[ext_resource type="Resource" uid="uid://cels8t3hqjtsu" path="res://resources/player_weapons/shot_stock.tres" id="2_mvdrj"] -[ext_resource type="Texture2D" uid="uid://ti1uy42vnnhw" path="res://graphics/shot.png" id="3_mvdrj"] +[ext_resource type="Script" uid="uid://d1rwqotmrag1r" path="res://Deprecated/stock_weapon.gd" id="1_u1d5o"] +[ext_resource type="Texture2D" uid="uid://ti1uy42vnnhw" path="res://graphics/shot.png" id="2_5bykt"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_mvdrj"] size = Vector2(6, 14) [node name="StockWeapon" type="Area2D" unique_id=1832200900] -script = ExtResource("1_hsma2") -shot_data = ExtResource("2_mvdrj") +script = ExtResource("1_u1d5o") [node name="Sprite2D" type="Sprite2D" parent="." unique_id=2134507225] -texture = ExtResource("3_mvdrj") +texture = ExtResource("2_5bykt") region_enabled = true region_rect = Rect2(7, 6, 4, 12) diff --git a/scripts/components.gd b/scripts/components.gd deleted file mode 100644 index 04874fb..0000000 --- a/scripts/components.gd +++ /dev/null @@ -1,131 +0,0 @@ -# Component types for the game's architecture -# All components extend Node and are meant to be attached to parent objects - -class_name compoents extends Node - -var move_dir: Vector2 = Vector2.ZERO -var shoot_pressed: bool = false -var shooting: bool = false - - -func update() -> void: - move_dir = Input.get_vector("left", "right", "up", "down") - shoot_pressed = Input.is_action_just_pressed("shoot") - shooting = Input.is_action_pressed("shoot") - - -class_name MovementComponent extends Node - -@export var player: Area2D -@export var speed: float = 275 -@export var bounds_x: int = 12 -@export var bounds_y: int = 12 - -@onready var weapon_component: Node = %WeaponComponent - -@onready var screensize = get_viewport().content_scale_size - -var input = Input.get_vector("left", "right", "up", "down") - -func tick(delta: float): - # Check to see if there's a player to move - if player == null: return - - # Shorten variable for accessing weapon_component for clarity - var weapon_system = weapon_component.data - - # Calculate ship to bullet displacement - player.ship_displacement = player.position.y - player.previous_position.y - player.travel += abs(weapon_system.speed) * delta + (player.ship_displacement) - player.travel = clamp(player.travel, 0, 1.9 * weapon_system.spacing) - - # Thruster animation in relation to player movement - if input.x > 0: - player.position.x = player.position.x + 1 - %Ship.frame = 2 - %Ship/Thrusters.flip_h = true - %Ship/Thrusters.animation = "banked" - elif input.x < 0: - player.position.x = player.position.x - 1 - %Ship.frame = 1 - %Ship/Thrusters.flip_h = false - %Ship/Thrusters.animation = "banked" - else: - %Ship.frame = 0 - player.position.x = player.position.x - %Ship/Thrusters.flip_h = false - %Ship/Thrusters.animation = "fwd" - -# Get previous position for equidistant bullet calculation - player.previous_position = player.position - -# Move player within screen bounds - player.position += input * speed * delta - player.position = player.position.clamp(Vector2i(bounds_x, bounds_y), screensize - Vector2i(bounds_x, bounds_y)) - - -class_name ShootComponent extends Node - -@onready var weapon_component: Node = %WeaponComponent -@onready var player: PlayerComponent = $".." - -func shoot(): - - # Shorten variable for accessing weapon_component for clarity - var weapon_system = weapon_component.data - - if player.travel > weapon_system.spacing: - - for b in range(weapon_system.projectiles): - - # Instantiate the bullets - var bullet = weapon_component.weapon_current.instantiate() - get_tree().root.add_child(bullet) - # Adjust bullet spacing before firing - - bullet.position = player.position + Vector2((b - (weapon_system.projectiles - 1) / 2.0) * round(round((weapon_system.projectiles + weapon_system.spacing / 2)) / 2), weapon_system.origin) - print(b, bullet.position.x) - - # Print which weapon is firing - print(b, bullet.shot_data.shot_name, "weapon fired") - - # Subtract projectile spacing from current Player travel for next - player.travel -= weapon_system.spacing - - else: return - - -class_name PlayerComponent extends Area2D - -# Components managed by Player -@onready var input_component: InputComponent = $InputComponent -@onready var movement_component: MovementComponent = $MovementComponent -@onready var shoot_component: ShootComponent = $ShootComponent -@onready var weapon_component: WeaponComponent = $WeaponComponent - -# Variables for Player shooting status -@export var can_shoot: bool = true -@export var is_shooting: bool = false - -# Variables for Player position calculations for equidistant bullets -var previous_position: Vector2 -var ship_displacement: float -var travel: float = 0 - - -func _process(delta) -> void: - - # Read Controls - input_component.update() - - # Read Shooting - if input_component.shooting: - is_shooting = true - else: is_shooting = false - - if is_shooting == true: - shoot_component.shoot() - - # Read Movement Component - movement_component.input = input_component.move_dir - movement_component.tick(delta) diff --git a/scripts/components.gd.uid b/scripts/components.gd.uid deleted file mode 100644 index e83f81e..0000000 --- a/scripts/components.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://imu0upeiufxn diff --git a/scripts/movement_component.gd b/scripts/movement_component.gd index 4ad1bcf..1d3a4ac 100644 --- a/scripts/movement_component.gd +++ b/scripts/movement_component.gd @@ -1,51 +1,49 @@ class_name MovementComponent extends Node +@export var player: Area2D @export var speed: float = 275 @export var bounds_x: int = 12 @export var bounds_y: int = 12 @onready var weapon_component: Node = %WeaponComponent -@onready var player = $"../Player" - @onready var screensize = get_viewport().content_scale_size var input = Input.get_vector("left", "right", "up","down") func tick(delta: float): - prints(tick) - + # Check to see if there's a player to move - if player == null: return + if player == null: return # Shorten variable for accessing weapon_component for clarity - var weapon_system = weapon_component.data + var weapon_system = weapon_component.data # Calculate ship to bullet displacement - player.ship_displacement = player.position.y - player.previous_position.y - player.travel += abs(weapon_system.speed) * delta + (player.ship_displacement) - player.travel = clamp(player.travel, 0, 1.9 * weapon_system.spacing) + player.ship_displacement = player.position.y - player.previous_position.y + player.travel += abs(weapon_system.speed) * delta + (player.ship_displacement) + player.travel = clamp(player.travel, 0, 1.9 * weapon_system.spacing) # Thruster animation in relation to player movement - if input.x > 0: - player.position.x = player.position.x+1 - %Ship.frame = 2 - %Ship/Thrusters.flip_h = true - %Ship/Thrusters.animation = "banked" - elif input.x < 0: - player.position.x = player.position.x-1 - %Ship.frame = 1 - %Ship/Thrusters.flip_h = false - %Ship/Thrusters.animation = "banked" - else: - %Ship.frame = 0 - player.position.x = player.position.x - %Ship/Thrusters.flip_h = false - %Ship/Thrusters.animation = "fwd" + if input.x > 0: + player.position.x = player.position.x+1 + %Ship.frame = 2 + %Ship/Thrusters.flip_h = true + %Ship/Thrusters.animation = "banked" + elif input.x < 0: + player.position.x = player.position.x-1 + %Ship.frame = 1 + %Ship/Thrusters.flip_h = false + %Ship/Thrusters.animation = "banked" + else: + %Ship.frame = 0 + player.position.x = player.position.x + %Ship/Thrusters.flip_h = false + %Ship/Thrusters.animation = "fwd" # Get previous positon for equidistant bullet calculation - player.previous_position = player.position + player.previous_position = player.position # Move player within screenbounds - player.position += input * speed * delta - player.position = player.position.clamp(Vector2i(bounds_x,bounds_y), screensize - Vector2i(bounds_x,bounds_y)) + player.position += input * speed * delta + player.position = player.position.clamp(Vector2i(bounds_x,bounds_y), screensize - Vector2i(bounds_x,bounds_y)) diff --git a/scripts/player_shot.gd b/scripts/player_shot.gd deleted file mode 100644 index 667bd1b..0000000 --- a/scripts/player_shot.gd +++ /dev/null @@ -1,13 +0,0 @@ -class_name PlayerShot -extends Resource - -@export_category("Info") -@export var shot_name: String -@export var sprite: Texture2D = preload("res://graphics/shot.png") - -@export_category("Shot Data") -@export var damage: int = 1 -@export var speed: int = 135 -@export var projectiles: int = 2 -@export var spacing: float = 35 -@export var origin: int = -23 diff --git a/scripts/player_shot.gd.uid b/scripts/player_shot.gd.uid deleted file mode 100644 index 7b3116e..0000000 --- a/scripts/player_shot.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://ccdohs4gduee5 diff --git a/scripts/shoot_component.gd b/scripts/shoot_component.gd index 1a9027d..65240d2 100644 --- a/scripts/shoot_component.gd +++ b/scripts/shoot_component.gd @@ -1,31 +1,32 @@ class_name ShootComponent extends Node @onready var weapon_component: Node = %WeaponComponent -@onready var player = $"../Player" +@onready var player = $".." + +# Change from instantiating WeaponComponent to instantiating Shot nodes func shoot(): - - # Shorten variable for accessing weapon_component for clarity - var weapon_system = weapon_component.data - - if player.travel > weapon_system.spacing: - - for b in range(weapon_system.projectiles): - - # Instantiate the bullets - var bullet = weapon_component.weapon_current.instantiate() - get_tree().root.add_child(bullet) - # Adjust bullet spacing before firing - - bullet.position = player.position + Vector2((b - (weapon_system.projectiles - 1) / 2.0) * round(round((weapon_system.projectiles + weapon_system.spacing / 2)) / 2), weapon_system.origin) - print(b, bullet.position.x) - - # Print which weapon is firing - prints(bullet.shot_data.shot_name, "weapon fired") - - # Subtract projectile spacing from current Player travel for next - player.travel -= weapon_system.spacing - - else: return - - + var weapon_data = weapon_component.data # WeaponShot resource configuration + + if player.travel > weapon_data.spacing: + for b in range(weapon_data.projectiles): + + # Get the Shot scene from the WeaponShot resource + var bullet_scene = weapon_data.bullet_scene # Or however you store it + + # Instantiate the bullet based data + var bullet := bullet_scene.instantiate() as Node + get_tree().root.add_child(bullet) + + # Set up the bullet from resource data + #bullet.shot_data = weapon_data # Pass the configuration + + # Adjust bullet spacing before firing + bullet.position = player.position + Vector2((b - (weapon_data.projectiles - 1) / 2.0) * round(round((weapon_data.projectiles + weapon_data.spacing / 2)) / 2 - 2), weapon_data.origin) + print(b, bullet.position.x) + print(weapon_data.shot_name + " "+"fired!") + + # Subtract projectile spacing from current Player travel for next + player.travel -= weapon_data.spacing + + else: return diff --git a/scripts/weapon_component.gd b/scripts/weapon_component.gd index 2c335e8..a4bb65b 100644 --- a/scripts/weapon_component.gd +++ b/scripts/weapon_component.gd @@ -1,16 +1,9 @@ class_name WeaponComponent extends Node -@export var weapon_current : PackedScene -var data : PlayerShot = load("res://resources/player_weapons/shot_stock.tres") -#@export var projectile_origin: int = -23 +@export var loaded_weapon: PackedScene = load("res://scenes/weapon_stock.tscn") +var data : WeaponShot = load("res://resources/player_weapons/weapon_shot_stock.tres") -#@export_category("Temp Bullet Data") -#@export var projectiles: int = 3 -#@export var projectile_spacing: float = 10 -#var damage: int = 0 -#var speed: int = 135 -#var projectiles: int = 2 -#var rate: float = 0.1 -#var cooldown: float = 0.25 -#var projectile_spacing: float = 10 + +func get_bullet_scene() -> PackedScene: + return data.weapon_shot # Reference to the Shot scene from the resource diff --git a/scripts/weapon_component_original.gd b/scripts/weapon_component_original.gd deleted file mode 100644 index b8ec8fb..0000000 --- a/scripts/weapon_component_original.gd +++ /dev/null @@ -1,21 +0,0 @@ -class_name WeaponComponent extends Node - -@export var weapon_current : PackedScene -var data: PlayerShot = load("res://resources/player_weapons/shot_stock.tres") -#@export var projectile_origin: int = -23 - -#@export_category("Temp Bullet Data") -#@export var projectiles: int = 3 -#@export var projectile_spacing: float = 10 - -#var damage: int = 0 -#var speed: int = 135 -#var projectiles: int = 2 -#var rate: float = 0.1 -#var cooldown: float = 0.25 -#var projectile_spacing: float = 10 - - - - - diff --git a/scripts/weapon_component_original.gd.uid b/scripts/weapon_component_original.gd.uid deleted file mode 100644 index 09907d3..0000000 --- a/scripts/weapon_component_original.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cy50u6ksjqvjc From 1725b8b7547a3909a806e795a083f1c4af986561 Mon Sep 17 00:00:00 2001 From: henry Date: Sat, 13 Jun 2026 12:05:13 +0100 Subject: [PATCH 3/8] Added bullet indexing to create shot patterns --- project.godot | 2 +- resources/player_weapons/weapon_shot.gd | 6 +- .../player_weapons/weapon_shot_stock.tres | 7 ++- scenes/game.gd | 3 + scenes/game.gd.uid | 1 + scenes/game.tscn | 2 + scenes/player.gd | 14 +++++ scenes/player.tscn | 3 + scenes/weapon_stock.gd | 20 +++++++ scenes/weapon_stock.gd.uid | 1 + scenes/weapon_stock.tscn | 2 +- scripts/movement_component.gd | 2 +- scripts/shoot_component.gd | 55 ++++++++++++------- 13 files changed, 91 insertions(+), 27 deletions(-) create mode 100644 scenes/game.gd create mode 100644 scenes/game.gd.uid create mode 100644 scenes/weapon_stock.gd create mode 100644 scenes/weapon_stock.gd.uid diff --git a/project.godot b/project.godot index 29e0330..43ed708 100644 --- a/project.godot +++ b/project.godot @@ -11,7 +11,7 @@ config_version=5 [application] config/name="Facsimile Wing" -run/main_scene="uid://coix5dqblmu7r" +run/main_scene="uid://bj4fytc3sy482" config/features=PackedStringArray("4.6", "Forward Plus") config/icon="res://icon.svg" diff --git a/resources/player_weapons/weapon_shot.gd b/resources/player_weapons/weapon_shot.gd index 70c64c6..63adff0 100644 --- a/resources/player_weapons/weapon_shot.gd +++ b/resources/player_weapons/weapon_shot.gd @@ -5,11 +5,13 @@ extends Resource @export var shot_name: String @export var bullet_scene: PackedScene = null -#@export var sprite: Texture2D = preload("res://graphics/shot.png") - @export_category("Shot Data") @export var damage: int = 1 @export var speed: int = 135 @export var projectiles: int = 2 @export var spacing: float = 35 @export var origin: int = -23 + +@export_category("Stagger") +@export var horizontal_offset: float = 6.5 # Horizontal distance between projectiles +@export var stagger_offset: float = 5 # Time delay per projectile index diff --git a/resources/player_weapons/weapon_shot_stock.tres b/resources/player_weapons/weapon_shot_stock.tres index 5fb1b26..4a783c6 100644 --- a/resources/player_weapons/weapon_shot_stock.tres +++ b/resources/player_weapons/weapon_shot_stock.tres @@ -7,8 +7,9 @@ script = ExtResource("2_by0nb") shot_name = "Stock Shot" bullet_scene = ExtResource("1_by0nb") -speed = 375 +speed = 355 projectiles = 3 -spacing = 25.0 -origin = -20 +spacing = 32.0 +origin = -25 +stagger_offset = 0.75 metadata/_custom_type_script = "uid://7n1itonn35fm" diff --git a/scenes/game.gd b/scenes/game.gd new file mode 100644 index 0000000..d9dd459 --- /dev/null +++ b/scenes/game.gd @@ -0,0 +1,3 @@ +extends Node2D + +@onready var screensize = get_viewport().content_scale_size diff --git a/scenes/game.gd.uid b/scenes/game.gd.uid new file mode 100644 index 0000000..b7f02c2 --- /dev/null +++ b/scenes/game.gd.uid @@ -0,0 +1 @@ +uid://dkti4uwycpqrs diff --git a/scenes/game.tscn b/scenes/game.tscn index 18dbab4..ebf430e 100644 --- a/scenes/game.tscn +++ b/scenes/game.tscn @@ -1,9 +1,11 @@ [gd_scene format=3 uid="uid://dqd8cxe7aj3b4"] +[ext_resource type="Script" uid="uid://dkti4uwycpqrs" path="res://scenes/game.gd" id="1_lnu2h"] [ext_resource type="PackedScene" uid="uid://bj4fytc3sy482" path="res://scenes/world.tscn" id="1_uwrxv"] [ext_resource type="Texture2D" uid="uid://egqbrm636m4h" path="res://graphics/title.png" id="2_yqjtg"] [node name="Game" type="Node2D" unique_id=1673976895] +script = ExtResource("1_lnu2h") [node name="World" parent="." unique_id=1317852169 instance=ExtResource("1_uwrxv")] diff --git a/scenes/player.gd b/scenes/player.gd index 2fdf567..6439eb4 100644 --- a/scenes/player.gd +++ b/scenes/player.gd @@ -6,15 +6,23 @@ class_name Player extends Area2D @onready var shoot_component: ShootComponent = %ShootComponent @onready var weapon_component: WeaponComponent = %WeaponComponent +# Get the viewport size for positioning +@onready var screensize = get_viewport().content_scale_size + # Variables for Player shooting status @export var can_shoot: bool = true @export var is_shooting: bool = false +@export var muzzle_flash: bool = false # Variables for Player position calculations for equidistant bullets var previous_position: Vector2 var ship_displacement: float var travel: float = 0 +func _ready() -> void: + + ## Set initial start position + position = Vector2(screensize.x / 2, screensize.y - 45) func _process(delta) -> void: @@ -28,6 +36,12 @@ func _process(delta) -> void: if is_shooting == true: shoot_component.shoot() + $%MuzzleFlash.show() + + if is_shooting == false: + $%MuzzleFlash.hide() + + # Read Movement Component movement_component.input = input_component.move_dir diff --git a/scenes/player.tscn b/scenes/player.tscn index d3645ea..d8caa0d 100644 --- a/scenes/player.tscn +++ b/scenes/player.tscn @@ -90,6 +90,9 @@ size = Vector2(6, 5.75) [node name="Player" type="Area2D" unique_id=652131079] script = ExtResource("1_ur7pv") +can_shoot = null +is_shooting = null +muzzle_flash = null [node name="Ship" type="Sprite2D" parent="." unique_id=1155866924] unique_name_in_owner = true diff --git a/scenes/weapon_stock.gd b/scenes/weapon_stock.gd new file mode 100644 index 0000000..090c09a --- /dev/null +++ b/scenes/weapon_stock.gd @@ -0,0 +1,20 @@ +extends Area2D + +@onready var bullet: PackedScene = load("res://scenes/weapon_stock.tscn") + +@onready var shot_data: = load("res://resources/player_weapons/weapon_shot_stock.tres") + +# Time offset when this bullet was fired (relative to other bullets) +var time_offset: float = 0.5 + +#func activate(): + # Bullet does its damage/projectile work + +func _process(delta): + + #Calculation position along Y axis + position.y -= shot_data.speed * delta # Original Speed + #position.y -= 330 * delta # non-shot_data testing + +func _on_visible_on_screen_notifier_2d_screen_exited() -> void: + queue_free() diff --git a/scenes/weapon_stock.gd.uid b/scenes/weapon_stock.gd.uid new file mode 100644 index 0000000..f1e41f6 --- /dev/null +++ b/scenes/weapon_stock.gd.uid @@ -0,0 +1 @@ +uid://c5blhfopjpfny diff --git a/scenes/weapon_stock.tscn b/scenes/weapon_stock.tscn index 998e37b..ce1c91e 100644 --- a/scenes/weapon_stock.tscn +++ b/scenes/weapon_stock.tscn @@ -1,6 +1,6 @@ [gd_scene format=3 uid="uid://ddpclu2vdy2ve"] -[ext_resource type="Script" uid="uid://d1rwqotmrag1r" path="res://Deprecated/stock_weapon.gd" id="1_u1d5o"] +[ext_resource type="Script" uid="uid://c5blhfopjpfny" path="res://scenes/weapon_stock.gd" id="1_u1d5o"] [ext_resource type="Texture2D" uid="uid://ti1uy42vnnhw" path="res://graphics/shot.png" id="2_5bykt"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_mvdrj"] diff --git a/scripts/movement_component.gd b/scripts/movement_component.gd index 1d3a4ac..18ebdb2 100644 --- a/scripts/movement_component.gd +++ b/scripts/movement_component.gd @@ -12,7 +12,7 @@ class_name MovementComponent extends Node var input = Input.get_vector("left", "right", "up","down") func tick(delta: float): - + # Check to see if there's a player to move if player == null: return diff --git a/scripts/shoot_component.gd b/scripts/shoot_component.gd index 65240d2..43f5f46 100644 --- a/scripts/shoot_component.gd +++ b/scripts/shoot_component.gd @@ -1,32 +1,49 @@ class_name ShootComponent extends Node +@export var stagger_offset: float = 0.5 # Time delay per projectile index (seconds) +@export var horizontal_offset: float = 1.0 # Horizontal distance per projectile index + @onready var weapon_component: Node = %WeaponComponent @onready var player = $".." - -# Change from instantiating WeaponComponent to instantiating Shot nodes func shoot(): var weapon_data = weapon_component.data # WeaponShot resource configuration + var current_time = Time.get_ticks_msec() / 1000.0 + var total_projectiles = weapon_data.projectiles if player.travel > weapon_data.spacing: - for b in range(weapon_data.projectiles): - - # Get the Shot scene from the WeaponShot resource - var bullet_scene = weapon_data.bullet_scene # Or however you store it - - # Instantiate the bullet based data - var bullet := bullet_scene.instantiate() as Node - get_tree().root.add_child(bullet) - # Set up the bullet from resource data - #bullet.shot_data = weapon_data # Pass the configuration + # Calculate center index for symmetrical staggering + var center_index = (total_projectiles - 1) / 2.0 - # Adjust bullet spacing before firing - bullet.position = player.position + Vector2((b - (weapon_data.projectiles - 1) / 2.0) * round(round((weapon_data.projectiles + weapon_data.spacing / 2)) / 2 - 2), weapon_data.origin) - print(b, bullet.position.x) - print(weapon_data.shot_name + " "+"fired!") + if total_projectiles > 0: + for b in range(total_projectiles): + var bullet_scene = weapon_data.bullet_scene + var bullet := bullet_scene.instantiate() as Node + get_tree().root.add_child(bullet) - # Subtract projectile spacing from current Player travel for next - player.travel -= weapon_data.spacing + # Calculate index relative to center (0 = center, -1/+1 = first from center) + var index_from_center: int = b - center_index - else: return + # Calculate timing offset for staggered firing + # Negative = fire before center (left), positive = fire after center (right) + var time_offset: float = index_from_center * stagger_offset + + # Calculate horizontal offset for symmetrical spread (left = negative, right = positive) + horizontal_offset = index_from_center * weapon_data.spacing_horizontal + + # Calculate vertical offset from center point (creates symmetrical vertical spread) + # Bullets on either side of center get offset by distance_from_center * spacing / 2 + # This keeps the center bullet at origin and creates symmetrical vertical spread + var distance_from_center: float = abs(index_from_center) + var vertical_offset: float = (distance_from_center * weapon_data.origin * -1) / 2 + + # Final position combines symmetrical horizontal spread with symmetrical vertical spacing + bullet.position = player.position + Vector2(horizontal_offset, weapon_data.origin + vertical_offset) + + ## Set timing properties on the bullet + #bullet.time_offset = time_offset + #bullet.fire_time = current_time + time_offset + + # Subtract projectile spacing from current Player travel for next + player.travel -= weapon_data.spacing From 936bcbc5e3bd7a2ae9161d6c6890e2f0311a31d4 Mon Sep 17 00:00:00 2001 From: henry Date: Sat, 13 Jun 2026 12:33:13 +0100 Subject: [PATCH 4/8] Fixed variable name bug in resource reference. --- resources/player_weapons/weapon_shot_stock.tres | 2 +- scripts/shoot_component.gd | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/player_weapons/weapon_shot_stock.tres b/resources/player_weapons/weapon_shot_stock.tres index 4a783c6..06519e2 100644 --- a/resources/player_weapons/weapon_shot_stock.tres +++ b/resources/player_weapons/weapon_shot_stock.tres @@ -8,7 +8,7 @@ script = ExtResource("2_by0nb") shot_name = "Stock Shot" bullet_scene = ExtResource("1_by0nb") speed = 355 -projectiles = 3 +projectiles = 5 spacing = 32.0 origin = -25 stagger_offset = 0.75 diff --git a/scripts/shoot_component.gd b/scripts/shoot_component.gd index 43f5f46..a4991d2 100644 --- a/scripts/shoot_component.gd +++ b/scripts/shoot_component.gd @@ -30,7 +30,7 @@ func shoot(): var time_offset: float = index_from_center * stagger_offset # Calculate horizontal offset for symmetrical spread (left = negative, right = positive) - horizontal_offset = index_from_center * weapon_data.spacing_horizontal + horizontal_offset = index_from_center * weapon_data.horizontal_offset # Calculate vertical offset from center point (creates symmetrical vertical spread) # Bullets on either side of center get offset by distance_from_center * spacing / 2 From 48a2ba3ddbfd511c13c8ccc2e52c26c4e1250e62 Mon Sep 17 00:00:00 2001 From: henry Date: Sat, 13 Jun 2026 15:47:41 +0100 Subject: [PATCH 5/8] Slight update to fire timing to allow for even pairs. --- .../player_weapons/weapon_shot_stock.tres | 8 ++-- scenes/weapon_stock.gd | 38 ++++++++++++++----- scripts/shoot_component.gd | 19 ++++------ 3 files changed, 41 insertions(+), 24 deletions(-) diff --git a/resources/player_weapons/weapon_shot_stock.tres b/resources/player_weapons/weapon_shot_stock.tres index 06519e2..b081da8 100644 --- a/resources/player_weapons/weapon_shot_stock.tres +++ b/resources/player_weapons/weapon_shot_stock.tres @@ -7,9 +7,9 @@ script = ExtResource("2_by0nb") shot_name = "Stock Shot" bullet_scene = ExtResource("1_by0nb") -speed = 355 -projectiles = 5 -spacing = 32.0 -origin = -25 +speed = 500 +spacing = 25.0 +origin = -35 +horizontal_offset = 6.0 stagger_offset = 0.75 metadata/_custom_type_script = "uid://7n1itonn35fm" diff --git a/scenes/weapon_stock.gd b/scenes/weapon_stock.gd index 090c09a..d0e1cd6 100644 --- a/scenes/weapon_stock.gd +++ b/scenes/weapon_stock.gd @@ -1,20 +1,40 @@ extends Area2D -@onready var bullet: PackedScene = load("res://scenes/weapon_stock.tscn") +@onready var bullet: PackedScene = load("res://scenes/weapon_stock.tscn") @onready var shot_data: = load("res://resources/player_weapons/weapon_shot_stock.tres") -# Time offset when this bullet was fired (relative to other bullets) + + +# Time offset when this bullet was fired (relative to other bullets in the same shot) var time_offset: float = 0.5 -#func activate(): - # Bullet does its damage/projectile work +# When this bullet should fire (absolute time) +var fire_time: float = 0.0 + +# Track if this bullet is currently active in the shot +var is_active: bool = false func _process(delta): + var current_time = Time.get_ticks_msec() / 1000.0 - #Calculation position along Y axis - position.y -= shot_data.speed * delta # Original Speed - #position.y -= 330 * delta # non-shot_data testing + # Fire if it's time and bullet isn't already active + if !is_active and current_time >= fire_time: + activate() -func _on_visible_on_screen_notifier_2d_screen_exited() -> void: - queue_free() + # Move the bullet + position.y -= shot_data.speed * delta + +func activate(): + is_active = true + visible = true + + # Emit signal for hit detection + emit_signal("activate") + +func _on_visible_on_screen_notifier_2d_screen_exited(): + queue_free() + + # Set fire_time for the next shot (staggered firing) + var current_time = Time.get_ticks_msec() / 1000.0 + fire_time = current_time + shot_data.stagger_offset diff --git a/scripts/shoot_component.gd b/scripts/shoot_component.gd index a4991d2..3d9d0b7 100644 --- a/scripts/shoot_component.gd +++ b/scripts/shoot_component.gd @@ -23,27 +23,24 @@ func shoot(): get_tree().root.add_child(bullet) # Calculate index relative to center (0 = center, -1/+1 = first from center) - var index_from_center: int = b - center_index + var index_from_center: float = b - center_index # Calculate timing offset for staggered firing - # Negative = fire before center (left), positive = fire after center (right) var time_offset: float = index_from_center * stagger_offset - # Calculate horizontal offset for symmetrical spread (left = negative, right = positive) - horizontal_offset = index_from_center * weapon_data.horizontal_offset + # Calculate horizontal offset for this bullet (symmetrical: left=-ve, right=+ve) + var bullet_horizontal_offset: float = index_from_center * weapon_data.horizontal_offset - # Calculate vertical offset from center point (creates symmetrical vertical spread) - # Bullets on either side of center get offset by distance_from_center * spacing / 2 - # This keeps the center bullet at origin and creates symmetrical vertical spread + # Calculate vertical offset from center point (symmetrical vertical spread) var distance_from_center: float = abs(index_from_center) var vertical_offset: float = (distance_from_center * weapon_data.origin * -1) / 2 # Final position combines symmetrical horizontal spread with symmetrical vertical spacing - bullet.position = player.position + Vector2(horizontal_offset, weapon_data.origin + vertical_offset) + bullet.position = player.position + Vector2(bullet_horizontal_offset, weapon_data.origin + vertical_offset) - ## Set timing properties on the bullet - #bullet.time_offset = time_offset - #bullet.fire_time = current_time + time_offset + # Set timing properties on the bullet + bullet.time_offset = time_offset + bullet.fire_time = current_time + time_offset # Subtract projectile spacing from current Player travel for next player.travel -= weapon_data.spacing From c91f8ab31d19ff11d6fbc0c5ec1198d07e16c8ce Mon Sep 17 00:00:00 2001 From: henry Date: Sat, 13 Jun 2026 17:11:55 +0100 Subject: [PATCH 6/8] A bunch of refinements on spacing and timing! --- resources/player_weapons/weapon_shot_stock.tres | 5 +++-- scripts/shoot_component.gd | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/resources/player_weapons/weapon_shot_stock.tres b/resources/player_weapons/weapon_shot_stock.tres index b081da8..753990c 100644 --- a/resources/player_weapons/weapon_shot_stock.tres +++ b/resources/player_weapons/weapon_shot_stock.tres @@ -8,8 +8,9 @@ script = ExtResource("2_by0nb") shot_name = "Stock Shot" bullet_scene = ExtResource("1_by0nb") speed = 500 +projectiles = 5 spacing = 25.0 -origin = -35 +origin = -10 horizontal_offset = 6.0 -stagger_offset = 0.75 +stagger_offset = 0.25 metadata/_custom_type_script = "uid://7n1itonn35fm" diff --git a/scripts/shoot_component.gd b/scripts/shoot_component.gd index 3d9d0b7..95f427c 100644 --- a/scripts/shoot_component.gd +++ b/scripts/shoot_component.gd @@ -36,7 +36,7 @@ func shoot(): var vertical_offset: float = (distance_from_center * weapon_data.origin * -1) / 2 # Final position combines symmetrical horizontal spread with symmetrical vertical spacing - bullet.position = player.position + Vector2(bullet_horizontal_offset, weapon_data.origin + vertical_offset) + bullet.position = player.position + Vector2(bullet_horizontal_offset, weapon_data.origin + (vertical_offset + weapon_data.origin - total_projectiles)) # Set timing properties on the bullet bullet.time_offset = time_offset From 1bce6ca268756b4d5f9fe4831a733ad1ca79cc5e Mon Sep 17 00:00:00 2001 From: henry Date: Mon, 15 Jun 2026 00:11:54 +0100 Subject: [PATCH 7/8] Refinded symetrical fire functionality and updated stock weapon art. --- graphics/shot_stock.png | Bin 0 -> 297 bytes graphics/shot_stock.png.import | 40 +++++++++++++++++ .../player_weapons/weapon_shot_stock.tres | 8 ++-- scenes/player.tscn | 2 +- scenes/weapon_stock.tscn | 42 +++++++++++++++--- scripts/shoot_component.gd | 2 +- 6 files changed, 82 insertions(+), 12 deletions(-) create mode 100644 graphics/shot_stock.png create mode 100644 graphics/shot_stock.png.import diff --git a/graphics/shot_stock.png b/graphics/shot_stock.png new file mode 100644 index 0000000000000000000000000000000000000000..4f264a16aa372443a5b5939d0ad53c194b40dc78 GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{e!3-pqi< Date: Mon, 15 Jun 2026 12:52:27 +0100 Subject: [PATCH 8/8] Reduced standard shot colour intensity. --- scenes/weapon_stock.gd | 4 ++-- scenes/weapon_stock.tscn | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scenes/weapon_stock.gd b/scenes/weapon_stock.gd index d0e1cd6..7ebe31a 100644 --- a/scenes/weapon_stock.gd +++ b/scenes/weapon_stock.gd @@ -29,8 +29,8 @@ func activate(): is_active = true visible = true - # Emit signal for hit detection - emit_signal("activate") + # # Emit signal for hit detection + # emit_signal("activate") func _on_visible_on_screen_notifier_2d_screen_exited(): queue_free() diff --git a/scenes/weapon_stock.tscn b/scenes/weapon_stock.tscn index e4e7dd6..de22a81 100644 --- a/scenes/weapon_stock.tscn +++ b/scenes/weapon_stock.tscn @@ -1,7 +1,7 @@ [gd_scene format=3 uid="uid://ddpclu2vdy2ve"] [ext_resource type="Script" uid="uid://c5blhfopjpfny" path="res://scenes/weapon_stock.gd" id="1_u1d5o"] -[ext_resource type="Texture2D" uid="uid://dolmy8bnc8kkt" path="res://graphics/shot_stock.png" id="2_u1d5o"] +[ext_resource type="Texture2D" uid="uid://bnpm8b62n1pr5" path="res://graphics/shot_stock_og.png" id="2_u1d5o"] [sub_resource type="AtlasTexture" id="AtlasTexture_5bykt"] atlas = ExtResource("2_u1d5o")