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.
Tantangan
SulitBuat batu yang terkena tembakan terbelah menjadi dua.
- Di
rock.gd, tambahkansignal broken(rock)dan panggilbroken.emit(self)saat peluru mengenai batu, sebelumqueue_free(). - Di
main.gd, hubungkanbrokenmilik setiap batu ke_on_rock_brokendispawn_rock. - Di
_on_rock_broken(rock), munculkan dua batu seperti yang ditunjukkan, dengancall_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
1Proyek: Breakout
Pemukul BreakoutJaga Pemukul Tetap di Layar4Proyek: Penjelajah Ruang Bawah Tanah
Jelajahi Ruang Bawah TanahAmbil KunciLatihan sendiri: Playground Godot