“Oyun mantığı kodu” nedir?


50

C # / XNA kullanıyorum ve güncelleme kodunu draw koduyla karıştırmamaları konusunda epeyce söylendi - ve emin değilim! Fakat herhangi biri, lütfen “mantık kodunun” tam olarak ne olduğunu açıklayabilir mi?

Burada görüldüğü gibi: http://blogs.msdn.com/b/shawnhar/archive/2007/07/25/understanding-gametime.aspx

[...] tüm oyun mantığınızı Güncelleme yöntemine (Draw'da değil) koyduğunuzdan emin olun ve her şey güzel bir sabit hızda çalışacaktır.

Bunu soruyorum çünkü oyunumun hızı FPS'ye göre dalgalanıyor. Yavaş FPS yavaş hareket eden nesnelere eşittir ve bunun tersi de geçerlidir. Ve evet, beklenen position += speed * (float)gt.ElapsedGameTime.TotalSeconds;kodu ekliyorum.

Bu muhtemelen büyük bir çaylak sorusu, ama ben sadece bunun tanımı konusunda net bir şekilde durmak istiyorum.


Sanırım demek istedin position = speed * ...TotalSeconds. Dikkat et =değil +=. Öyle olsaydı +=Yazdığınız olarak sadece, sonra pozisyon neredeyse anında ekranın dışına uçardı.
DrZ214

'Position + = direction * speed * ... TotalSeconds' gibi görünen bir kod var ve çok iyi çalışıyor. Bir şeyi yanlış yazmış olabilirim, ancak position = hız her güncellemeyi atadı. Yolunuz işe yarayabilir, ama kodum böyle çalışıyor. (
Yönün

gt.ElapsedGameTime.TotalSecondsProgramın başlatılmasından geçen saniye sayısının (oyun) olduğunu sanıyordum . Hızınızı bununla çarpıyorsanız, 5 saniye çaldıktan sonra, hızınız 5 kat daha hızlı olacaktır (hızın 0 olarak ayarlandığı özel durum hariç). Başka ne sahip olabileceğinden emin değilim, bu yanlış olur, ama merak ediyorum.
DrZ214

1
Aha, son güncellemeden beri. gamedev.stackexchange.com/questions/67968/…
Shyy Guy

2
Büyüleyici bunu asla tahmin edemezdim. Saniyeler içinde böyle bir şeye hiç ihtiyaç duymadım, çünkü kişisel olarak iiiher güncellemeyi manuel olarak arttırdığım denilen değişkenimi kullanıyorum çünkü saniyeler içinde istemiyorum, adımlar veya çerçeveler istiyorum. Yolunuzun, yumuşak kodlama işlerinin geçerli bir yolu olduğunu görebiliyorum.
DrZ214

Yanıtlar:


102

Oyun dünyanızın durumunu değiştiriyor mu? Bu mantık kodu.

Oyun dünyasının durumunu gösteriyor mu? Render kodu.


% 100 emin olmak için koduma göz atacağım. İyi açıklama, teşekkürler.
Shyy Guy

38
Giriş işliyor mu? Denetleyici kodu. Kontrolü mantıktan ayırın, böylece aynı mantığı farklı kontrol tipleri ile kullanabilirsiniz. Örneğin, bir FPSInputController + CharacterMotor - AIInputController + CharacterMotor - NetworkInputController (örn. Çok oyunculu bir örnekteki diğer oyuncular) + CharacterMotor. Motor (mantık kodu), sadece sağladıkları talimatları (bu tür ayrıştırma, oynatıcıdan AI botuna (Sol 4 Ölü ve boşta kalan oyuncuları düşünün) ve geriye) geçişi kolaylaştırmak için yaptığı talimatları nasıl aldığını önemsemez. Diğer şeylerin yanı sıra).
Draco18s,

10
Draco iyi bir noktaya getiriyor. Koda koyabileceğiniz birçok farklı bölüm var. Nils'in bölünmesi, mantık ve renderleme arasındaki arketipsel bölünmeyi dikkate alır, ancak göreceğiniz birçok katman daha vardır. Bunları katmanlara ayırmanın asıl nedeni, her katmanın benzer gereksinimleri olan benzer bir kod stili gerektiren benzer eylemlerden oluşmasıdır. Örneğin, birçok oyunda, tamamlamak için 2 veya 3 kare alan oyun mantığından kurtulabilirsiniz, ancak her kareyi oluşturmadıysanız, kullanıcının gözü hızla fark edilir.
Cort Ammon

Bunları farklı tutmak, zorlama kaynağı olmaya başladıklarında gereksinimlerinizi yönetmenize yardımcı olacaktır.
Cort Ammon

6
Ve eğer üzerine çok fazla MVC fırlatırsanız, sürünmeyi yavaşlatacağını unutmayın, bu nedenle daima bakım ve optimizasyon arasında bir denge sağlamaya çalışın. Fakat ne yaptığınızdan kesinlikle emin değilseniz, çok erken optimizasyon yapmayın. Ve unutma, her zaman refactor yapabileceğini. Ve ... Ah, pek çok oyun yap ve hatalarından ders al.
Maurycy,

24

Aşağıdaki durumlarda ayrılmanız doğrudur:

  • Draw () komutunu, Update () 'in serpiştirilmiş çağrıları olmadan üst üste defalarca çağırmak, çağrılar arasında hiçbir zaman gözle görülür değişikliklere neden olmaz.
  • Güncelleme (), Draw () serisinin serpiştirilmiş bir araması olmadan üst üste defalarca çağırmak, oyunu ekran kapalıyken oynamak gibidir: her şey mükemmel ve tutarlı bir şekilde ilerler, sadece göremezsiniz.

5
Doğru şekilde yazılmış Draw(), zaman geçtikçe farklı resimler çizebilir. Örneğin, hareketli sprite kare değişmeye devam edebilir. Ayrıca, oluşturma kodu ortak bir numara kullanıyorsa ve velocity * time since last update / period of updatenesnelerin görünür konumuna eklerse (gerçek konumları değişmeden kalırken) , nesneler görsel olarak ilerlemeye devam edebilir .
HolyBlackCat

2
iffeğer-ve-sadece-eğer?
BalinKingOfMoria

3
@HolyBlackCat: bu tartışılabilir. Grafikleri duraklatmak istersem ne olur? Animasyon kareleri oyunu etkiliyorsa (hit kutulara karşılık gelen saldırı animasyonları vb.)? Görsel enterpolasyon hala “zamanın” (oyunun delta saatinde olduğu gibi) geçtiğini ima eder, fakat zaman geçiyorsa ve gelmiyorsanız Update, senkronizasyondan başka ne çıkıyor? Oyuncu girişleri cevapsız, ağ olayları işlenmiyor vb. Oyun, tek bir saatten sürülmeli, oyun mantığı ya da o saatten türetilen fizik için sabit “keneler” ve aynı saatle sürülen türetilmiş grafik durumu.
Sean Middleditch

@SeanMiddleditch Katılıyorum, hemen hemen her zaman Draw()böyle bir şekilde yazabilirsiniz , böylece art arda birkaç kez çağrıldığında her zaman aynı resmi çizer. Mümkünse biri bunu yapmalı. Ancak hangi sıklıkta Draw()çağrılacağını bilmediğiniz durumlar vardır . Örneğin, yeni 120hz monitörler için tam destek (gerçek 120 FPS) istiyorsanız ve vsync'i açın. What if I want to pause graphics?Daha sonra gerçek delta zamanı yerine 0 değerini iletin Draw().
HolyBlackCat

2
@HolyBlackCat: Aldığım hiçbir şey 120Hz render işlemesini engelleyemezdi. Kesinlikle sabit bir çekiliş oranı önermiyordum; bu sadece amatörce. Sabit oranlı oyun mantığı kene için birikim değerine beslenen render kareleri cinsinden ölçülen bir küresel oyun saati olmalıdır. Bu küresel saat, enterpolasyon da dahil olmak üzere grafikler kullanıyor. Saat ölçeğini ayarlayarak grafikleri duraklatabilirsiniz 0. Hiyerarşik saatlere sahip olabilirsiniz, bu nedenle karakter arayüzü enterpolasyonu da durduğunda, çok çok kolay bir şekilde UI hala çalışır ve canlanır.
Sean Middleditch

7

Buradaki amaç, model olmayan modellerin ayrılmasıdır.

Oyun Mantığı;

Bunların hepsi farklı, ilgili, yazılım mimarisi kalıplarıdır. Ancak her durumda Model aynıdır, gerçek mantık ve gerçek durumdur.

İş yazılımı yaparken bazen iş mantığı denir ve bazı iş politikalarını kodlar. Örneğin, bir banka için bir şey kodluyorsanız, kredi kartı faturalarını hesaplamak için, o zaman borçlarını 30 günden daha kısa sürede temizlerse birinin faiz ödemesi gerekmemesi işlevi, iş mantığının bir parçasıdır. modeli. Örneğin, görüntüleyen katmanlardan birinde yaşamıyor. Örneğin, fatura yazdırmak için kullanılan kod, işlemlerini temel alarak metni düzenlemez. Bu örnek belki de kodunuzu neden bu şekilde düzenlemek isteyebileceğinizi vurgulamaktadır.

Benzer oyun mantığı için de geçerli.

Bir noktada oyununuzun başka bir konsola taşındığını hayal edin. Mevcut hedefinizden gerçekten farklı bir şey hayal etmenize yardımcı olabilir. Örneğin, bir gamepad / kontrol cihazıyla bir şey hedefliyorsanız, oyununuzun bir dokunmatik tablete taşındığını hayal edin. Oyun mantığı, kodu taşıdığınızda değişmeyen kodun bir parçasıdır.

Oyununuz bir askeri strateji oyunu gibi bir şeydi, dünyanın en karmaşık tahta oyununa dönüştürüldüğünü hayal edin. Oyun mantığı, kural kitaplarındaki doğrudan çizgilere karşılık gelen kod bölümleridir. (Kural kitabındaki bütün satırlar değil, taşan parçalarla ilgili olanlar değil, bazıları.).

Oyun mantığı, form ne olursa olsun değişmeyen bir şeydir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.