Added in editor warnings when weapons are missing components (Audioplayer, Shot spawn location, projectile PackedScene)

Added functionality for weapons to fire projectiles.
This commit is contained in:
KingGurke 2025-04-03 12:26:41 +02:00
parent 9621323983
commit 40ffbb84cd
8 changed files with 135 additions and 17 deletions

View file

@ -59,7 +59,8 @@ func _physics_process(delta: float) -> void:
rotation = tilt
func shoot(index):
if weapons.size() > index:
#print_debug("trying to shoot weapon ", index, " out of ", )
if index < weapons.size():
weapons[index].shoot()
func deal_damage(amount):

View file

@ -5,7 +5,7 @@ extends FlyerController
func _physics_process(delta: float) -> void:
if not Engine.is_editor_hint():
controlled_flyer.directionInput = Vector2(Input.get_axis("plane_left","plane_right"), Input.get_axis("plane_up","plane_down"))
if InputMap.has_action("shoot_primary") and Input.is_action_just_pressed("shoot_primary"):
controlled_flyer.shoot(1)
if InputMap.has_action("shoot_secondary") and Input.is_action_just_pressed("shoot_secondary"):
controlled_flyer.shoot(2)
if InputMap.has_action("shoot_primary") and Input.is_action_pressed("shoot_primary"):
controlled_flyer.shoot(0)
if InputMap.has_action("shoot_secondary") and Input.is_action_pressed("shoot_secondary"):
controlled_flyer.shoot(1)

View file

@ -1,5 +1,5 @@
class_name Projectile
extends CharacterBody2D
extends Area2D
# constants
@export var speed = 10
@ -8,11 +8,13 @@ extends CharacterBody2D
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
body_entered.connect(_on_projectile_body_entered)
func _physics_process(delta: float) -> void:
var target = move_and_collide(velocity * delta).get_collider()
position += transform.x * speed * delta
func _on_projectile_body_entered(target):
if target is Flyer && friendly != target.friendly:
target.deal_damage(damage)
queue_free()

View file

@ -1,13 +1,17 @@
@tool
class_name Weapon
extends Node2D
# constants
@export var max_ammo = 1
## Number of seconds until the weapon can be used again.
@export var cooldown = 1
@export var shot: Projectile
@export var cooldown = 0.1
@export var shot: PackedScene:
set(new_shot):
shot = new_shot
update_configuration_warnings()
@export var shot_spawn: Node2D
@export var audio: AudioStreamRandomizer
@export var audio: AudioStreamPlayer2D
# gameplay variables
var ammo
@ -15,20 +19,52 @@ var timer = 0.0
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
ammo = max_ammo
if !Engine.is_editor_hint():
ammo = max_ammo
else:
child_entered_tree.connect(_on_child_entered_tree)
child_exiting_tree.connect(_on_child_exited_tree)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
timer += delta
if !Engine.is_editor_hint():
timer += delta
func _get_configuration_warnings():
var warnings = []
if shot == null:
warnings.append("Please select a projectile scene for the shot variable.")
if shot_spawn == null:
warnings.append("Please add a Node2D as the muzzle/projectile spawning location for the shot_spawn variable.")
if audio == null:
warnings.append("Please add an AudioStreamPlayer2D which plays the weapon's audio.")
return warnings
func _on_child_entered_tree(node):
print_debug("saw a child entering tree: ", node)
if node.get_class() == "Node2D":
shot_spawn = node
if node is AudioStreamPlayer2D:
audio = node
update_configuration_warnings()
func _on_child_exited_tree(node):
if node == shot_spawn:
shot_spawn = null
if node == audio:
audio = null
update_configuration_warnings()
# Creates and returns an instance of the weapon's projectile.
func shoot() -> Projectile:
print_debug("trying to shoot, timer at ", timer, " out of ", cooldown, " ammo at ", ammo, " out of ", max_ammo)
if timer > cooldown && ammo > 0:
timer = 0
var new_shot = shot.instantiate()
owner.add_child(new_shot)
new_shot.transform = shot_spawn.transform
new_shot.transform = shot_spawn.global_transform
ammo -= 1
audio.play()
return new_shot