Domanda

Al momento sto creando un semplice gioco per console-based in cui il giocatore può muoversi tra le varie stanze, raccogliere e utilizzare gli oggetti, e mangiare cibo. Nello stato attuale del gioco che su di esso.

Che cosa ho bisogno di aiuto con è:

La creazione di un buon "Evento" classe per il mio gioco. Il modo in cui mi piacerebbe che il lavoro è che ogni elemento e stanza dovrebbe essere in grado di essere associato ad un evento.

Come io sono nuovo a questo Apprezzerei tutto materiale di lettura relative a questo tipo di procedura, o suggerimenti su come sarebbe meglio impostare la mia classe (es) considerando i seguenti punti , o semplicemente come attaccare questo tipo di problema (che sta avendo difficoltà a decidere come impostare le classi) .

Voglio essere in grado di creare diversi tipi di eventi, ad esempio:

  • Output del testo, e poi fare una domanda al giocatore. Se il giocatore dà la risposta corretta, fare qualcosa.

  • Output del testo, quindi rimuovere un elemento dall'inventario del giocatore, e quindi spostare il giocatore in un'altra stanza.

Quello che sto cercando di evitare:

  • L'intero punto del gioco è quello di praticare un buon design di classe, quindi le cose come la responsabilità guidato la progettazione, la coesione e l'accoppiamento sono aspetti importanti. Così io voglio che sia il più semplice, riutilizzabile e indipendente possibile.

  • Il dover codificare ogni evento in modo che un oggetto o una stanza chiama semplicemente un metodo specifico nella classe Event.

Quello che sto pensando in questo momento:

La creazione di un paio di sotto-classi in modo che potessi ad esempio creare nuovi eventi (e associarli) utilizzando: itemObject.setEvent (nuovo evento (nuova domanda ( "introtext", "outroText", "correctAnswer")));

Per favore fatemi sapere se è necessario più informazioni! Grazie!

È stato utile?

Soluzione

Il Game Programming Gems libri sono grande ... anche se un po 'caro.

si può probabilmente trovare un articolo rilevante o due sopra il di GameDev lista Articolo , e c'è probabilmente qualcosa di buono roba sepolto nella loro forum

Per quanto riguarda una classe di evento, si vuole quasi certamente una classe di base con qualche numero di sottoclassi (MoveEvent, InventoryEvent, ecc). E se si davvero vuole evitare hardcoding le cose, è necessario definire il vostro gioco in file di dati. Camere, oggetti e eventi ... più qualsiasi altra cosa si virare su più tardi. Il formato utilizzato per definire le cose è interamente a voi. Mi raccomando qualcosa che vi darà l'esperienza pratica in quanto si tratta di un esercizio di apprendimento: un parser XML non è stato utilizzato, per esempio. Non il formato più efficiente per analizzare, ma questo è un gioco per console, in modo che non è una questione.

Un suggerimento che ho per una sottoclasse Event sarebbe uno che può catena altri eventi insieme. L'interfaccia non cambia, e ti permette di fare cose come "aggiungere questo all'inventario del giocatore, prendere quella via, e spostarli qui".

Altri suggerimenti

Una cosa che vorrei considerare è che separa il parsing di testo di input e la generazione di testo di output dal modello di dominio sottostante. La tua domanda sembra mescolare le due cose insieme, mentre vorrei prendere in considerazione la parte di testo del problema in quanto il livello di presentazione.

Ad esempio, il dominio potrebbe consistere delle seguenti interfacce:

public enum Action { HIT, TALK_TO, EAT, USE };

public interface GameEntity {
  /**
   * Performs the specified action on this GameEntity, passing in zero or
   * more other GameEntity instances as parameters.
   */
  void applyAction(Action action, GameEntity... params);    
}

public interface Item extends GameEntity { }
public interface Person extends GameEntity { }

In aggiunta si potrebbe definire una classe TextParser che avrebbe elaborare la stringa di input ed effettuare chiamate conseguenti allo strato di dominio o di ritorno altrimenti una risposta predefinita: "Io non capisco.". Per esempio, la "chiave utilizzo su porta" frase di ingresso comporterebbe la chiamata di metodo:

key.applyAction(Action.USE, door);

Quando si parla di eventi del pattern Observer viene in mente. Si può pensare del vostro gioco che sarà presentato internamente da diverse macchine a stati (si può guardare questo in su su Wikipedia, troppo, non posso aggiungere 2 ° collegamento me stesso a causa di essere di nuovo da SO). Ogni passaggio da una fase all'altra è un evento che può essere comunicata a oberservers iscritti a tale evento.

A esempio:

Utilizzare il tasto ON BLOCCO: rimozione trigger di chiave e apertura della porta; implicitamente pone "a cascata" per prossimo evento senza l'interazione dell'utente addizionale (apertura della porta):. stanza trigger avendo uscita supplementare etc

Recentemente ho realizzato qualcosa di simile a quello che si sta descrivendo. Ho iniziato con la creazione di una classe EventManager che ha un metodo "Pubblica" e "Iscriviti". Quando il sistema si avvia, si analizza tutti i gruppi caricati (librerie) per le classi che implementano l'interfaccia IEventListener:

/// <summary>
/// A class that intends to listen for specific events to be published by an
/// event manager.
/// <see cref="EventManager"/>
/// </summary>
public interface IEventListener
{
    /// <summary>
    /// Subscribes to the event types that this listener wishes to listen for.
    /// </summary>
    /// <param name="eventManager"></param>
    void RegisterSubscriptions(EventManager eventManager);
}

... e chiama il metodo RegisterSubscriptions su ciascuno di essi. (C'è una sola istanza del EventManager che viene utilizzato in tutto il mondo;. Io uso l'iniezione di dipendenza per legare come istanza Singleton)

RegisterSubscriptions semplicemente chiamare il metodo Iscriviti per ogni tipo di evento e gestore che la classe data è destinato a gestire. (Sto usando .NET, in modo da eventi e gestori sono un po 'più facile da lavorare, ma è possibile fare la stessa cosa in Java utilizzando sottoclassi anonimi.)

Un evento tipico potrebbe essere qualcosa di simile RoomEntered, e gli argomenti associati a questo evento sarebbe includere l'ID stanza e forse alcune altre proprietà per la stanza. Il motore di gioco pubblica questo evento quando l'utente entra in una stanza, fornendo gli argomenti dell'evento appropriati per quella stanza, e la classe EventManager è quindi responsabile per invocare ogni gestore che ha sottoscritto quel tipo di evento. Un gestore di questo evento potrebbe essere "HandleEnterRoomWithMonsters", che verifica se la camera dispone di mostri, e svolge un'azione di conseguenza.

Ha senso generale? Avete domande su questo approccio?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top