113 lines
3.2 KiB
GDScript
113 lines
3.2 KiB
GDScript
extends Area2D
|
|
|
|
|
|
signal damage_taken
|
|
# signal shield_damage
|
|
# signal shield_ui
|
|
|
|
@export var speed: int = 150
|
|
@export var cooldown: float = 0.25
|
|
@export var bullet_scene : PackedScene
|
|
@export var max_shield: int = 10
|
|
var shield: int = 0:
|
|
set = set_shield
|
|
|
|
var can_shoot = false
|
|
var shader_active = false
|
|
var clamp_shield = clamp(shield, 0, max_shield)
|
|
|
|
@onready var screensize = get_viewport_rect().size
|
|
@onready var explosion = $Explosion
|
|
@onready var wait_time = $GunCooldown
|
|
@onready var ship = $Ship
|
|
|
|
func _ready():
|
|
set_process(false)
|
|
print(shield)
|
|
$Ship.hide()
|
|
# start()
|
|
|
|
func start():
|
|
print(shield)
|
|
$Ship.frame = 1
|
|
$Ship.show()
|
|
position = Vector2(screensize.x / 2, screensize.y)
|
|
var tween = create_tween()
|
|
tween.tween_property(self, "position:y", 32 * -1, .25).as_relative()
|
|
$GunCooldown.wait_time = cooldown
|
|
set_shield(max_shield)
|
|
print(shield)
|
|
await get_tree().create_timer(2).timeout
|
|
set_process(true)
|
|
can_shoot = true
|
|
# EventBus.shield_changed.emit(max_shield, old_value, shield)
|
|
|
|
func _process(delta):
|
|
var input = Input.get_vector("left", "right", "up", "down")
|
|
if input.x > 0:
|
|
$Ship.frame = 2
|
|
$Ship/Boosters.animation = "right"
|
|
elif input.x < 0:
|
|
$Ship.frame = 0
|
|
$Ship/Boosters.animation = "left"
|
|
else:
|
|
$Ship.frame = 1
|
|
$Ship/Boosters.animation = "forward"
|
|
position += input * speed * delta
|
|
position = position.clamp(Vector2(8, 8), screensize - Vector2(8, 8))
|
|
if Input.is_action_pressed("shoot"):
|
|
shoot()
|
|
|
|
func shoot():
|
|
if not can_shoot:
|
|
return
|
|
can_shoot = false
|
|
$GunCooldown.start()
|
|
var b = bullet_scene.instantiate()
|
|
get_tree().root.add_child(b)
|
|
b.start(position + ship.position + Vector2(0, -1))
|
|
var tween = create_tween().set_parallel(false)
|
|
tween.tween_property(ship, "position:y", 1, 0.1)
|
|
tween.tween_property(ship, "position:y", 0, 0.05)
|
|
|
|
func set_shield(value: int):
|
|
var old_value = shield
|
|
shield = clamp(value, 0, max_shield)
|
|
EventBus.shield_changed.emit(max_shield, old_value, shield)
|
|
print("Shield set to:", shield)
|
|
if shield <= 0:
|
|
EventBus.player_died.emit()
|
|
set_process(false)
|
|
$Ship.hide()
|
|
$Explosion.show()
|
|
$Explosion/AnimationPlayer.play("explosion-one-shot")
|
|
await $Explosion/AnimationPlayer.animation_finished
|
|
|
|
func _on_gun_cooldown_timeout() -> void:
|
|
can_shoot = true
|
|
|
|
func _on_area_entered(area):
|
|
if area.is_in_group("enemies"):
|
|
area.explode()
|
|
shield -= int(max_shield / 2)
|
|
damage_taken.emit()
|
|
if area.is_in_group("enemy_bullets") and self.monitoring == true:
|
|
damage_taken.emit()
|
|
|
|
|
|
func _on_damage_taken() -> void:
|
|
# emit_signal("shield_ui")
|
|
shader_active = true
|
|
$Ship.material.set_shader_parameter("toggle", 1.0)
|
|
await get_tree().create_timer(1).timeout
|
|
$Ship.material.set_shader_parameter("toggle", 0.0)
|
|
shader_active = false
|
|
|
|
func _on_game_over() -> void:
|
|
print("Game over!")
|
|
# set_process(false)
|
|
monitoring = false
|
|
$Ship.frame = 1
|
|
await get_tree().create_timer(2).timeout
|
|
var tween = create_tween()
|
|
tween.tween_property(self, "position:y", 60 * -1, .25).set_ease(tween.EASE_IN)
|