Menu
CoddyTech

Pecah Asteroid

Termasuk bagian Proyek dalam perjalanan Godot di Coddy. Pelajaran 18 dari 36.

Batu yang terkena tembakan seharusnya terbelah menjadi dua. Batu melaporkan bahwa batu itu pecah dengan signal broken(rock) dan broken.emit(self). self adalah batu tersebut, jadi pendengar tahu di mana batu itu berada dan bagaimana batu itu bergerak.

spawn_rock menghubungkan setiap batu baru dengan rock.broken.connect(_on_rock_broken), dan fungsi itu memunculkan dua batu yang bergerak ke arah berlawanan:

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)

Sinyal tiba saat Godot memeriksa area mana yang bersentuhan. Menambahkan area saat itu akan menghentikan game dengan Can't change this state while flushing queries. call_deferred menjalankan pemanggilan di akhir frame, saat hal itu aman dilakukan.

Untuk saat ini, setiap batu terbelah, jadi batu tidak akan pernah habis. Ukuran akan dibahas berikutnya.

challenge icon

Tantangan

Sulit

Buat batu yang terkena tembakan terbelah menjadi dua.

  1. Di rock.gd, tambahkan signal broken(rock) dan panggil broken.emit(self) saat peluru mengenai batu, sebelum queue_free().
  2. Di main.gd, hubungkan broken milik setiap batu ke _on_rock_broken di spawn_rock.
  3. Di _on_rock_broken(rock), munculkan dua batu seperti yang ditunjukkan, dengan call_deferred.

Tekan tombol “Main” dan tembak sebuah batu: dua batu akan terbang menjauh. Lalu tekan tombol “Periksa”.

Coba sendiri

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)

Semua pelajaran di Proyek

Latihan sendiri: Playground Godot