sfondo
Faccio lo sviluppo del gioco come un hobby e sto cercando un modo migliore per progettarli. Attualmente sto usando un approccio OOP standard (ho fatto lo sviluppo delle imprese per 8 anni, quindi arriva nartualmente). Prendi ad esempio un "cattivo"
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
}
Il problema
Diciamo che sto realizzando un platform 2d e ho bisogno del cattivo per poter saltare. Di solito quello che faccio è aggiungere il codice appropriato nei metodi Update / GetInput. Quindi, se ho bisogno di far strisciare il giocatore, anatra, arrampicarsi, ecc ... il codice andrà lì.
Se non sto attento, quei metodi vengono ingombra, quindi finisco per creare coppie di metodi come questa
CheckForJumpAction(Input input)
e DoJump()
CheckforDuckAction(Input input)
e DoDuck()
così appare GetInput
public void DoInput(Input input)
{
CheckForJumpAction(input);
CheckForDuckAction(input);
}
e l'aggiornamento sembra
public void Update()
{
DoJump();
DoDuck();
}
Se vado a creare un altro gioco in cui il giocatore deve saltare e abbassarsi, di solito vado in un gioco che ha la funzionalità e lo copio. Disordinato, lo so. Ecco perché sto cercando qualcosa di meglio.
Soluzione?
Mi piace molto il modo in cui Blend ha comportamenti che posso associare a un elemento. Ho pensato di usare lo stesso concetto nei miei giochi. Quindi diamo un'occhiata agli stessi esempi.
Vorrei creare un oggetto Comportamento di base
public class Behavior
{
public void Update()
Public void GetInput()
}
E posso creare comportamenti usando quello. JumpBehavior:Behavior
eDuckBehavior:Behavior
Posso quindi aggiungere una raccolta di comportamenti alla base Sprite e aggiungere ciò di cui ho bisogno a ciascuna entità.
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
}
}
Quindi ora, se volessi usare Jump and Duck in molti giochi, posso semplicemente riportare i comportamenti. Potrei persino creare una biblioteca per quelli comuni.
Funziona?
Quello che non riesco a capire è come condividere lo stato tra di loro. Guardando Jump and Duck, entrambi influenzano non solo la parte corrente della trama che viene disegnata, ma anche lo stato del giocatore. (Il salto applicherà una quantità decrescente di forza ascendente nel tempo, mentre l'anatra sta solo per fermare il movimento, cambiare la trama e le dimensioni della collisione del cattivo.
Come posso legarlo insieme in modo che funzioni? Devo creare proprietà di dipendenza tra i comportamenti? Devo avere ogni comportamento a conoscenza del genitore e modificarlo direttamente? Una cosa che pensavo fosse la possibilità di passare un delegato in ciascun comportamento per essere eseguito quando è attivato.
Sono sicuro che ci sono più problemi che sto esaminando, ma l'intero scopo è quello di poter riutilizzare facilmente questi comportamenti tra i giochi e le entità nello stesso gioco.
Quindi te lo giro. Vuoi spiegare come / se ciò può essere fatto? Hai un'idea migliore? Sono tutto orecchie.