2016-03-30 18 views
2

Ve "pratik yolu ile" Yani oyunun hızını engelleyemeyeceği bir şekilde demek istiyorum.HaxeFlixel oyun içi olaylarda "pratik bir şekilde" nasıl kodlanır?

ben RPG programlama ve bildiğiniz gibi birçok ediyorum, bunlar olayların TAM konum:

  1. Eğer bir olay bazı konuşma olur

  2. tetikler yeni odasına yürümek chars ve npcs

  3. arasındaki hikayeyi geliştirmek için, ancak o odaya yeniden girdiğinizde hiçbir şey olmuyor. harita değişiklikleri Bool dizisi (bu durumda 6'da) değerinin ise EventReg.hx o sınıfta denetler (en çok 6 harita gider diyelim) her zaman ki

Oyunumu kodlu true ve PlayState.hx eventAvailable değişkenine kopyalanır.

Ardından güncelleme işleminde, harita numarasına göre olayı çalıştırır, ancak bu yaklaşımın, bir anahtar biçiminde PlayState.hx'de sıkışık bir kod kodunun kullanılmasını gerektirdiğini hissediyorum (geçerli haritanın değerini alarak) referans olarak).

Herhangi bir açık kaynaklı RPG, örnekleri veya bununla ilgili eğiticilerden herhangi birini bilen var mı? TIA!

Örnek:

//Event Helper 
private var eventAvailable:Bool; 
private var currentMap:Int = MapReg.currentMap; 

override public function create():Void 
{ 
    //Checks if there's an even in the current map. 
    eventAvailable = EventReg.isEvent[currentMap]; 
    if (eventAvailable) 
     setupEvent(); 
} 

private function setupEvent():Void 
{ 
    switch(currentMap) 
    { 
     case 0: //code 
     case 1: //code 
    } 
} 
+0

Sadece yardımcı olabilecek bazı bağlantılar. İşte olayları olan bir haxeflixel rpg taban kodu projesi: https://github.com/kevinresol/flixel-rpg. Ve ben de haxeflixel (ve herhangi bir döngü yok, iyi olabilir veya olmayabilir olmayabilir) olaylar için msignal seviyorum. Https://github.com/massiveinteractive/msignal – 5Mixer

+0

Nerede bekliyorsunuz? bir performans darboğazı mı? Mevcut etkinliklerin kontrolü? Bir çerçeve güncelleme fonksiyonu? Her odada performansın yüzlerce olamadığı sürece, performansın hiç fark etmeyeceğini sanmıyorum ki bu mümkün değil. Genel olarak, performans görüntü oluşturma, grafik, ses, varlıkların yüklenmesi ve boşaltılması, oyun mantığı değil, etkenlerden etkilenir. –

+0

Anlıyorum, o zaman bu yaklaşıma sadık kalacağım, teşekkürler! –

cevap

0

olaylarını işlemek için etkili bir yöntem, Observer Pattern gibi bir şey olabilir. Gözlemcinin belirli bir etkinlik için abone olacağı bir platform oyunu libresi için bu desenin bir varyasyonunu kullandım. Benim için gayet iyi çalışıyor, bu yüzden paylaşabileceğimi düşündüm. İşte

benim taban sınıfları var:

1) BaxEventSubscriber

interface BaxEventSubscriber { 
    function getNotified(baxEventKey:String):Void; 
} 

2) BaxEvent

class BaxEvent implements BaxEventSubscriber 
{ 
    public var id:String; 

    /** Event will be fired when all prequisite events are triggered. 
    * Once a prequisite is satisfied, it will be removed from this list. 
    * When the list is empty, the event will trigger */ 
    public var prequisiteEvents:Array<String>; 

    /** 
    * If serialExecution is true, the prequisites must be executed in a serialised order (first to last) 
    * In other words, every prequisite will be satisfied only if it is first in the prequisited list 
    * 
    * If serial execution is false (default, the prequisites can be satisfied in any order) 
    */ 
    public var serialExecution : Bool = false; 

    public function new (id:String) 
    { 
     if (id == null) { 
      throw "any Event should have an id"; 
     } 

     this.id = id; 
     prequisiteEvents = new Array<String>(); 

    } 


    public function addPrequisite(key:String):Void { 

     if (key == null || key.length == 0) { 
      return; 
     } 

     var isUnique:Bool = true; 
     for (i in 0...prequisiteEvents.length) { 
      var ss:String = prequisiteEvents[i]; 
      if (ss == key) { 
       isUnique = false; 
      } 
     } 

     if (isUnique) { 

      prequisiteEvents.push(key); 
      BaxEventManager.getManager().addSubscriberForEvent(this, key); 
     } 
    } 

    public function getNotified(baxEventKey:String):Void { 
     this.eventTriggered(baxEventKey); 
    } 

    public function eventTriggered(key:String):Void { 
     var isPrequisite :Bool = false ; 

     for (i in 0...prequisiteEvents.length) { 
      var ss:String = prequisiteEvents[i]; 
      if (ss == key) { 
       isPrequisite = true; 
      } 
     } 

     if (isPrequisite) { 

      var ind:Int = prequisiteEvents.indexOf(key); 
      // If no serialExecution, checkout this event. 
      // Else, check it out only if it's the first on the prequisites list 
      if (! serialExecution || ind == 0 ) { 
       prequisiteEvents.splice(ind, 1); 
      } 
     } 
     // if all prequisites are satisfied, fite the Event 
     if (prequisiteEvents.length == 0) { 
      BaxEventManager.getManager().broadcastEvent(this.id); 
     } 
    } 


} 

3) BaxEventManager

Gerçek uygulamamda, olayın, oyun oturumu veya Seviye başına bir kez kaydedilip kaydedilmeyeceğini (veya tetiklemesi) tanımlayan farklı türdeki olayları da kullanıyorum veya sonsuza kadar tetiklenecektir. Şimdi bunu düşünüyorum, bunu BaxEvent Sınıfına dahil etmeliyim.

Her neyse, asıl bu tasarım ile

  • Kovuldunuz olaylar üzerinde daha iyi bir kontrole sahip ve bu olaylar zaten
  • Üzerinde yineleme gerekmez ateş edildiği izlemek kolaydır olmasıdır Tüm olaylar veya aboneler aracılığıyla bir güncelleme fonksiyonu
  • Bu genişletilebilir ve seviye olayları (toplanan tüm paralar), yürüyüş etkinlikleri, tamamlanan diyaloglar, anahtarlar ve etkileşimli nesneler vb. gibi farklı etkinlikler için kullanabilirsiniz.

Etkinlik Yöneticisi, bir statik sınıf sınıfı olarak da tasarlayabilmenize rağmen, bir singleton Sınıfıdır.

BaxEvent Olay aboneyi uygulayan tek sebebi, onların prequisites (diğer olaylar) tatmin olacaktır kez onlar ateş edeceği, böylece karmaşık olayları destek olmaktır. Ancak, bu sizin için bir overkill ise, bu işlevi kaldırabilir ve kodunuzu basitleştirebilirsiniz.