contrib: weapons and shooting #4

Merged
nerpa merged 2 commits from devel into main 2026-05-15 20:57:24 +03:00
10 changed files with 111 additions and 1 deletions
+6
View File
@@ -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]
+16
View File
@@ -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"]
+14
View File
@@ -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")
+8
View File
@@ -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]
+14 -1
View File
@@ -4,12 +4,25 @@ 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
velocity *= friction
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()
+17
View File
@@ -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
+6
View File
@@ -0,0 +1,6 @@
class_name CannonPattern
extends FirePattern
func fire(pos: Vector2, dir: Vector2, spawn: Callable) -> void:
spawn.call(pos, dir)
+6
View File
@@ -0,0 +1,6 @@
class_name FirePattern
extends Resource
func fire(_pos: Vector2, _dir: Vector2, _spawn: Callable) -> void:
pass
+12
View File
@@ -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()
+12
View File
@@ -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)