contrib: weapons and shooting #4
@@ -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]
|
||||
|
||||
|
||||
@@ -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"]
|
||||
@@ -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")
|
||||
|
||||
@@ -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
@@ -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()
|
||||
|
||||
@@ -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
|
||||
@@ -0,0 +1,6 @@
|
||||
class_name CannonPattern
|
||||
extends FirePattern
|
||||
|
||||
|
||||
func fire(pos: Vector2, dir: Vector2, spawn: Callable) -> void:
|
||||
spawn.call(pos, dir)
|
||||
@@ -0,0 +1,6 @@
|
||||
class_name FirePattern
|
||||
extends Resource
|
||||
|
||||
|
||||
func fire(_pos: Vector2, _dir: Vector2, _spawn: Callable) -> void:
|
||||
pass
|
||||
@@ -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()
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user