[09]スコアーを表示

2Dシューティング

エネミーが破壊された時にスコアーを加算する
エネミースクリプトで破壊時にポイントを送るシグナルとポイントを設定して、HPが0になったときにemitする

extends CharacterBody2D

# シグナル
signal enemy_destruction(points)

# 移動スピード
const move_speed = 30.0
# HP
var health = 10
# ポイント
var points = 10

var direction: Vector2

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

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

func _physics_process(delta: float) -> void:
	direction.y = 1
	velocity = direction.normalized() * move_speed
	position += velocity * delta

	shoot()
	
	move_and_slide()

func _on_visible_on_screen_notifier_2d_screen_exited() -> void:
	print("outside")
	queue_free()
	
func shoot():
	if canShoot:
		canShoot = false
		shoot_timer.start()

		var bullet = ENEMY_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("Enemy Damage")
	if health <= 0:
		enemy_destruction.emit(points)
		queue_free()

メインスクリプトでシグナルを受け取る
エネミーを出現させる際にシグナルに接続しておく。そして破壊時にポイントを受け取り、スコアに加算

extends Node2D

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

# スコアー
var score = 0

func _ready() -> void:
	# マウスカーソルを消す
	Input.mouse_mode = Input.MOUSE_MODE_CAPTURED

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
	prints("Score: ", score)

スコアの表示
CanvasLayerにControlを追加し全面にする

ContorlをHUDにリネームして新規シーンにする
Labelを追加してフォントを設定する(今回は無指定)サイズは60

スコアを表示するスクリプト

extends Control

@onready var score_label: Label = $scoreLabel

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

メインシーンにHUDを追加してスコアを表示させる

extends Node2D

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

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

func _ready() -> void:
	# マウスカーソルを消す
	Input.mouse_mode = Input.MOUSE_MODE_CAPTURED

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
	hud.update_score(score)
	prints("Score: ", score)