Sfondo
Realizzo giochi come 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 è giunto alla normalità). 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 facendo un platform 2d, e ho bisogno che il cattivo sia in grado di saltare. Di solito quello che faccio è aggiungere il codice appropriato nei metodi Update / GetInput. Quindi se ho bisogno di far strisciare, anatra, arrampicarsi, ecc ... il codice andrà lì.
Se non sto attento, questi metodi si disordinano, quindi finisco per creare coppie di metodi come questa
CheckForJumpAction(Input input)
e DoJump()
CheckforDuckAction(Input input)
e DoDuck()
quindi GetInput ha un aspetto simile a
public void DoInput(Input input)
{
CheckForJumpAction(input);
CheckForDuckAction(input);
}
e l'aggiornamento ha l'aspetto di
public void Update()
{
DoJump();
DoDuck();
}
Se vado a creare un altro gioco in cui il giocatore deve saltare e saltare, di solito vado in un gioco che ha la funzionalità e lo copia. 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 vediamo gli stessi esempi.
Creerei un oggetto Behavior di base
public class Behavior
{
public void Update()
Public void GetInput()
}
E posso creare comportamenti usando questo. JumpBehavior:Behavior
e DuckBehavior:Behavior
Posso quindi aggiungere una serie di comportamenti alla base di 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 volevo usare Jump and Duck in molti giochi, posso semplicemente portare i comportamenti sopra. Potrei persino creare una libreria per i più comuni.
Funziona?
Quello che non riesco a capire è come condividere lo stato tra di loro. Guardando Jump and Duck, entrambi influenzano non solo la porzione corrente della trama che viene disegnata, ma anche lo stato del giocatore. (Salto sta per applicare una quantità decrescente di forza verso l'alto nel tempo, mentre l'anatra sta per fermare il movimento, cambiare la trama e la dimensione di collisione del cattivo.
Come posso legare questo insieme in modo che funzioni? Devo creare proprietà di dipendenza tra i comportamenti? Dovrei avere ogni comportamento sapere sul genitore e modificarlo direttamente? Una cosa che pensavo fosse riuscire a passare un delegato in ogni comportamento per essere eseguito quando viene attivato.
Sono sicuro che ci sono altri problemi che sto osservando, ma l'unico scopo è che io possa riutilizzare facilmente questi comportamenti tra i giochi e le entità nello stesso gioco.
Quindi consegnalo a te. Cura di spiegare come / se questo può essere fatto? Hai un'idea migliore? Sono tutto orecchie.