feat: implement double barrel shotgun weapon with procedural sound generation
This commit is contained in:
@@ -10,6 +10,8 @@ var reload_timer: float = 0.0
|
||||
var player: CharacterBody3D
|
||||
var camera: Camera3D
|
||||
var muzzle_flash: OmniLight3D
|
||||
var fire_sound: AudioStreamPlayer3D
|
||||
var reload_sound: AudioStreamPlayer3D
|
||||
|
||||
func _ready() -> void:
|
||||
set_process_input(true)
|
||||
@@ -61,6 +63,16 @@ func _build_model() -> void:
|
||||
muzzle_flash.omni_range = 4.0
|
||||
muzzle_flash.position = Vector3(0, 0.03, -0.45)
|
||||
add_child(muzzle_flash)
|
||||
|
||||
# Audio Players
|
||||
fire_sound = AudioStreamPlayer3D.new()
|
||||
fire_sound.stream = load("res://assets/sounds/shotgun_fire.wav")
|
||||
fire_sound.position = muzzle_flash.position
|
||||
add_child(fire_sound)
|
||||
|
||||
reload_sound = AudioStreamPlayer3D.new()
|
||||
reload_sound.stream = load("res://assets/sounds/shotgun_reload.wav")
|
||||
add_child(reload_sound)
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
if reloading:
|
||||
@@ -87,8 +99,13 @@ func _input(event: InputEvent) -> void:
|
||||
|
||||
if event.is_action_pressed("reload"):
|
||||
if shells < 2 and not reloading:
|
||||
reloading = true
|
||||
reload_timer = reload_time
|
||||
_start_reload()
|
||||
|
||||
func _start_reload() -> void:
|
||||
reloading = true
|
||||
reload_timer = reload_time
|
||||
if reload_sound:
|
||||
reload_sound.play()
|
||||
|
||||
func _try_fire() -> void:
|
||||
if shells > 0 and not reloading:
|
||||
@@ -97,16 +114,16 @@ func _try_fire() -> void:
|
||||
_apply_impulse()
|
||||
_shoot_hitscan()
|
||||
_play_muzzle_flash()
|
||||
if fire_sound:
|
||||
fire_sound.play()
|
||||
|
||||
# Start reload timer if we just shot the LAST shell
|
||||
if shells == 0:
|
||||
reloading = true
|
||||
reload_timer = reload_time
|
||||
_start_reload()
|
||||
|
||||
elif shells == 0 and not reloading:
|
||||
# Empty click, force reload
|
||||
reloading = true
|
||||
reload_timer = reload_time
|
||||
_start_reload()
|
||||
|
||||
func _apply_impulse() -> void:
|
||||
if not player or not camera:
|
||||
|
||||
Reference in New Issue
Block a user