Menu
CoddyTech

Dividere le rocce

Fa parte della sezione Progetti del percorso Godot di Coddy. Lezione 18 di 36.

Un sasso colpito dovrebbe dividersi in due. Il sasso segnala che si è rotto con signal broken(rock) e broken.emit(self). self è il sasso, quindi il listener sa dov’era e come si muoveva.

spawn_rock collega ogni nuovo sasso con rock.broken.connect(_on_rock_broken) e quella funzione genera due sassi che si allontanano in direzioni diverse:

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)

Il segnale arriva mentre Godot controlla quali aree si toccano. Aggiungere un’area in quel momento arresta il gioco con Can't change this state while flushing queries. call_deferred esegue la chiamata alla fine del frame, quando è sicuro farlo.

Per ora ogni sasso si divide, quindi non finiscono mai. Le dimensioni verranno dopo.

challenge icon

Sfida

Difficile

Fai in modo che le rocce colpite si dividano in due.

  1. In rock.gd, aggiungi signal broken(rock) e chiama broken.emit(self) quando un proiettile colpisce, prima di queue_free().
  2. In main.gd, collega il segnale broken di ogni roccia a _on_rock_broken in spawn_rock.
  3. In _on_rock_broken(rock), genera due rocce come mostrato, con call_deferred.

Premi «Gioca» e spara a una roccia: due rocce si allontanano volando. Poi premi «Verifica».

Provalo tu

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)

Tutte le lezioni di Progetti

Esercitati da solo: Playground Godot