Metodi per strutturare un programma con 2 stati

3

Sto lavorando su una sorta di editor di livelli, ma non sono abbastanza sicuro di come voglio gestire i due diversi stati: lo stato dell'editor e lo stato del giocatore.

In questo primo stato gli elementi del gioco possono essere spostati e le tessere possono essere disegnate.

Nel secondo stato gli elementi del gioco ricevono i loro corpi fisici e il giocatore può essere spostato usando la tastiera.

Ora quello che mi piacerebbe sapere è quale sarebbe il modo migliore per strutturare questi stati. La maggior parte dei miei oggetti si comporta diversamente a seconda dello stato in cui si trova il gioco.

Un modo per affrontarlo sarebbe dare a tutti due versioni dell'aggiornamento e metodi di disegno. Un updateEditor e updatePlayer per esempio.

Un altro modo sarebbe avere una classe base per un elemento di gioco, e derivare un EditorGameElement da PlayerGameElement da esso, ma credo che sarebbe un po 'eccessivo, oltre al fatto che non saprei come funzionerebbe dal momento che avrei due oggetti che ereditano da un singolo oggetto.

Quali altri modi ci sono per gestire una struttura come questa?

    
posta Oli414 15.04.2016 - 09:49
fonte

3 risposte

1

Piuttosto che pensare a questo come a uno stato del sistema, sono incline a pensarlo come poche capacità a cui non hai o non hai accesso come giocatore.

Alcune abilità di base:

  • Copia oggetti ( modello prototipo )
  • Sposta oggetti (potrebbe essere semplice come selezionare oggetto, spostare giocatore e oggetto, rilasciare oggetto)
  • Salva oggetti (come fantasia come serializzazione o semplice come fare toString() qualcosa che un costruttore può leggere)

È possibile mostrare un oggetto come selezionato con un contorno.

Una volta ho progettato e creato un gioco da tavolo universale che aveva l'editor e il gioco come la stessa interfaccia utente. Hai creato oggetti (pezzi) semplicemente trascinandoli da un pallet di oggetti nel tabellone di gioco. Una volta lì, potrebbero essere spostati, cancellati o salvati con il resto del gioco.

Questo non è lo stesso di un editor di livelli 3D, ma i principi sono gli stessi. Ogni manipolazione dal controller dovrebbe aggiornare il modello. Ogni volta che il modello viene modificato, aggiorna la vista.

MVC è in realtà solo una separazione delle responsabilità. Se vuoi imparare come comunicare tra queste aree in modo da poter scambiare apertamente viste, modelli e controllori, allora cerca il schema di osservazione e il principio di inversione delle dipendenze .

    
risposta data 19.06.2016 - 09:43
fonte
0

Vorrei provare a mantenere questa differenza nell'oggetto Scene (un contenitore per tutti gli elementi di gioco).

Per la modalità "gioco" permetterà solo di muovere il giocatore, ma non altri elementi. E una speciale sottoclasse Scene può essere usata per l'editor di livelli.

Può funzionare in un modo seguente:

// create the scene
scene = new Scene();
// add game elements (probably these will be read from the level file)
scene->add(new Box(x, y));
scene->add(new Wall(x1, y1, x2, y2));
scene->add(new Player);

// move player to the different place, probably as a reaction to keyboard input
scene->movePlayer(x2, y2);

E l'editor di livelli potrebbe funzionare in questo modo:

scene = new SceneEditor();
// add game elements (probably these will be read from the level file)
scene->add(new Box(x, y));
scene->add(new Wall(x1, y1, x2, y2));
...
// select the object (as a reaction to mouse click)
anObject = scene->selectObject(x, y);
// move object to another place
scene->moveObject(anObject, x2, y2);
// save the modified level
scene->saveToFile(fileName);
    
risposta data 16.04.2016 - 18:25
fonte
0

Direi di mantenerlo semplice:

Crea 1 programma che è l'editor e un altro programma in cui giochi. In questo modo puoi creare editobjects per il tuo editor e i tuoi oggetti di gioco per il tuo gioco, senza dover combinare funzionalità che sostanzialmente non appartengono a te.

    
risposta data 20.05.2016 - 08:45
fonte

Leggi altre domande sui tag