facsimile-wing/scenes/player.gd

76 lines
2.3 KiB
GDScript

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: PowerUpSpawner = _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)
if powerup_spawner != null:
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