Menu
CoddyTech
flag Pt iconPortuguêsdown icon

Divida as rochas

Parte da seção Projetos do Journey de Godot da Coddy. Lição 16 de 33.

Uma pedra grande deve se dividir em duas pequenas. Dê a cada pedra um size: 2 para as grandes e 1 para as pequenas. Em rock.gd, dentro de _ready, defina scale = Vector2.ONE * size * 0.5.

A pedra informa que se quebrou com signal broken(rock) e broken.emit(self). self é a pedra. Agora, spawn_rock recebe um tamanho e conecta o sinal:

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)

O sinal chega enquanto o Godot verifica quais áreas estão em contato. Adicionar uma área nesse momento interrompe o jogo com Can't change this state while flushing queries. call_deferred executa a chamada no fim do quadro, quando isso é seguro.

challenge icon

Desafio

Difícil
  1. Em rock.gd, adicione var size = 2 e signal broken(rock). Defina a escala a partir de size em _ready. Emita broken com self quando uma bala atingir a rocha.
  2. Em main.gd, faça spawn_rock(where, velocity, size) definir o size da rocha e conectar o sinal broken. As primeiras 4 rochas têm tamanho 2.
  3. Quando uma rocha de tamanho 2 se romper, crie duas rochas de tamanho 1 naquele local com call_deferred. As velocidades delas são a velocidade anterior rotacionada em 0.8 e -0.8, multiplicada por 1.5.

Experimente você mesmo

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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Projetos

Pratique por conta própria: Playground de Godot