Як слід перевірити, чи гравець завершив досягнення?


13

Я роблю гру MMO, і я просто дістався до моменту, коли мені потрібно реалізувати досягнення ... Як це зробити? Найбільш прямим, що потрібно зробити, було б запускати це раз на 100 мс:

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

Але це викликає ще більше ускладнень. Наприклад, як я можу перевірити, чи досягнуто насправді завершення? Чи мають гравці власні властивості лише для конкретного досягнення? Я робив подібну справу з квестами, оскільки вони в основному "збирають 100 деревини", тому активні квести на гравці це перевіряють. Крім того, повинен бути кращий час, щоб перевірити це, це періодично сповільнить мій сервер, я думаю.


7
Чому б просто не запустити відповідні перевірки, як це робиться? Тобто, якщо користувач збирає деревину, подивіться, чи відповідають вони специфікації "збирати 100 деревини".
Майк Клук

1
Це виглядає занадто безладним ... Скрізь були б тони перевірок. Я думаю, я буду дотримуватися вищевказаного алгоритму через його простоту ...
jcora

10
Існують способи зробити його менш брудним: наприклад, мати обробник подій "OnChange", потім приєднати до них "об'єкти" досягнення та обробляти логіку там. Також розумійте, що при вашому поточному налаштуванні ви маєте рівень складності O (n ^ 2), а це означає, що ваша гра стає повільнішою набагато швидше з більшою кількістю персонажів. Вигляд проблеми для MMO
Майк Клук

Відповіді:


23

Що ви робите, залежить від характеру досягнення. Якщо всі ваші досягнення не відповідають простому шаблону (зібрати X число Y), вам доведеться певною мірою їх розставити.

Використовуючи систему зв'язку на основі повідомлень, ви можете надати гачки, що робить кодування у спеціальному випадку локалізованим. Ви можете мати певні дії повідомлень про вогонь слухачам, які реєструються. Тоді ваш код / ​​сценарій досягнення може просто зареєструватися у відповідних слухачів і зробити все необхідне для тестування, щоб знищити досягнення.

У вас з’являться повідомлення про типові події, які, можливо, ви хочете, щоб заслуховували досягнення. Такі речі, як "гравець придбав предмет X" або "суб'єкт Y вбив об'єкт Z". Таким чином, ви можете відстежувати такі речі, як кількість Z, яку вбив гравець.

Це, мабуть, найкраще, що можна зробити для системи для досягнення. Він максимально централізує код та надає слухачам увагу на виявлення фактичного досягнення.

Також слід зазначити, що для централізованих систем досягнень (X-Box Live, Steam досягнення) прогрес до досягнення зазвичай зберігається на сервері. Тож для накопичувальних досягнень ("виконайте завдання XY кількість разів") сценарій досягнення просто виявляє, коли виконується X, і збільшує кількість серверів. Для інших видів досягнень ("виконайте завдання X") досягнення сервера є двійковим: або ви це зробили, або не зробили.


+1 Це чудова інформація. Навіть корисно, без цього мені потрібно реалізовувати досягнення.
Джошуа Хеджес

Спасибі! Не можу зачекати, щоб це здійснити, я б хотів, щоб я мав цю ідею раніше ...
jcora

3

Залежно від характеру ваших досягнень, ви також можете ввести якісь "маркерологічні досягнення".

Якщо у вас є, наприклад, 3 поспіль досягнення:
Дерево 1 - Зберіть 100 деревини
Деревина 2 - Зберіть 500 деревини
Дерева 3 - Зберіть 1 к деревини

Тоді було б сенс просто зареєструвати подію OnChange для першого досягнення, поки гравець не завершив її. По завершенні ви можете зареєструвати наступний об’єкт досягнення.

Звичайно, це потребує проектування (або розрахунку) дерева залежності досягнення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.