Skip to main content

Command Palette

Search for a command to run...

Proyecto Ejemplo: SignalsDemo

Published
•3 min read
J

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 de player.tscn)

    • Enemy (instancia de enemy.tscn)

    • Coin (instancia de coin.tscn)

    • Door (instancia de door.tscn)

    • HUD (instancia de hud.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")

    • CollisionShape2D

    • AnimatedSprite2D

    • Sword (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")

    • CollisionShape2D

    • Sprite2D

    • EnemyAttack (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")

    • CollisionShape2D

    • Sprite2D

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)

    • CollisionShape2D

    • Sprite2D

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

  1. Player recoge monedas → se emite señal → HUD actualiza score.

  2. Player ataca enemigo → se emite señal → enemigo recibe daño.

  3. Enemy ataca player → player emite señal de vida → HUD actualiza barra.

  4. Player cruza puerta → se emite señal → main.gd cambia de escena.