Menu
CoddyTech

Choca y reinicia

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

La nave vuela entre rocas. Una roca que toque la nave debería terminar la partida. En _on_body_entered de rock.gd, la nave es el cuerpo llamado Ship. La roca emite una señal hit_ship. main.gd la conecta en spawn_rock y termina la partida:

func _on_hit_ship():
	$HUD/Message.text = "Game Over"
	$Ship.hide()
	$Boom.position = $Ship.position
	$Boom.emitting = true
	get_tree().paused = true

Boom es un CPUParticles2D de un solo disparo. Configura emitting como true y estalla una vez. Es hijo de Main, que está en Always, así que funciona mientras la partida está en pausa.

Por último, haz que Enter inicie una partida nueva mientras está en pausa, como en Breakout: quita la pausa y después ejecuta reload_current_scene(). También funciona después de ganar.

challenge icon

Desafío

Intermedio

Termina el juego cuando una roca golpee la nave.

  1. En rock.gd, añade signal hit_ship y emítela cuando el cuerpo sea Ship.
  2. En main.gd, conéctala en spawn_rock a _on_hit_ship, que muestra Game Over, oculta la nave, hace estallar $Boom donde estaba y pausa el juego.
  3. Mientras el juego está en pausa, Enter reanuda y vuelve a cargar la escena.

Pulsa «Jugar» y vuela hacia una roca: la nave explota. Después, pulsa «Comprobar».

Pruébalo tú mismo

extends Node2D

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

var score = 0
var rocks_left = 4

func _ready():
	for i in 4:
		spawn_rock(Vector2(randf_range(0, 640), 0), Vector2(randf_range(-90, 90), randf_range(40, 90)), 2)
	$HUD/Score.text = "Score: 0"

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

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)
		score += 20
		rocks_left += 2
	else:
		score += 50
	rocks_left -= 1
	$HUD/Score.text = "Score: %d" % score
	if rocks_left == 0:
		$HUD/Message.text = "You win!"
		get_tree().paused = true
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