Proyecto Ejemplo: SignalsDemo
I software engineer. Developer Python. I read books. I watch movies. I writer fiction. I am a black cat. And You?
📂 Estructura de carpetas
res://
│
├── main.tscn # Escena principal
├── main.gd
│
├── hud/
│ ├── hud.tscn
│ └── hud.gd
│
├── player/
│ ├── player.tscn
│ └── player.gd
│ ├── sword.gd
│
├── enemy/
│ ├── enemy.tscn
│ └── enemy.gd
│ └── enemy_attack.gd
│
├── items/
│ ├── coin.tscn
│ └── coin.gd
│
└── doors/
├── door.tscn
└── door.gd
🔹 1. Escena Principal (main.tscn)
Node2D (raÃz)
Player(instancia deplayer.tscn)Enemy(instancia deenemy.tscn)Coin(instancia decoin.tscn)Door(instancia dedoor.tscn)HUD(instancia dehud.tscn)
Script main.gd
extends Node2D
func _ready():
# Conexión monedas → HUD
for coin in get_tree().get_nodes_in_group("coins"):
coin.coin_collected.connect($HUD.add_points)
# Conexión player → HUD (vida)
$Player.health_changed.connect($HUD.update_health)
# Conexión espada → enemigo
$Player/Sword.hit_enemy.connect($Enemy.take_damage)
# Conexión puerta → cambiar de escena
$Door.player_entered.connect(change_scene)
func change_scene():
var new_scene = load($Door.next_scene)
get_tree().change_scene_to_packed(new_scene)
🔹 2. HUD (hud.tscn)
Control (raÃz)
ScoreLabel(Label)HealthBar(ProgressBar)
Script hud.gd
extends Control
var score: int = 0
@onready var score_label: Label = $ScoreLabel
@onready var health_bar: ProgressBar = $HealthBar
func add_points(points: int) -> void:
score += points
score_label.text = "Score: " + str(score)
func update_health(value: int) -> void:
health_bar.value = value
🔹 3. Player (player.tscn)
CharacterBody2D (raÃz, grupo
"player")CollisionShape2DAnimatedSprite2DSword(Area2D)
Script player.gd
extends CharacterBody2D
signal health_changed(new_health: int)
var max_health: int = 100
var health: int = 100
func take_damage(amount: int) -> void:
health -= amount
health = max(health, 0)
health_changed.emit(health)
if health <= 0:
print("Game Over")
Script sword.gd
extends Area2D
signal hit_enemy(damage: int)
@export var damage: int = 25
func _on_body_entered(body: Node) -> void:
if body.is_in_group("enemy"):
hit_enemy.emit(damage)
🔹 4. Enemy (enemy.tscn)
CharacterBody2D (raÃz, grupo
"enemy")CollisionShape2DSprite2DEnemyAttack(Area2D con CollisionShape2D)
Script enemy.gd
extends CharacterBody2D
var health: int = 100
func take_damage(amount: int) -> void:
health -= amount
print("Enemy HP:", health)
if health <= 0:
queue_free()
Script enemy_attack.gd
extends Area2D
@export var damage: int = 20
func _on_body_entered(body: Node) -> void:
if body.is_in_group("player"):
body.take_damage(damage)
🔹 5. Coin (coin.tscn)
Area2D (raÃz, grupo
"coins")CollisionShape2DSprite2D
Script coin.gd
extends Area2D
signal coin_collected(points: int)
@export var points: int = 10
func _on_body_entered(body: Node) -> void:
if body.is_in_group("player"):
coin_collected.emit(points)
queue_free()
🔹 6. Door (door.tscn)
Area2D (raÃz)
CollisionShape2DSprite2D
Script door.gd
extends Area2D
signal player_entered
@export var next_scene: String = "res://main.tscn"
func _on_body_entered(body: Node) -> void:
if body.is_in_group("player"):
player_entered.emit()
🚀 Cómo funciona
Player recoge monedas → se emite señal → HUD actualiza score.
Player ataca enemigo → se emite señal → enemigo recibe daño.
Enemy ataca player → player emite señal de vida → HUD actualiza barra.
Player cruza puerta → se emite señal →
main.gdcambia de escena.



