2011-06-16 18 views
10

Temel olarak, bir oyun karakterinin saldırılarını kontrol eden, animasyon uzunluğuna dayalı zamanlamaları olan bir durum makinesine sahibim. Örneğin bu şekildeBüyük bir durum makinesini uygulamanın en iyi yolu?

:

varsayılan durumuna başlar ve oyuncu bir saldırı düğmesine basması durumunda bu durumu değiştirme ve saldırılar uzunluğuna dayalı bir saatini ayarlayan bir saldırı başlatır. Durum makinesi daha karmaşıklaşıyor, ancak iptal edilebilecek saldırı saldırılarını ele aldığımda, vurduklarına bağlı olarak farklı durumlara geçebilen saldırılar ve her devletin saldırıya uğrayan karakterle başa çıkmanın benzersiz yolları var. Şu anda büyük anahtar beyanlarım var. Polimorfizm hakkında düşünmüştüm ama bu her devlet için bir çok sınıfın (başlangıç ​​saldırısı, saldırı ve hücum ataklarının hepsi ayrı ayrı devletler gerektiriyor) yeni bir sınıf gerektiriyordu.

Anahtar deyimi çalışır, ancak oldukça büyük ve aynı zamanda bir kalıtım tabanlı sistem olarak kolayca değiştirilemez.

İyi görünümlü uygulamalar hakkında herhangi bir öneriniz var mı?

DÜZENLEME: Bu java kullanıyor.

cevap

8

. Geleneksel Sonlu Durum Makinalarının birçok eyalette ortak geçişleri yeniden kullanacak mekanizmalar sağlamadığı ortaya çıkıyor, bu yüzden çok fazla tekrarlıyorsunuz ve devlet makineniz "patlıyor" (bu aynı zamanda Kendini Tekrar Etmeyin - Kendinize de karşı geliyor) DRY) prensibi). Ben hiyerarşik devlet makineleri ve ve kod kolay haritalama böyle devlet makineleri verir uygulama tekniği kullanılarak öneriyoruz Bu nedenle

. Hiyerarşik durum makineleri hakkında daha fazla bilgi için, http://en.wikipedia.org/wiki/UML_state_machine numaralı Wikipedia makalesine bakın. Benim yanımda

2

bir tablo güdümlü devlet makinesini oluşturmayı düşünün şablon/tip programlamada alışmak. Bir durum makinesinin tanımını düşünürseniz, temel olarak, bir numaralı numaralı, bir başlangıç ​​durumu, bir geçiş işlevi ve (bu durumda) bir giriş ve çıkış alfabesiyle bir dizi kümeniz vardır.

Geçerli duruma ve girişe göre indekslenmiş bir tablo oluşturabilir ve ne olduğunu göstermek için işlev göstermek için bir işaretçi veya bir functor sınıfı kullanabilirsiniz. Bu işlev bir sonraki duruma dönmelidir. Sonra devlet makinesini (yalancı kod) inşa edebilirsiniz:

lookupTransition(inputs) basitçe sonraki halini bulur
state := initial state 
while(state != STOP) 
    state := (lookupTransition(inputs))() 

. Burada, geçiş işlevlerinin, geri dönen argümanların işlevleri olmadığına inanıyorum, bu nedenle lookupTransition(inputs), sahip olduğunuz birçok girdinin bir işlevi olmalı ve dönüş yapan öğelere geri dönen bir işleve işaretçi döndürmelidir.

Bunu doğru şekilde ayarlayın ve tüm durum makinesini ve davranışını kolayca değiştirilebilen ve yeniden derlenen tek bir tabloya koyabilirsiniz.

(Ekstra kredi için, bir dosyadan bu tabloyu yükleyebilirsiniz anlamaya, böylece hiç yeniden derlemek gerekmez.)

Güncelleme Java'da

, gibi bir şey kullanmak Fonksiyon işaretçileri yerine bir functor sınıfı.

Başka Güncelleme Tabii

, başka bir seçenek Ragel gibi bir durum makinesi derleyici kullanmaktır.

+0

Gerçek sorun bu değil. Her eyalet/etkinlik kombinasyonu için yeni bir sınıfa ihtiyacınız olduğunda, kod çok ayrıntılı hale gelir. Sonunda böyle şeyleri kısa sürede yapabilmek için kapanmayı beklemek zorundayız. Şimdilik, yansıma veya kod oluşturma, kendi dezavantajları ile kod karmaşasını azaltmak için kullanılabilir. – irreputable

+0

Biliyorsunuz, dürüst olmak gerekirse, burada önemli bir karmaşıklık olduğunu sanıyorum. Kapatmalara sahip olmak, yalnızca geçiş başına bir veya iki satırda yardımcı olur; Funktörler kullanılarak bu kod bir çeşit çerez kesici yapar, ancak karmaşıklık bu kadar farklı değildir. Ruby veya Python veya Groovy gibi dinamik bir dil kullanmak biraz yardımcı olabilir, ancak öncelikle tablonun yükleme bölümünü kolaylaştırır. Ama sonuç olarak, karmaşık bir devlet makineniz varsa, kod yazmanız gerekecek. –

0

Ben hiç kullandım ama http://commons.apache.org/scxml/ var ettik diyemeyiz. Başkaları tarafından önerilen tablo bazlı yaklaşımı kullanarak el ile yazmak zor değil. Eğer "geçiş patlama" fenomeni için dikkat edilmelidir büyük devlet makinalarıyla

1

Ben stateforge bir HFSM (http://www.stateforge.com/) kullanıyorum. Paralel durum, Hiyerarşik yaklaşım ve gözlemci oldukça karmaşık bir durumu çözebilir.

İlgili konular