Tabrakan dan Keadaan Gim
Tambahkan aturan dan kondisi kemenangan.
Tabrakan dan Keadaan Gim adalah pelajaran Learn Rust Coding gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Learn Rust Coding, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Learn Rust Coding mencakup 4 pelajaran total.
Dasar-Dasar Tabrakan AABB
Pemeriksaan tabrakan paling sederhana adalah tumpang tindih kotak pembatas yang sejajar dengan sumbu (AABB). Dua persegi panjang bertabrakan ketika keduanya saling tumpang tindih pada sumbu x dan y.
Untuk sprite, cara ini cepat dan cukup baik untuk banyak permainan 2D sebelum Anda menggunakan mesin fisika lengkap.
fn overlaps(a_pos: Vec2, a_size: Vec2, b_pos: Vec2, b_size: Vec2) -> bool {
(a_pos.x - b_pos.x).abs() < (a_size.x + b_size.x) * 0.5
&& (a_pos.y - b_pos.y).abs() < (a_size.y + b_size.y) * 0.5
}Komponen Collider
Pasang komponen Collider yang menyimpan setengah ukuran atau ukuran penuh setiap entitas. Sistem kemudian membaca transformasi dan collider untuk memeriksa tumpang tindih.
Menyimpan ukuran dalam komponen tersendiri memungkinkan berbagai entitas menggunakan sistem tabrakan yang sama.
#[derive(Component)]
struct Collider {
size: Vec2,
}Mendeteksi Tabrakan dalam Sistem
Untuk membandingkan pemain dengan banyak rintangan, buat kueri pemain sekali lalu lakukan iterasi pada rintangan. Dua kueri terpisah mencegah peminjaman data yang sama dua kali.
Saat terjadi tumpang tindih, Anda dapat memberikan reaksi—kerusakan, pantulan, atau penghapusan—melalui Commands atau dengan mengubah komponen.
fn detect(
player: Query<(&Transform, &Collider), With<Player>>,
walls: Query<(&Transform, &Collider), With<Wall>>,
) {
let (pt, pc) = player.single().unwrap();
for (wt, wc) in &walls {
if overlaps(pt.translation.truncate(), pc.size, wt.translation.truncate(), wc.size) {
info!("hit a wall");
}
}
}Bereaksi dengan Peristiwa
Daripada menangani konsekuensi secara langsung, kirim Event khusus. Satu sistem mendeteksi tabrakan dan memancarkan peristiwa; sistem lain membaca dan menerapkan efeknya.
Pemisahan ini membuat deteksi tidak bergantung pada reaksi dan menjaga setiap sistem tetap kecil.
#[derive(Event)]
struct CollisionEvent { entity: Entity }
fn emit(mut writer: EventWriter<CollisionEvent>, e: Entity) {
writer.send(CollisionEvent { entity: e });
}Membaca Peristiwa
Sistem pembaca mengambil peristiwa yang mengantre dengan EventReader lalu bertindak pada setiap peristiwa. Peristiwa bertahan selama dua frame, sehingga pembaca mana pun dapat melihatnya.
Alur terbitkan-berlangganan ini dapat berkembang: banyak penghasil dan banyak pengguna tanpa keterikatan yang erat.
fn on_hit(mut reader: EventReader<CollisionEvent>, mut commands: Commands) {
for ev in reader.read() {
commands.entity(ev.entity).despawn();
}
}Memperbarui Skor
Saat pemain mengumpulkan item, ubah sumber daya global Score dengan ResMut.
Karena sumber daya bersifat unik, sistem mana pun dapat membaca atau memperbarui skor tanpa harus meneruskannya secara manual.
fn collect(mut score: ResMut<Score>, mut reader: EventReader<PickupEvent>) {
for _ in reader.read() {
score.0 += 10;
}
}Status: Gambaran Besar
Permainan berpindah antar-mode—menu, bermain, dijeda, dan permainan berakhir. Bevy memodelkannya dengan enum States yang didaftarkan melalui init_state.
Hanya satu status yang aktif pada satu waktu, dan sistem dapat dibatasi agar berjalan dalam status tertentu.
#[derive(States, Default, Debug, Clone, PartialEq, Eq, Hash)]
enum GameState {
#[default]
Menu,
Playing,
GameOver,
}Mendaftarkan Status
Tambahkan status ke aplikasi dengan init_state. Bevy kemudian melacak nilai saat ini dan menyediakan sumber daya State serta NextState.
Baca status saat ini dengan Res<State<GameState>> saat sistem perlu mengetahui modenya.
App::new()
.add_plugins(DefaultPlugins)
.init_state::<GameState>()
.run();Menjalankan Sistem dalam Status
Batasi sistem pada suatu status dengan kondisi run_if dan in_state. Pergerakan dan tabrakan hanya berjalan saat Playing.
Beginilah cara jeda bekerja: hentikan sistem permainan dengan meninggalkan status Playing, dan sistem tersebut tidak akan berjalan.
app.add_systems(
Update,
(drive, detect).run_if(in_state(GameState::Playing)),
);Melakukan Transisi Status
Untuk mengubah status, atur NextState dari sistem mana pun. Bevy menerapkan transisi pada batas frame berikutnya.
Gunakan jadwal OnEnter dan OnExit untuk membuat UI saat memasuki status atau membersihkannya saat meninggalkan status tersebut.
fn lose(mut next: ResMut<NextState<GameState>>, health: Res<Health>) {
if health.0 == 0 {
next.set(GameState::GameOver);
}
}Pembersihan saat Keluar
Saat meninggalkan Playing, hapus entitas permainan agar ronde berikutnya dimulai dengan bersih. Tandai entitas tersebut dengan penanda, lalu hapus semua entitas yang membawanya.
Daftarkan pembersihan dalam OnExit(GameState::Playing) agar berjalan tepat satu kali setiap transisi.
fn cleanup(mut commands: Commands, q: Query<Entity, With<GameEntity>>) {
for e in &q {
commands.entity(e).despawn();
}
}
// app.add_systems(OnExit(GameState::Playing), cleanup);Pemeriksaan Cepat
Pertimbangkan cara menjeda permainan dengan rapi.
Rangkuman: Tabrakan dan Status Permainan
Pemeriksaan AABB dan komponen Collider mendeteksi tumpang tindih; peristiwa memisahkan deteksi dari reaksi, dan sumber daya Score melacak kemajuan. Sistem States, bersama run_if, NextState, dan OnEnter/OnExit, menyusun menu, permainan, dan akhir permainan.
Sekarang Anda memiliki seluruh siklus: membuat, mengendalikan, bertabrakan, dan melakukan transisi. Bangun permainan Bevy lengkap dari bagian-bagian ini.
Belajar Rust dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 39
- Pelajaran
- 144
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Tabrakan dan Keadaan Gim” gratis?
Ya — teks lengkap “Tabrakan dan Keadaan Gim” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Learn Rust Coding, upgrade ke CoddyKit PRO. Kursus Learn Rust Coding mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Tabrakan dan Keadaan Gim”?
Tambahkan aturan dan kondisi kemenangan. Kamu berlatih Learn Rust Coding dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Learn Rust Coding?
Tidak diperlukan pengalaman sebelumnya. Learn Rust Coding di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Tabrakan dan Keadaan Gim” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Learn Rust Coding ini?
Ya. Setiap pelajaran Learn Rust Coding menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Pola Pikir ECS
- Membuat dan Memindahkan Entitas
- Menangani Masukan dan Waktu
- Tabrakan dan Keadaan Gim