Menu
CoddyTech

Dividir las rocas

Parte de la sección Proyectos del Journey de Godot de Coddy. Lección 16 de 33.

Una roca grande debería dividirse en dos pequeñas. Asigna a cada roca un size: 2 para las grandes y 1 para las pequeñas. En rock.gd, dentro de _ready, establece scale = Vector2.ONE * size * 0.5.

La roca informa que se ha roto con signal broken(rock) y broken.emit(self). self es la roca. Ahora spawn_rock recibe un tamaño y conecta la señal:

func _on_rock_broken(rock):
	if rock.size == 2:
		spawn_rock.call_deferred(rock.position, rock.velocity.rotated(0.8) * 1.5, 1)
		spawn_rock.call_deferred(rock.position, rock.velocity.rotated(-0.8) * 1.5, 1)

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.

challenge icon

Desafío

Difícil
  1. En rock.gd, agrega var size = 2 y signal broken(rock). Establece la escala a partir de size en _ready. Emite broken con self cuando una bala impacte.
  2. En main.gd, haz que spawn_rock(where, velocity, size) establezca el size de la roca y conecte su señal broken. Las primeras 4 rocas tienen tamaño 2.
  3. Cuando se rompa una roca de tamaño 2, genera allí dos rocas de tamaño 1 con call_deferred. Sus velocidades son la velocidad anterior girada en 0.8 y -0.8, multiplicadas por 1.5.

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)
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Proyectos

Practica por tu cuenta: Playground de Godot