tło
Zajmuję się tworzeniem gier jako hobby i szukam lepszego sposobu na ich zaprojektowanie. Obecnie używam standardowego podejścia OOP (zajmuję się rozwojem przedsiębiorstwa od 8 lat, więc przychodzi to w ujęciu kwartalnym). Weźmy na przykład „złego”
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
}
Problem
Powiedzmy, że tworzę platformówkę 2D i potrzebuję baddie, aby móc skakać. Zwykle robię to, dodając odpowiedni kod w metodach Update / GetInput. Więc jeśli będę musiał zmusić gracza do czołgania się, kaczkowania, wspinania się itp., Kod się tam pojawi.
Jeśli nie jestem ostrożny, metody te są zaśmiecone, więc w końcu tworzę takie pary metod
CheckForJumpAction(Input input)
i DoJump()
CheckforDuckAction(Input input)
i DoDuck()
tak wygląda GetInput
public void DoInput(Input input)
{
CheckForJumpAction(input);
CheckForDuckAction(input);
}
i wygląda aktualizacja
public void Update()
{
DoJump();
DoDuck();
}
Jeśli pójdę i stworzę inną grę, w której gracz musi skakać i uchylać się, zwykle wchodzę do gry, która ma tę funkcjonalność i kopiuję ją. Bałagan, wiem. Właśnie dlatego szukam czegoś lepszego.
Rozwiązanie?
Bardzo podoba mi się, jak Blend ma zachowania, które mogę dołączyć do elementu. Myślałem o zastosowaniu tej samej koncepcji w moich grach. Spójrzmy więc na te same przykłady.
Stworzyłbym podstawowy obiekt Behavior
public class Behavior
{
public void Update()
Public void GetInput()
}
Za pomocą tego mogę tworzyć zachowania. JumpBehavior:Behavior
iDuckBehavior:Behavior
Następnie mogę dodać kolekcję zachowań do bazy Sprite i dodać to, czego potrzebuję do każdej jednostki.
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
}
}
Więc teraz Jeśli chciałbym używać Jump and Duck w wielu grach, mogę po prostu zapanować nad zachowaniami. Mógłbym nawet stworzyć bibliotekę dla zwykłych.
Czy to działa?
Nie potrafię rozgryźć, jak podzielić stan między nimi. Patrząc na Skok i Kaczkę, oba wpływają nie tylko na bieżącą część rysowanej tekstury, ale także na stan gracza. (Skok zastosuje z czasem malejącą siłę skierowaną w górę, podczas gdy kaczka po prostu zatrzyma ruch, zmieni teksturę i rozmiar zderzenia baddiego.
Jak mogę to powiązać, aby działało? Czy powinienem utworzyć właściwości zależności między zachowaniami? Czy każde zachowanie powinno wiedzieć o rodzicu i bezpośrednio je modyfikować? Jedną rzeczą, o której myślałem, jest możliwość przekazania delegata każdemu zachowaniu, aby zostało wykonane po jego uruchomieniu.
Jestem pewien, że analizuję więcej problemów, ale moim głównym celem jest umożliwienie łatwego ponownego wykorzystania tych zachowań między grami i bytami w tej samej grze.
Więc oddaję to tobie. Czy chcesz wyjaśnić, jak / jeśli można to zrobić? Czy masz lepszy pomysł? Zamieniam się w słuch.