class_name Player extends Area2D # Components managed by Player @onready var input_component: InputComponent = %InputComponent @onready var movement_component: MovementComponent = %MovementComponent @onready var shoot_component: ShootComponent = %ShootComponent @onready var weapon_component: WeaponComponent = %WeaponComponent @onready var powerup_spawner := _find_powerup_spawner() # Get the viewport size for positioning @onready var screensize = get_viewport().content_scale_size # Variables for Player shooting status @export var can_shoot: bool = true @export var is_shooting: bool = false @export var muzzle_flash: bool = false # Variables for Player position calculations for equidistant bullets var previous_position: Vector2 var ship_displacement: float var travel: float = 0 # Effects Testing var flash_effect = preload("res://resources/effects/flash_weapon_change.tres") var blink_effect = preload("res://resources/effects/invincibility_blink.tres") func _ready() -> void: ## Set initial start position position = Vector2(screensize.x / 2, screensize.y - 45) func _process(delta) -> void: # Read Controls input_component.update() # Read Shooting if input_component.shooting: is_shooting = true else: is_shooting = false if is_shooting == true: shoot_component.shoot() $%MuzzleFlash.show() if is_shooting == false: $%MuzzleFlash.hide() # Read Movement Component movement_component.input = input_component.move_dir movement_component.tick(delta) # Cycle weapon (testing key) if input_component.cycle_weapon: weapon_component.cycle_weapon() $EffectsComponent.apply_effect(flash_effect) func _on_help_box_area_entered(area: Area2D) -> void: # Check if the colliding area is a powerup pickup. if not area.has_meta("weapon_shot"): return var weapon_shot: WeaponShot = area.get_meta("weapon_shot") weapon_component.collect_weapon(weapon_shot) powerup_spawner.pickup_collected() area.queue_free() func _find_powerup_spawner() -> PowerUpSpawner: # The spawner is a sibling under Level — find it by searching parent. var level: Node2D = get_parent() as Node2D if level == null: return null return level.get_node_or_null("PowerupSpawner") as PowerUpSpawner