Menu
CoddyTech

Zderzenie i restart

Część sekcji Projekty ścieżki Godot w Coddy. Lekcja 21 z 36.

Statek przelatuje przez skały. Skała, która dotknie statku, powinna zakończyć grę. W _on_body_entered w pliku rock.gd statek jest ciałem o nazwie Ship. Skała emituje sygnał hit_ship. main.gd łączy go w spawn_rock i kończy grę:

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

Boom to jednorazowy węzeł CPUParticles2D. Ustaw emitting na true, a wyemituje cząsteczki raz. Jest dzieckiem węzła Main, który ma ustawienie Always, więc działa, gdy gra jest wstrzymana.

Na koniec spraw, by Enter rozpoczynał nową grę, gdy jest ona wstrzymana, tak jak w Breakout: wznów grę, a następnie wywołaj reload_current_scene(). Działa to również po wygranej.

challenge icon

Wyzwanie

Średni

Zakończ grę, gdy asteroida uderzy w statek.

  1. W rock.gd dodaj signal hit_ship i emituj ten sygnał, gdy obiektem jest Ship.
  2. W main.gd połącz go w spawn_rock z _on_hit_ship, który wyświetla Game Over, ukrywa statek, wywołuje eksplozję w miejscu, w którym był $Boom, i wstrzymuje grę.
  3. Gdy gra jest wstrzymana, naciśnięcie Enter wznawia ją i ponownie wczytuje scenę.

Naciśnij „Graj” i wleć w asteroidę: statek eksploduje. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Projekty

Poćwicz samodzielnie: Edytor online Godot