Menu
CoddyTech
flag Ru iconРусскийdown icon

Разбиваем астероиды

Часть раздела Проекты путешествия по Godot на Coddy. Урок 16 из 33.

Большой камень должен раскалываться на два маленьких. Задай для каждого камня size: 2 для большого и 1 для маленького. В _ready файла rock.gd задай scale = Vector2.ONE * size * 0.5.

Камень сообщает о том, что он раскололся, с помощью signal broken(rock) и broken.emit(self). self — это сам камень. Теперь spawn_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)

Сигнал поступает, пока Godot проверяет, какие области соприкасаются. Добавление области в этот момент останавливает игру с сообщением Can't change this state while flushing queries. call_deferred выполняет вызов в конце кадра, когда это безопасно.

challenge icon

Задание

Сложно
  1. В rock.gd добавь var size = 2 и signal broken(rock). Задай масштаб на основе size в _ready. При попадании пули отправь сигнал broken с self.
  2. В main.gd сделай так, чтобы spawn_rock(where, velocity, size) задавала камню size и подключала его сигнал broken. Размер первых 4 камней — 2.
  3. Когда камень размера 2 разбивается, создай там два камня размера 1 с помощью call_deferred. Их скорости — это старая скорость, повернутая на 0.8 и -0.8 радиана и умноженная на 1.5.

Попробуйте сами

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 iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Проекты

Потренируйтесь самостоятельно: Песочница Godot