Bir oyuncunun bir başarıyı tamamlayıp tamamlamadığını nasıl kontrol etmeliyim?


13

Bir MMO oyunu yapıyorum ve başarıları gerçekleştirmem gereken bir noktaya geldim ... Bunu nasıl yapabilirim? Yapılacak en basit şey, bunu her 100 ms'de bir çalıştırmak olacaktır:

for a in achievements
    for p in players
        if a.meetsRequirements(p) then p.completeAchievement(a)

Ancak bu daha da fazla komplikasyon yaratır. Örneğin, başarının gerçekten tamamlanıp tamamlanmadığını nasıl kontrol ederim? Oyuncuların sadece belirli bir başarı için kendilerine özel özellikleri var mı? Görevlerle bu tür bir şey yaptım, çünkü esas olarak "100 odun topla", bir oyuncu üzerindeki aktif görevler bunu kontrol ediyor. Ayrıca, kontrol etmek için daha iyi bir zaman olmalı, bu periyodik olarak sunucumu yavaşlatır diye düşünüyorum.


7
Neden eylemler yapılırken sadece ilgili kontroller yapılmıyor? Yani kullanıcı odun toplarsa, "100 odun topla" şartnamesine uyup uymadığına bakın.
Mike Cluck

1
Bu çok dağınık görünüyor ... Her yerde tonlarca kontrol olurdu. Bence bu basitlik yüzünden yukarıdaki algoritmaya bağlı
kalacağım

10
Daha az dağınık hale getirmenin yolları vardır: "OnChange" olay işleyicisine sahip olmak, daha sonra bunlara başarı "nesneleri" eklemek ve mantığı burada işlemek gibi. Ayrıca, mevcut kurulumunuzda O (n ^ 2) karmaşıklık seviyesine sahip olduğunuzu anlayın, bu da oyununuzun daha fazla karakterle çok daha yavaş hale geldiği anlamına gelir. Bir MMO için bir sorun
Mike Cluck

Yanıtlar:


23

Yaptığınız şey başarının doğasına bağlıdır. Başarılarınız basit bir desene uymadıkça (X sayısını Ys toplayın), bunları bir dereceye kadar özel olarak ele almanız gerekecektir.

Mesaj tabanlı bir iletişim sistemi kullanarak, özel durum kodlamasını yerel yapan kancalar sağlayabilirsiniz. Kendilerini kaydeden dinleyicilere mesaj göndermek için bazı eylemler yapabilirsiniz. Daha sonra başarı kodunuz / betiğiniz sadece uygun dinleyicilere kaydolabilir ve başarıyı tetiklemek için gereken her türlü testi yapabilir.

Başarıların dinlemesini isteyebileceğiniz tipik etkinlikler için mesajlarınız olur. "Oyuncu X eşyasını elde etti" veya "Y varlığı öldürdü Z varlığı" gibi şeyler. Bu şekilde, oyuncunun öldürdüğü Z sayısı gibi şeyleri takip edebilirsiniz.

Bu muhtemelen başarılar için bir sistem için yapabileceğiniz en iyisidir. Kodu olabildiğince merkezileştirir ve gerçek başarı tespiti için dinleyicileri ön plana çıkarır.

Ayrıca, merkezi başarı sistemleri için (X-Box Live, Steam başarıları), başarılara doğru ilerlemenin tipik olarak sunucuda saklandığına dikkat edilmelidir. Bu nedenle, birikim başarıları için ("XY görevi gerçekleştirme sayısı"), başarı komut dosyası yalnızca X'in ne zaman gerçekleştirildiğini algılar ve sunucunun sayısını engeller. Diğer başarı türleri için ("X görevi gerçekleştir"), sunucu başarısı ikiliktir: ya başardınız ya da başaramadınız.


+1 Bu harika bir bilgi. Ben bile şu anda başarıları uygulamaya gerek kalmadan yararlı.
Joshua Hedges

Teşekkürler! Bunu uygulamak için sabırsızlanıyorum, keşke daha önce bu fikri olsaydı ...
jcora

3

Başarılarınızın doğasına bağlı olarak, bir tür "marker başarıları" da sunabilirsiniz.

Örneğin 3 ardışık başarıya sahipseniz:
Ahşap 1 - 100 odun toplayın
Ahşap 2 - 500 odun toplayın
Ahşap 3 - 1k odun toplayın

Ardından, oyuncu bunu tamamlayana kadar ilk başarı için bir OnChange etkinliği kaydetmek mantıklı olacaktır. Tamamlandığında, bir sonraki başarı nesnesini kaydedebilirsiniz.

Bu elbette bir başarı bağımlılığı ağacının tasarımını (veya hesaplanmasını) gerektirir.

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.