エネミーが破壊された時にスコアーを加算する
エネミースクリプトで破壊時にポイントを送るシグナルとポイントを設定して、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)