Фон
Я займаюся розробкою ігор як хобі і шукаю кращого способу їх розробки. В даний час я використовую стандартний підхід OOP (я займаюся розвитком підприємства вже 8 років, так що це відбувається на природі). Візьмемо для прикладу "baddie"
public class Baddie:AnimatedSprite //(or StaticSprite if needed, which inherit Sprite)
{
//sprite base will have things like what texture to use,
//what the current position is, the base Update/Draw/GetInput methods, etc..
//an AnimatedSprite contains helpers to animated the player while
//a StaticSprite is just one that will draw whatever texture is there
}
Проблема
Скажемо, що я роблю 2d платформер, і мені потрібен Baddie, щоб мати можливість стрибати. Зазвичай я хочу додати відповідний код у методах Update / GetInput. Тоді, якщо мені потрібно змусити гравця повзати, качатись, підніматися тощо, код піде туди.
Якщо я не обережний, ці методи забиваються, тому я закінчую створення таких методів, як цей
CheckForJumpAction(Input input)
і DoJump()
CheckforDuckAction(Input input)
і DoDuck()
так виглядає GetInput
public void DoInput(Input input)
{
CheckForJumpAction(input);
CheckForDuckAction(input);
}
і Оновлення виглядає так
public void Update()
{
DoJump();
DoDuck();
}
Якщо я заходжу і створюю іншу гру, де гравцеві потрібно стрибати і качати, я зазвичай переходжу в гру, яка має функціональні можливості, і копіюю її. Безлад, я знаю. Ось чому я шукаю щось краще.
Рішення?
Мені дуже подобається, як Blend має поведінку, яку я можу приєднати до елемента. Я думав про те, щоб використовувати ту саму концепцію в своїх іграх. Тож давайте подивимось на ті самі приклади.
Я створив би базовий об'єкт поведінки
public class Behavior
{
public void Update()
Public void GetInput()
}
І я можу створити поведінку, використовуючи це. JumpBehavior:Behavior
іDuckBehavior:Behavior
Потім я можу додати колекцію поведінки до бази Sprite і додати те, що мені потрібно для кожної сутності.
public class Baddie:AnimatedSprite
{
public Baddie()
{
this.behaviors = new Behavior[2];
this.behaviors[0] = new JumpBehavior();
//etc...
}
public void Update()
{
//behaviors.update
}
public GetInput()
{
//behaviors.getinput
}
}
Отже, тепер, якщо я хотів використовувати стрибки та качки у багатьох іграх, я можу просто довести поведінку до кінця. Я навіть міг зробити бібліотеку для загальних.
Це працює?
Я не можу зрозуміти, як поділитися станом між ними. Дивлячись на стрибки та качки, обидва впливають не лише на поточну частину текстури, що малюється, але й на стан гравця. (Стрибок збирається застосувати зменшувальну кількість сили вгору з часом, тоді як качка просто збирається зупинити рух, змінити текстуру та розмір зіткнення бадді.
Як я можу зв’язати це разом, щоб воно працювало? Чи слід створювати властивості залежності між поведінкою? Чи повинен я кожна поведінка знати про батьків і безпосередньо змінювати його? Я подумав, що я можу передати делегата в кожній поведінці для виконання, коли вона спрацьовує.
Я впевнений, що є більше проблем, на які я переглядаю, але вся мета полягає в тому, щоб я міг легко використовувати цю поведінку між іграми та сутностями в одній грі.
Тому я передаю вам це. Потрібно пояснити, як / якщо це можна зробити? У вас є краща ідея? Я всі вуха.