Фон
Я занимаюсь разработкой игр как хобби и ищу лучший способ их дизайна. В настоящее время я использую стандартный подход ООП (я занимаюсь разработкой предприятия 8 лет, так что это происходит в обычном порядке). Взять, к примеру, «злодея»
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-платформер, и мне нужен злодей, чтобы иметь возможность прыгать. Обычно я добавляю соответствующий код в методы 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 есть поведение, которое я могу прикрепить к элементу. Я думал об использовании той же концепции в моих играх. Итак, давайте посмотрим на те же примеры.
Я бы создал базовый объект Behavior
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
}
}
Так что теперь, если бы я хотел использовать Jump and Duck во многих играх, я могу просто перенести поведение. Я мог бы даже сделать библиотеку для обычных.
Это работает?
Что я не могу понять, так это как разделить состояние между ними. Глядя на Jump и Duck, они влияют не только на текущую часть рисуемой текстуры, но и на состояние игрока. (Прыжок будет со временем применять уменьшающуюся восходящую силу, в то время как утка просто остановит движение, изменит текстуру и размер столкновения злодея.
Как я могу связать это вместе, чтобы это работало? Должен ли я создать свойства зависимости между поведением? Должен ли я иметь каждое поведение ноу о родителе и непосредственно изменить его? Одна вещь, о которой я думал, была возможность передавать делегат в каждое поведение, чтобы оно выполнялось при его запуске.
Я уверен, что есть и другие проблемы, которые я просматриваю, но вся цель в том, чтобы я мог легко использовать эти варианты поведения между играми и сущностями в одной игре.
Так что я передаю это вам. Не хочешь объяснить, как / если это можно сделать? У тебя есть идея получше? Я весь во внимании.