From 742e0e4ae19bdb41be8936306ab4b4775f1763ce Mon Sep 17 00:00:00 2001 From: nerpa Date: Fri, 15 May 2026 16:25:04 +0300 Subject: [PATCH 1/2] refactor: remove typo symbol --- scripts/spaceship.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/spaceship.gd b/scripts/spaceship.gd index 8930854..03e1d9d 100644 --- a/scripts/spaceship.gd +++ b/scripts/spaceship.gd @@ -7,7 +7,7 @@ extends CharacterBody2D func _physics_process(delta: float) -> void: var direction = Input.get_vector("move_left", "move_right", "move_up", "move_down") - # + velocity += direction * thrust * delta velocity *= friction -- 2.54.0 From d1ae049b00962444e36cf431426cd5d7e01e4b4f Mon Sep 17 00:00:00 2001 From: nerpa Date: Fri, 15 May 2026 20:51:52 +0300 Subject: [PATCH 2/2] feat: add weapons - add fire pattern (base interface for all weapons) - add shotgun and cannon pattern - add basic projectile - add input map for shoot --- project.godot | 6 ++++++ scenes/projectile.tscn | 16 ++++++++++++++++ scenes/spaceship.tscn | 14 ++++++++++++++ scenes/weapon.tscn | 8 ++++++++ scripts/spaceship.gd | 13 +++++++++++++ scripts/weapon.gd | 17 +++++++++++++++++ scripts/weapon/cannon_pattern.gd | 6 ++++++ scripts/weapon/fire_pattern.gd | 6 ++++++ scripts/weapon/projectile.gd | 12 ++++++++++++ scripts/weapon/shotgun_pattern.gd | 12 ++++++++++++ 10 files changed, 110 insertions(+) create mode 100644 scenes/projectile.tscn create mode 100644 scenes/weapon.tscn create mode 100644 scripts/weapon.gd create mode 100644 scripts/weapon/cannon_pattern.gd create mode 100644 scripts/weapon/fire_pattern.gd create mode 100644 scripts/weapon/projectile.gd create mode 100644 scripts/weapon/shotgun_pattern.gd diff --git a/project.godot b/project.godot index daeed81..eabcfb2 100644 --- a/project.godot +++ b/project.godot @@ -37,6 +37,12 @@ move_down={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null) ] } +shoot={ +"deadzone": 0.2, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(186, 13),"global_position":Vector2(195, 61),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":true,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null) +] +} [physics] diff --git a/scenes/projectile.tscn b/scenes/projectile.tscn new file mode 100644 index 0000000..5b03298 --- /dev/null +++ b/scenes/projectile.tscn @@ -0,0 +1,16 @@ +[gd_scene format=3 uid="uid://ber0mmhkx5mcq"] + +[ext_resource type="Script" uid="uid://cjhop8r6qbxa8" path="res://scripts/weapon/projectile.gd" id="1_c8fcr"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_b0rl5"] + +[node name="TestBullet" type="Area2D" unique_id=1343072966] +script = ExtResource("1_c8fcr") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=902330337] +scale = Vector2(0.3, 0.3) +shape = SubResource("CircleShape2D_b0rl5") + +[node name="VisibleOnScreenEnabler2D" type="VisibleOnScreenEnabler2D" parent="." unique_id=573845617] + +[connection signal="screen_exited" from="VisibleOnScreenEnabler2D" to="." method="_on_visible_on_screen_enabler_2d_screen_exited"] diff --git a/scenes/spaceship.tscn b/scenes/spaceship.tscn index 8b1f467..5bbc9fd 100644 --- a/scenes/spaceship.tscn +++ b/scenes/spaceship.tscn @@ -1,11 +1,25 @@ [gd_scene format=3 uid="uid://bljiu3udiypxw"] [ext_resource type="Script" uid="uid://ev121glffa0v" path="res://scripts/spaceship.gd" id="1_yqmju"] +[ext_resource type="PackedScene" uid="uid://c1rngq6i8bva2" path="res://scenes/weapon.tscn" id="2_ae4p7"] +[ext_resource type="PackedScene" uid="uid://ber0mmhkx5mcq" path="res://scenes/projectile.tscn" id="3_v0rat"] +[ext_resource type="Script" uid="uid://5nhxplvtroit" path="res://scripts/weapon/shotgun_pattern.gd" id="4_v0rat"] + +[sub_resource type="Resource" id="Resource_343tk"] +script = ExtResource("4_v0rat") +bullets = 10 +spread = 200.0 +metadata/_custom_type_script = "uid://5nhxplvtroit" [sub_resource type="CapsuleShape2D" id="CapsuleShape2D_ky2tl"] [node name="Spaceship" type="CharacterBody2D" unique_id=1542800769] script = ExtResource("1_yqmju") +[node name="Weapon" parent="." unique_id=368200726 instance=ExtResource("2_ae4p7")] +position = Vector2(-20, 0) +projectile_scene = ExtResource("3_v0rat") +fire_pattern = SubResource("Resource_343tk") + [node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=1103597978] shape = SubResource("CapsuleShape2D_ky2tl") diff --git a/scenes/weapon.tscn b/scenes/weapon.tscn new file mode 100644 index 0000000..bfc7b0b --- /dev/null +++ b/scenes/weapon.tscn @@ -0,0 +1,8 @@ +[gd_scene format=3 uid="uid://c1rngq6i8bva2"] + +[ext_resource type="Script" uid="uid://bkicdjnevsqxe" path="res://scripts/weapon.gd" id="1_xasec"] + +[node name="Weapon" type="Node2D" unique_id=493996083] +script = ExtResource("1_xasec") + +[node name="Marker2D" type="Marker2D" parent="." unique_id=312102312] diff --git a/scripts/spaceship.gd b/scripts/spaceship.gd index 03e1d9d..867f7ce 100644 --- a/scripts/spaceship.gd +++ b/scripts/spaceship.gd @@ -4,8 +4,15 @@ extends CharacterBody2D @export var friction := 0.98 @export var max_speed := 1000.0 +@onready var weapons = get_children().filter(func(c): return c is Weapon) + func _physics_process(delta: float) -> void: + handle_move(delta) + handle_shoot() + + +func handle_move(delta: float) -> void: var direction = Input.get_vector("move_left", "move_right", "move_up", "move_down") velocity += direction * thrust * delta @@ -13,3 +20,9 @@ func _physics_process(delta: float) -> void: velocity = velocity.limit_length(max_speed) move_and_slide() + + +func handle_shoot() -> void: + if Input.is_action_just_pressed("shoot"): + for w in weapons: + w.shoot() diff --git a/scripts/weapon.gd b/scripts/weapon.gd new file mode 100644 index 0000000..a88623d --- /dev/null +++ b/scripts/weapon.gd @@ -0,0 +1,17 @@ +class_name Weapon +extends Node2D + +@export var projectile_scene: PackedScene +@export var fire_pattern: FirePattern + + +func shoot() -> void: + fire_pattern.fire(global_position, -global_transform.y, spawn_projectile) + + +func spawn_projectile(pos: Vector2, dir: Vector2): + var proj = projectile_scene.instantiate() + proj.global_position = pos + proj.direction = dir + get_tree().current_scene.get_parent().add_child(proj) + return proj diff --git a/scripts/weapon/cannon_pattern.gd b/scripts/weapon/cannon_pattern.gd new file mode 100644 index 0000000..bcd39ee --- /dev/null +++ b/scripts/weapon/cannon_pattern.gd @@ -0,0 +1,6 @@ +class_name CannonPattern +extends FirePattern + + +func fire(pos: Vector2, dir: Vector2, spawn: Callable) -> void: + spawn.call(pos, dir) diff --git a/scripts/weapon/fire_pattern.gd b/scripts/weapon/fire_pattern.gd new file mode 100644 index 0000000..27bae3a --- /dev/null +++ b/scripts/weapon/fire_pattern.gd @@ -0,0 +1,6 @@ +class_name FirePattern +extends Resource + + +func fire(_pos: Vector2, _dir: Vector2, _spawn: Callable) -> void: + pass diff --git a/scripts/weapon/projectile.gd b/scripts/weapon/projectile.gd new file mode 100644 index 0000000..f030ba3 --- /dev/null +++ b/scripts/weapon/projectile.gd @@ -0,0 +1,12 @@ +extends Area2D + +@export var speed := 600.0 +var direction: Vector2 = Vector2.RIGHT + + +func _physics_process(delta): + global_position += direction * speed * delta + + +func _on_visible_on_screen_enabler_2d_screen_exited() -> void: + queue_free() diff --git a/scripts/weapon/shotgun_pattern.gd b/scripts/weapon/shotgun_pattern.gd new file mode 100644 index 0000000..975cf77 --- /dev/null +++ b/scripts/weapon/shotgun_pattern.gd @@ -0,0 +1,12 @@ +class_name ShotgunPattern +extends FirePattern + +@export var bullets := 5 +@export var spread := 0.25 + + +func fire(pos: Vector2, dir: Vector2, spawn: Callable) -> void: + for i in range(bullets): + var angle := randf_range(-spread, spread) + var new_dir := dir.rotated(angle) + spawn.call(pos, new_dir) -- 2.54.0