Girdiyi ve Zamanı Yönetme
Oyuncuya ve saate tepki verin.
Girdiyi ve Zamanı Yönetme, CoddyKit'te ücretsiz bir Learn Rust Coding dersidir. Bu, 4 dersinin 3. 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.
Girdi Bir Kaynak Olarak
Klavye durumu, DefaultPlugins tarafından sağlanan ButtonInput<KeyCode> kaynağında tutulur.
Bu kaynağı yalnızca okunabilir olarak Res ile isteyin. Bevy, sistemleriniz çalışmadan önce kaynağı her karede günceller; böylece her zaman güncel durumu görürsünüz.
fn read_keys(keys: Res<ButtonInput<KeyCode>>) {
if keys.pressed(KeyCode::Space) {
info!("space held");
}
}pressed ve just_pressed
pressed, bir tuş basılı tutulduğu her karede true olur; sürekli hareket için idealdir. just_pressed ise yalnızca tuşa basıldığı karede true olur.
Zıplama veya ateş etme gibi tek seferlik eylemler için just_pressed kullanın; böylece tek bir dokunuş yalnızca bir kez ateş eder.
fn jump(keys: Res<ButtonInput<KeyCode>>) {
if keys.just_pressed(KeyCode::ArrowUp) {
info!("jump!");
}
}Yön Vektörü Oluşturma
Birden fazla tuşu tek bir hareket yönünde birleştirin. Sıfırdan başlayın ve basılan her tuş için ilgili eksene bir birim ekleyin.
Sonucu normalleştirmek, çapraz hareketin düz hareketten daha hızlı olmasını önler.
fn direction(keys: Res<ButtonInput<KeyCode>>) -> Vec2 {
let mut d = Vec2::ZERO;
if keys.pressed(KeyCode::KeyW) { d.y += 1.0; }
if keys.pressed(KeyCode::KeyS) { d.y -= 1.0; }
if keys.pressed(KeyCode::KeyA) { d.x -= 1.0; }
if keys.pressed(KeyCode::KeyD) { d.x += 1.0; }
d.normalize_or_zero()
}Zaman Kaynağı
Kare hızları makineye göre değişir; bu nedenle kare başına sabit bir miktarda hareket ettirmeyin. Time kaynağı, son kareden bu yana geçen saniye miktarı olan delta_secs() değerini sağlar.
Hızı delta ile çarpmak, hareketi kare hızından bağımsız hâle getirir.
fn move_player(time: Res<Time>, mut q: Query<&mut Transform, With<Player>>) {
let dt = time.delta_secs();
for mut tf in &mut q {
tf.translation.x += 200.0 * dt;
}
}Girdi ile Zamanı Birleştirme
Gerçek yaklaşım, her iki kaynağı tek bir sistemde birleştirir: yönü girdiden okuyun, ardından bu yönü hız ve delta ile ölçeklendirin.
Bu, oyun saniyede 30 veya 144 kareyle çalışsa da akıcı ve tutarlı bir denetim sağlar.
fn drive(
keys: Res<ButtonInput<KeyCode>>,
time: Res<Time>,
mut q: Query<&mut Transform, With<Player>>,
) {
let mut d = Vec2::ZERO;
if keys.pressed(KeyCode::KeyA) { d.x -= 1.0; }
if keys.pressed(KeyCode::KeyD) { d.x += 1.0; }
let step = d.normalize_or_zero() * 300.0 * time.delta_secs();
for mut tf in &mut q {
tf.translation += step.extend(0.0);
}
}Fare Düğmeleri
Fare düğmeleri, KeyCode yerine MouseButton kullanılarak aynı ButtonInput API'sini kullanır.
Bu tutarlılık, klavye için geliştirdiğiniz pressed ve just_pressed alışkanlıklarını doğrudan tıklamalara aktarmanızı sağlar.
fn shoot(buttons: Res<ButtonInput<MouseButton>>) {
if buttons.just_pressed(MouseButton::Left) {
info!("fire");
}
}Bekleme Süreleri için Zamanlayıcılar
Bir Timer, hedef süreye kadar geçen zamanı takip eder. Her güncellemede kare delta'sı ile ilerletin.
Ateş etme aralığı için tekrarlanan bir zamanlayıcı kullanın ve ne zaman eyleme geçeceğinizi belirlemek için just_finished() değerini kontrol edin.
#[derive(Component)]
struct Cooldown(Timer);
fn tick(time: Res<Time>, mut q: Query<&mut Cooldown>) {
for mut cd in &mut q {
cd.0.tick(time.delta());
if cd.0.just_finished() { info!("ready"); }
}
}Zamanlayıcı Oluşturma
Bir zamanlayıcıyı süre ve TimerMode değerinden oluşturun. Once tetiklendikten sonra durur; Repeating ise otomatik olarak sıfırlanır.
Her varlığın, örneğin bir taretin, kendine ait bağımsız bir çalışma aralığı olabilmesi için zamanlayıcıyı bir bileşende saklayın.
use std::time::Duration;
commands.spawn((
Turret,
Cooldown(Timer::new(Duration::from_millis(500), TimerMode::Repeating)),
));Belirlenimlilik için FixedUpdate
Fizik ve ağ kodu çoğu zaman sabit bir zaman adımına ihtiyaç duyar. FixedUpdate zamanlamasındaki sistemler, görüntüleme hızından bağımsız olarak saniyede sabit sayıda çalışır.
Bu sistemlerin içinde, deltası her zaman aynı olan Time<Fixed> kullanın; böylece benzetim yeniden üretilebilir olur.
App::new()
.add_plugins(DefaultPlugins)
.add_systems(FixedUpdate, physics_step)
.run();Geçen Zaman ve Delta
time.delta_secs(), son kareden bu yana geçen aralıktır. time.elapsed_secs() ise başlangıçtan beri geçen toplam zamandır.
Geçen zaman, toplam zamanı işleve verdiğiniz, hareket eden bir toplama nesnesi gibi sinüs dalgasıyla yönlendirilen animasyonlar için çok uygundur.
fn bob(time: Res<Time>, mut q: Query<&mut Transform, With<Pickup>>) {
let t = time.elapsed_secs();
for mut tf in &mut q {
tf.translation.y = (t * 2.0).sin() * 10.0;
}
}Sınırlar İçinde Kırpma
Hareket ettirdikten sonra, dönüşümü pencerenin yarı genişlik ve yükseklik sınırları içinde kırparak oyuncuyu ekranda tutun.
f32::clamp her ekseni sınırlar. Tam sınırları gerektiğinde pencere boyutunu Window sorgusundan okuyun.
fn clamp(mut q: Query<&mut Transform, With<Player>>) {
for mut tf in &mut q {
tf.translation.x = tf.translation.x.clamp(-300.0, 300.0);
tf.translation.y = tf.translation.y.clamp(-200.0, 200.0);
}
}Kısa Kontrol
Kare hızından bağımsızlığı düşünün.
Özet: Girdi ve Zaman
Girdi, ButtonInput kaynaklarında bulunur; basılı tutulan eylemler için pressed, dokunuşlar için just_pressed kullanın. Time kaynağı ve Timer bileşenleri, hareketi ve bekleme sürelerini kare hızından bağımsız tutar.
Denetim artık hazır olduğuna göre son derste çarpışmalar ve oyun durumu geçişleri eklenecek.
Sıkça Sorulan Sorular
“Girdiyi ve Zamanı Yönetme” dersi ücretsiz mi?
Evet — “Girdiyi ve Zamanı Yönetme” 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.
“Girdiyi ve Zamanı Yönetme” dersinde ne öğreneceğim?
Oyuncuya ve saate tepki verin. 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 3. dersidir.
“Girdiyi ve Zamanı Yönetme” 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
- ECS Yaklaşımı
- Varlık Oluşturma ve Taşıma
- Girdiyi ve Zamanı Yönetme
- Çarpışmalar ve Oyun Durumu