[10]ゲームオーバー

2Dシューティング

HUDと同じくControlでGAMEOVER画面を作る

スクリプト
メインシーンから呼ばれるスコア部分とボタンクリック部分
ボタンはそれぞれのノードから接続してクリック時の動作を指定する

extends Control

@onready var hiscore_label: Label = $Panel/HiscoreLabel
@onready var score_label: Label = $Panel/ScoreLabel

func set_score(score):
	score_label.text = "Score : " + str(score)

func set_hi_score(score):
	hiscore_label.text = "Hi-Score : " + str(score)

func _on_quit_button_pressed() -> void:
	get_tree().quit()

func _on_restart_button_pressed() -> void:
	get_tree().reload_current_scene()

プレイヤーにシグナルを追加

extends CharacterBody2D

# シグナル
signal destruction

# 移動スピード
const move_speed = 100.0
# 傾き
var turnTilt = 4
# HP
var health = 10

var direction: Vector2

# バレット
var canShoot = true 
const BULLET = preload("res://scenes/bullet.tscn")
@onready var marker_2d: Marker2D = $Marker2D
@onready var shoot_timer: Timer = $shootTimer

func _ready() -> void:
	add_to_group("player")

func _physics_process(delta: float) -> void:
	direction.x = Input.get_axis("move_left", "move_right")
	direction.y = Input.get_axis("move_up", "move_down")
	
	if direction.x:
		velocity = direction.normalized() * move_speed
		if direction.x < 0:
			rotation = -1 * turnTilt * delta
		elif direction.x > 0:
			rotation = 1 * turnTilt * delta
	elif direction.y:
		velocity = direction.normalized() * move_speed
		rotation = 0 * turnTilt * delta
	else :
		velocity = Vector2.ZERO

	# 攻撃
	if Input.is_action_pressed("shoot"):
		shoot()

	position += velocity * delta

	# 画面の外に行かないように	
	var viewRect = get_viewport_rect()
	var viewOffset = Vector2(50, 50)
	position = position.clamp(viewOffset, viewRect.size - viewOffset)

	move_and_slide()

func shoot():
	if canShoot:
		canShoot = false
		shoot_timer.start()

		var bullet = BULLET.instantiate()
		bullet.set_position(marker_2d.global_position)
		get_parent().add_child(bullet)

func _on_shoot_timer_timeout() -> void:
	canShoot = true
	
func get_damage(damage):
	health -= damage
	print("Play Damage")
	if health <= 0:
		destruction.emit()
		queue_free()

メインシーンにプレーヤーが破壊された時のシグナル受信とゲームオーバー表示を追加

extends Node2D

# ランダムエネミー
@export var enemies: Array[PackedScene] = []
@onready var enemy_node: Node2D = $EnemyNode
@onready var enemy_spawn_timer: Timer = $EnemySpawnTimer
@onready var game_over: Control = $CanvasLayer/GameOver

# スコアー
var score = 0
var hi_score : int
@onready var hud: Control = $CanvasLayer/HUD

func _ready() -> void:
	# マウスカーソルを消す
	Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
	var player = get_tree().get_first_node_in_group("player")
	player.destruction.connect(_on_player_destruction)
	hi_score = 0
	hud.update_score(0)

func _process(delta: float) -> void:
	# ESCでマウスカーソルを出す
	if Input.is_action_just_pressed("ui_cancel"):
		Input.mouse_mode = Input.MOUSE_MODE_VISIBLE

func _on_enemy_spawn_timer_timeout() -> void:
	var enemy = enemies.pick_random().instantiate()
	enemy.global_position = Vector2(randf_range(40, 440) , 50)
	enemy.enemy_destruction.connect(_on_enemy_destruction)
	enemy_node.add_child(enemy)

func _on_enemy_destruction(points):
	score += points
	if score > hi_score:
		hi_score = score
	hud.update_score(score)
	prints("Score: ", score)

func _on_player_destruction():
	game_over.visible = true
	game_over.set_score(score)
	game_over.set_hi_score(hi_score)
	Input.mouse_mode = Input.MOUSE_MODE_VISIBLE