Kodlayıcı ile aynı motorda çalıştım. Farklı bir bakış açım var. :)
İlk olarak, bir yığın FSM'miz yoktu - bir yığın devletimiz vardı. Durumların bir yığını tek bir FSM yapar. Bir yığın FSM'nin neye benzeyeceğini bilmiyorum. Muhtemelen pratik bir şeyler yapmak için fazla karmaşık.
Global Devlet Makinemiz ile ilgili en büyük sorunum, bir devletler dizisi değil, bir devletler yığını olmasıydı. Bu, örneğin, ... / MainMenu / Loading öğesinin ... / Loading / MainMenu'dan farklı olduğu anlamına gelir, ana ekranın yükleme ekranından önce mi yoksa sonra mı başlatıldığına bağlı olarak (oyun asenkron ve yükleme çoğunlukla sunucu tarafından yönlendirilir) ).
Bu çirkin yapılan şeylere iki örnek olarak:
- Bu, örneğin, LoadingGameplay durumuna yol açtı, bu yüzden, normal yükleme durumundaki kodun çoğunu tekrar etmek zorunda kaldığınız, Gameplay durumu içinde yükleme yapmak için Base / Loading ve Base / Gameplay / LoadingGameplay kullandınız. ).
- "Eğer karakter yaratıcısında oyuna giderse; oyunda karakter seçimine giderse; karakter seçiminde ise girişe geri dönecektim" gibi bir takım fonksiyonlarımız vardı, çünkü aynı arayüz pencerelerini farklı durumlarda göstermek istiyoruz fakat Geri / İleri yapmak düğmeleri hala çalışıyor.
İsmine rağmen, çok "küresel" değildi. Çoğu iç oyun sistemi, iç durumlarını izlemek için kullanmadılar, çünkü devletlerinin diğer sistemlerle dalga geçmesini istemiyorlardı. Diğerleri, örneğin UI sistemi, onu ancak devleti kendi yerel devlet sistemlerine kopyalamak için kullanabilir. (UI durumları için sisteme karşı özellikle dikkatli olurum. UI durumu bir yığın değil, gerçekten bir DAG ve üzerinde herhangi bir yapıyı zorlamaya çalışmak sadece kullanmak için can sıkıcı UI'ler yapacak.)
Bunun için iyi olan şey, oyun akışının gerçekte nasıl yapılandırıldığını bilmeyen altyapı programcılarından kod entegre etme görevlerini izole etmektir, böylece yamayı yazan adama "kodunuzu Client_Patch_Update" e koyup, grafikleri yazan adama söyleyebilirsiniz. loading "kodunuzu Client_MapTransfer_OnEnter" a koyunca, bazı mantık akışlarını çok fazla sorun yaşamadan değiştirebiliriz.
Bir yan projede, bir devlet ile daha iyi şans oldu set bir yerine yığın alakasız sistemler için birden fazla makine yapmak korkmak, ve kendimi gerçekten bir "küresel devlet" olma tuzağına, içine düşmesine izin reddederek değil, şeyleri global değişkenler arasında senkronize etmenin karmaşık bir yolu - Tabi, bir süre bitmek üzere yapmayı başaracaksınız, ancak bununla hedefiniz olarak tasarlamayın . Temel olarak, bir oyundaki durum bir yığın değildir ve bir oyundaki durumların hepsi birbiriyle ilişkili değildir.
GSM ayrıca, işlev göstericileri ve yerel olmayan davranışlar yapma eğiliminde olduğundan, bu tür büyük devlet geçişlerinde hata ayıklamak da bizim için çok eğlenceli değildi. Devlet yığınları yerine devlet setleri buna gerçekten yardımcı olmuyor, ama bunun farkında olmalısınız. İşlev işaretçileri yerine sanal işlevler bunu biraz hafifletebilir.