Модел на проектиране за сложни алгоритми на играта

Това е продължение на този въпрос. Контекстът е същият, толкова кратък, че може да е полезен. Размишлявах върху това от дни и не стигнах доникъде, така че се отказвам и идвам тук.

Чудя се какви дизайнерски модели влизат в действие при създаването на система като тази, която описах там. Да кажем, че имам боен алгоритъм, който може да има произволен брой бойци от всяка страна. Първо разбираме кой кого напада и след това се екзекутира.

Сложната част е, че има много допълнителни поведения, които могат да бъдат добавени и те могат да бъдат донякъде произволни. Мислете за тях като за „пасивни умения“. Може да има и поведение като получаване на печалби от статистика, когато уцелите целта си, но само в някои видове битки.

Предишният ми въпрос показва как Decorator се провали. Един отговор предложи модела Strategy, но нямам желание да напиша дузина различни видове стратегии и след това няколко конкретни класа за всеки от тях. Дори тогава пак ще трябва да наруша принципа Open Closed, ако имах нужда от чисто ново поведение, което е напълно различно от всичко, което вече имам. Ще има и случаи, в които трябва да комбинирам няколко стратегии наведнъж, което може да доведе до украсени стратегии или комбинирани стратегии. Пример би бил, че когато понесете щети, може да 1. имате способност, която намалява щетите наполовина, 2. да имате екипиран предмет, който допълнително намалява щетите, 3. да върнете малко щети на вашия нападател и 4. да спечелите някои точки за статистика .

И така, какво би направил опитен архитект тук? В много игри са внедрени тези системи, така че съм любопитен какъв модел или комбинация от шаблони работят добре тук.

Не искам да публикувам огромна стена с код, така че ако има някаква конкретна част от моята система, която бихте искали да видите, просто попитайте в коментар.


person Tesserex    schedule 08.09.2012    source източник


Отговори (1)


Това е голям въпрос, който изисква познаване на вашата игрова механика. Но ще започна с тази препоръка. Първата стъпка е да се уверите, че имате добре дефиниран и документиран ред на работа и след това да го конвертирате в frameowkr или шаблон за вашия алгоритъм за разрешаване на битка. Например:

Пример би бил, че когато понесете щети, може да 1. имате способност, която намалява щетите наполовина, 2. да имате екипиран предмет, който допълнително намалява щетите, 3. да върнете малко щети на вашия нападател и 4. да спечелите някои точки за статистика .

Какво ще стане, ако #3 (отразяване на щети) се случи първо, след това #4 (получавате статистика, може би дори точки за защита), след това #1 и #2. В този случай защитникът е увеличил максимално нанесените щети и потенциално е увеличил максимално защитата си.

Изброихте тези стъпки в определен ред, но защо? Трябва да дефинирате правилата си така, че да знаете кога е приложена всяка стъпка (атака и защитник). Само тогава можете да създадете система за разрешаване на битката. Например:

  1. Започнете с базови щети
  2. Приложете атакуващи ефекти, които се задействат от атака
  3. Приложете защитни ефекти, които се задействат от атака
  4. Приложете всички вродени способности на нападателя за увеличаване на щетите
  5. Приложете всички способности на атакуващото оборудване за увеличаване на щетите
  6. Приложете всички вродени способности за увеличаване на бронята на защитника
  7. Приложете всички способности на оборудването за увеличаване на бронята на защитника
  8. Приложете ефекти на нападател, които се задействат от защита
  9. Приложете ефекти на защитник, които се задействат от защита
  10. Поеми щети
  11. Приложете ефекти на нападател, които се задействат от щети
  12. Приложете защитни ефекти, които се задействат от щети

Това е от бедрата, не знам вашата система от правила.

След като имате това, помислете за моделиране на битка, за да включите източник, цел, (начална) щета, списък с AttackEffects и списък с DefenseEffects. Тези ефекти трябва да бъдат кодирани като шаблон (образец на шаблонен метод) с OnAttack(), OnApplyInnate(), OnApplyEquipment(), OnDamaged() и т.н. След това можете да итерирате ефектите в различните фази на бойната резолюция, давайки на всяка възможност да приложете ефекта си в подходящия момент.

person tcarvin    schedule 10.09.2012
comment
За да обобщим, не поставяйте кода за разрешаване на щети в Combatant. Преместете го в боен клас, който съдържа необходимата информация за разрешаването му, включително списък с CombatEffects, предоставени от нападателя и защитника. Генерално взаимодействайте ефектите по начин и ред, контролирани от вашата система от правила, позволявайки на всеки да променя щетите или по друг начин да създава странични ефекти (като отражение на щетите). Последният метод ApplyDamage трябва да приспадне точките живот и да изпълни всички странични ефекти. - person tcarvin; 11.09.2012