Menu
CoddyTech

Zderzenie i restart

Część sekcji Projekty ścieżki Godot w Coddy. Lekcja 18 z 33.

Statek przelatuje przez skały. Skała, która dotknie statku, powinna zakończyć grę. W rock.gd, w funkcji _on_body_entered, 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 efekt CPUParticles2D. Ustaw emitting na true, a efekt wyemituje cząsteczki raz. Jest dzieckiem Main, który ma ustawienie Always, więc efekt odtwarza się, gdy gra jest wstrzymana.

Na koniec spraw, by klawisz Enter rozpoczynał nową grę, gdy gra jest 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
  1. W pliku rock.gd dodaj signal hit_ship i emituj ten sygnał, gdy ciało to Ship.
  2. W pliku main.gd połącz go w funkcji spawn_rock z funkcją _on_hit_ship. Wyświetla ona komunikat Game Over, ukrywa statek, wywołuje eksplozję w miejscu, w którym znajdował się statek, za pomocą $Boom i wstrzymuje grę.
  3. Gdy gra jest wstrzymana, naciśnięcie klawisza Enter wznawia ją i ponownie wczytuje scenę.

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