Menu
CoddyTech

Divide las rocas

Parte de la sección Proyectos del Journey de Godot de Coddy. Lección 18 de 36.

Una roca alcanzada por un disparo debería dividirse en dos. La roca indica que se rompió con signal broken(rock) y broken.emit(self). self es la roca, así que quien escucha la señal sabe dónde estaba y cómo se movía.

spawn_rock conecta cada roca nueva con rock.broken.connect(_on_rock_broken), y esa función genera dos rocas que se alejan en direcciones distintas:

func _on_rock_broken(rock):
	spawn_rock.call_deferred(rock.position, rock.velocity.rotated(0.8) * 1.5)
	spawn_rock.call_deferred(rock.position, rock.velocity.rotated(-0.8) * 1.5)

La señal llega mientras Godot comprueba qué áreas están en contacto. Añadir un área en ese momento detiene el juego con Can't change this state while flushing queries. call_deferred ejecuta la llamada al final del fotograma, cuando es seguro hacerlo.

Por ahora, todas las rocas se dividen, así que nunca se acaban. A continuación, veremos los tamaños.

challenge icon

Desafío

Difícil

Haz que las rocas alcanzadas por disparos se dividan en dos.

  1. En rock.gd, añade signal broken(rock) y llama a broken.emit(self) cuando una bala impacte, antes de queue_free().
  2. En main.gd, conecta la señal broken de cada roca con _on_rock_broken en spawn_rock.
  3. En _on_rock_broken(rock), genera dos rocas como se muestra, con call_deferred.

Pulsa «Jugar» y dispara a una roca: dos rocas se separan volando. Después, pulsa «Comprobar».

Pruébalo tú mismo

extends Node2D

const ROCK = preload("res://rock.tscn")

func _ready():
	for i in 4:
		spawn_rock(Vector2(randf_range(0, 640), 0), Vector2(randf_range(-90, 90), randf_range(40, 90)))

func spawn_rock(where, velocity):
	var rock = ROCK.instantiate()
	rock.position = where
	rock.velocity = velocity
	add_child(rock)

Todas las lecciones de Proyectos

Practica por tu cuenta: Playground de Godot