0Pricing
Learn Rust Coding · Ders

Çarpışmalar ve Oyun Durumu

Kurallar ve kazanma koşulları ekleyin.

Çarpışmalar ve Oyun Durumu, CoddyKit'te ücretsiz bir Learn Rust Coding dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Learn Rust Coding öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Learn Rust Coding kursu toplamda 4 dersten oluşur.

AABB Çarpışmasının Temelleri

En basit çarpışma testi, eksenlere hizalı sınırlayıcı kutuların (AABB) örtüşmesidir. İki dikdörtgen, hem x hem de y eksenlerinde örtüştüklerinde çarpışır.

Hareketli görüntüler için bu yöntem hızlıdır ve tam bir fizik motoruna geçmeden önce birçok 2B oyun için yeterlidir.

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
}

Collider Bileşeni

Her varlığa, yarı genişlik ve yükseklik sınırlarını veya tam boyutunu taşıyan bir Collider bileşeni ekleyin. Sistemler daha sonra örtüşmeleri test etmek için dönüşümü ve çarpıştırıcıyı birlikte okur.

Boyutu kendi bileşeninde tutmak, farklı varlıkların aynı çarpışma sistemini paylaşmasını sağlar.

#[derive(Component)]
struct Collider {
    size: Vec2,
}

Bir Sistemde Çarpışmaları Algılama

Bir oyuncuyu birçok engelle karşılaştırmak için oyuncuyu bir kez sorgulayın ve engeller üzerinde yineleyin. İki ayrı sorgu, aynı verinin iki kez ödünç alınmasını önler.

Örtüşme olduğunda Commands aracılığıyla veya bileşenleri değiştirerek hasar verme, sektirme ya da oluşturmayı kaldırma gibi tepkiler verin.

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");
        }
    }
}

Olaylarla Tepki Verme

Sonuçları doğrudan aynı yerde işlemek yerine özel bir Event gönderin. Bir sistem çarpışmaları algılayıp olaylar yayınlar; başka bir sistem bunları okuyup etkileri uygular.

Bu yaklaşım, algılamayı tepkiden ayırır ve her sistemi küçük tutar.

#[derive(Event)]
struct CollisionEvent { entity: Entity }

fn emit(mut writer: EventWriter<CollisionEvent>, e: Entity) {
    writer.send(CollisionEvent { entity: e });
}

Olayları Okuma

Bir okuyucu sistemi, sıraya alınmış olayları EventReader ile alır ve her biri üzerinde işlem yapar. Olaylar iki kare boyunca yaşar; bu nedenle her okuyucu onları görebilir.

Bu yayınlama-abone olma akışı ölçeklenebilir: sıkı bağımlılık olmadan çok sayıda üretici ve tüketici kullanılabilir.

fn on_hit(mut reader: EventReader<CollisionEvent>, mut commands: Commands) {
    for ev in reader.read() {
        commands.entity(ev.entity).despawn();
    }
}

Skoru Güncelleme

Oyuncu bir toplama nesnesi aldığında, genel Score kaynağını ResMut ile değiştirin.

Kaynaklar benzersiz olduğundan, herhangi bir sistem skoru elle aktarmadan okuyabilir veya güncelleyebilir.

fn collect(mut score: ResMut<Score>, mut reader: EventReader<PickupEvent>) {
    for _ in reader.read() {
        score.0 += 10;
    }
}

Durumlar: Genel Bakış

Oyunlar menü, oynama, duraklatma ve oyun bitti gibi kipler arasında geçiş yapar. Bevy, bu kipleri init_state ile kaydedilen bir States numaralandırmasıyla modeller.

Aynı anda yalnızca bir durum etkin olur ve sistemler belirli durumlarda çalışacak şekilde sınırlandırılabilir.

#[derive(States, Default, Debug, Clone, PartialEq, Eq, Hash)]
enum GameState {
    #[default]
    Menu,
    Playing,
    GameOver,
}

Durum Kaydetme

Durumu init_state ile uygulamaya ekleyin. Bevy daha sonra geçerli değeri takip eder ve State ile NextState kaynaklarını kullanıma sunar.

Bir sistemin hangi kipte olduğunu bilmesi gerektiğinde geçerli durumu Res<State<GameState>> ile okuyun.

App::new()
    .add_plugins(DefaultPlugins)
    .init_state::<GameState>()
    .run();

Sistemleri Bir Durumda Çalıştırma

Sistemleri run_if koşulundaki in_state ile bir duruma bağlayın. Hareket ve çarpışma yalnızca Playing durumundayken çalışır.

Duraklatma bu şekilde çalışır: Playing durumundan çıkarak oynanış sistemlerini durdurursunuz; bu sistemler de hiç çalışmaz.

app.add_systems(
    Update,
    (drive, detect).run_if(in_state(GameState::Playing)),
);

Durumlar Arasında Geçiş Yapma

Durumu değiştirmek için herhangi bir sistemden NextState değerini ayarlayın. Bevy geçişi bir sonraki kare sınırında uygular.

Bir duruma girerken arayüz oluşturmak veya durumdan çıkarken temizlemek için OnEnter ve OnExit zamanlamalarını kullanın.

fn lose(mut next: ResMut<NextState<GameState>>, health: Res<Health>) {
    if health.0 == 0 {
        next.set(GameState::GameOver);
    }
}

Çıkışta Temizleme

Playing durumundan çıkarken oynanış varlıklarını kaldırarak bir sonraki turun temiz başlamasını sağlayın. Bunları bir işaretleyiciyle etiketleyin ve bu işareti taşıyan her şeyi kaldırın.

Temizleme işlemini OnExit(GameState::Playing) içinde kaydedin; böylece her geçişte tam olarak bir kez çalışır.

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);

Kısa Kontrol

Oynanışı temiz bir şekilde nasıl duraklatacağınızı düşünün.

Özet: Çarpışmalar ve Oyun Durumu

AABB testleri ve bir Collider bileşeni örtüşmeleri algılar; olaylar algılamayı tepkiden ayırır ve bir Score kaynağı ilerlemeyi takip eder. run_if, NextState ve OnEnter/OnExit kullanan States sistemi menüleri, oynanışı ve oyun bitişini yapılandırır.

Artık tam döngüye sahipsiniz: oluşturun, denetleyin, çarpıştırın ve geçiş yapın. Bu parçalarla eksiksiz bir Bevy oyunu geliştirin.

Sıkça Sorulan Sorular

“Çarpışmalar ve Oyun Durumu” dersi ücretsiz mi?

Evet — “Çarpışmalar ve Oyun Durumu” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Learn Rust Coding kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Learn Rust Coding kursu toplamda 4 dersten oluşur.

“Çarpışmalar ve Oyun Durumu” dersinde ne öğreneceğim?

Kurallar ve kazanma koşulları ekleyin. Learn Rust Coding ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Learn Rust Coding öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Learn Rust Coding, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Çarpışmalar ve Oyun Durumu” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Learn Rust Coding dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Learn Rust Coding dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. ECS Yaklaşımı
  2. Varlık Oluşturma ve Taşıma
  3. Girdiyi ve Zamanı Yönetme
  4. Çarpışmalar ve Oyun Durumu
← Learn Rust Coding Sayfasına Dön