Question

Je suis en train de créer un jeu simple basé sur la console où le joueur peut se déplacer entre les différentes pièces, ramasser et utiliser des objets et manger de la nourriture. Dans l'état actuel du jeu qui est à ce sujet.

Ce que je besoin d'aide avec est:

Création d'un bon « événement » classe pour mon jeu. La façon dont je voudrais que ce travail est que tous les éléments et la salle devrait pouvoir être associé à un événement.

Comme je suis nouveau à cela, je vous en serais reconnaissant tout matériel de lecture liée à ce type de procédure, ou des suggestions à comment il serait préférable de mettre en place ma classe (s) en tenant compte des points suivants , ou simplement comment attaquer ce genre de problème (qui est d'avoir du mal à décider comment mettre en place des classes) .

Je veux être en mesure de créer différents types d'événements, par exemple:

  • Sortie texte, puis demander au joueur une question. Si le joueur donne la bonne réponse, faire quelque chose.

  • Sortie texte, puis supprimer un élément de l'inventaire du joueur, puis déplacez le lecteur dans une autre pièce.

Ce que je suis en train d'éviter:

  • Le point de l'ensemble du jeu est de pratiquer une bonne conception de classe, de sorte que des choses telles que la conception axée sur la responsabilité, la cohésion et le couplage sont des aspects importants. Ainsi, je veux que ce soit aussi simple, réutilisable et indépendant que possible.

  • Le fait de devoir coder en dur chaque événement afin qu'un élément ou pièce appelle simplement une méthode spécifique dans la classe de l'événement.

Qu'est-ce que je pense en ce moment:

Création quelques sous-classes afin que je puisse par exemple créer de nouveaux événements (et de les associer) à l'aide: itemObject.setEvent (nouvel événement (nouvelle question ( "INTROTEXT", "outroText", "correctAnswer")));

S'il vous plaît laissez-moi savoir si plus d'information est nécessaire! Merci!

Était-ce utile?

La solution

Le jeu Programmation livres Gems sont grands ... mais un peu cher de.

Vous pouvez probablement trouver un article ou deux sur le GameDev liste de l'article pertinente, et il y a probablement une bonne choses enterré dans leurs forums

En ce qui concerne une classe d'événements, vous voulez certainement une classe de base avec un certain nombre de sous-classes (moveEvent, InventoryEvent, etc.). Et si vous vraiment voulez éviter les choses hardcoding, vous devez définir votre jeu dans les fichiers de données. Les chambres, les articles et les événements ... plus tout ce que vous virer de bord plus tard. Le format que vous utilisez pour définir les choses est entièrement à vous. Je recommande quelque chose qui va vous donner une expérience pratique, car cela est un exercice d'apprentissage: un analyseur XML n'a pas été utilisé par exemple. Pas le format le plus efficace pour analyser, mais cela est un jeu de console, de sorte que ne est pas une question aussi.

Une suggestion que j'ai une sous-classe de l'événement serait une que la chaîne peut d'autres événements ensemble. L'interface ne change pas, et il vous permet de faire des choses comme « ajouter à l'inventaire du joueur, l'enlever et de les déplacer ici ».

Autres conseils

Une chose que je considérerais consiste à séparer l'analyse syntaxique du texte d'entrée et génération de texte de sortie du modèle de domaine sous-jacent. Votre question semble mélanger les deux alors que je considérerais la partie texte du problème que la couche de présentation.

Par exemple, votre domaine pourrait consister en des interfaces suivantes:

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 { }

En outre, vous pouvez définir une classe TextParser qui traiterait la chaîne d'entrée et faire des appels résultant à la couche de domaine ou le retour d'une autre réponse par défaut: « Je ne comprends pas. ». Par exemple, l'expression d'entrée « clé d'utilisation sur la porte » entraînerait l'appel de méthode:

key.applyAction(Action.USE, door);

En parlant des événements du modèle d'observation vient à l'esprit. Vous pouvez penser à votre jeu à être présenté en interne par plusieurs machines d'état (vous pouvez regarder cette place sur Wikipedia, aussi, je ne peux pas ajouter 2 lien moi-même en raison d'être à nouveau SO). Chaque transition d'une étape à l'autre est un événement qui peut être communiquée à oberservers inscrits de cet événement.

exemple:

USE KEY LOCK ON: déclencheurs suppression de la clé et l'ouverture de la porte; implictly « en cascade » à l'événement suivant sans interaction de l'utilisateur additonal (ouverture de porte):. salle de déclencheurs ayant la sortie supplémentaire etc

J'ai récemment mis en œuvre quelque chose de semblable à ce que vous décrivez. J'ai commencé par la création d'une classe EventManager qui a une méthode « Publier » et « Abonnement ». Lorsque le système démarre, il scanne tous les ensembles chargés (bibliothèques) pour les classes qui mettent en œuvre l'interface 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);
}

... et appelle la méthode de RegisterSubscriptions sur chacun d'eux. (Il n'y a qu'une seule instance du EventManager qui obtient utilisé partout,. J'utilise l'injection de dépendance à lier comme une instance singleton)

RegisterSubscriptions appellera simplement la méthode pour chaque Inscription type d'événement et gestionnaire que la classe donnée est destinée à manipuler. (J'utilise .NET, si les événements et les gestionnaires sont un peu plus facile de travailler avec, mais vous pouvez faire la même chose en Java en utilisant les sous-classes anonymes.)

Un événement typique pourrait être quelque chose comme RoomEntered, et les arguments associés à cet événement comprendrait l'ID de chambre et peut-être quelques autres propriétés dans la pièce. Le moteur de jeu publie cet événement lorsque l'utilisateur entre dans une pièce, en fournissant les arguments d'événements appropriés pour cette pièce, et la classe EventManager est alors chargé d'invoquer chaque gestionnaire qui a souscrit à ce type d'événement. Un gestionnaire de cet événement peut-être « HandleEnterRoomWithMonsters », qui vérifie si la pièce a des monstres, et d'accomplir l'action.

Est-ce du sens général? Avez-vous des questions au sujet de cette approche?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top