[10]ゲームオーバー
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