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.
Desafío
DifícilHaz que las rocas alcanzadas por disparos se dividan en dos.
- En
rock.gd, añadesignal broken(rock)y llama abroken.emit(self)cuando una bala impacte, antes dequeue_free(). - En
main.gd, conecta la señalbrokende cada roca con_on_rock_brokenenspawn_rock. - En
_on_rock_broken(rock), genera dos rocas como se muestra, concall_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
2Proyecto: Disparador de asteroides
Gira la naveEnciende el motorPractica por tu cuenta: Playground de Godot