Comment puis-je implémenter un système de commande pour un jeu d'aventure de style pointer-cliquer?

11

Je fais un jeu d'aventure pointer-cliquer, et j'essaie actuellement de trouver la meilleure façon de mettre en œuvre un système de commande.

Supposons une interface de style Monkey Island ou Maniac Mansion, avec une palette de verbes et d'objets dans la scène et dans l'inventaire. En cliquant dessus, vous créez une phrase à exécuter.

par exemple, vous pouvez cliquer sur look atpuis sur un arbre pour obtenir "regarder l'arbre" ou sur une pomme, givepuis sur une fille pour obtenir "donner une pomme à une fille".

Il existe trois formes possibles de phrase:

  • verb, par exemple "enregistrer"
  • verb noun, par exemple "ramasser la pomme", "regarder la pieuvre"
  • verb noun noun, par exemple "donner des cornichons à un chien enragé", "utiliser un pied de biche avec un bocal à cornichons"

Dans différentes situations, je souhaite que l'action à exécuter soit définie par différents objets.

Par exemple, pour le giveverbe, il pourrait y avoir une action par défaut définie qui fait dire au personnage quelque chose comme "Je préférerais m'y accrocher", ou le chien enragé peut définir une action où il mange tout ce que vous essayez de lui donner. .

Si l'interface doit fonctionner comme Maniac Mansion, vous créez la phrase, puis lui dites de s'exécuter (dans Maniac Mansion, soit en cliquant sur la phrase, soit en cliquant à nouveau sur la dernière chose sur laquelle vous avez cliqué).

Si cela doit fonctionner comme Monkey Island, la phrase s'exécute dès qu'elle est terminée, ce qui pose un problème pour les verbes comme ceux usequi peuvent parfois prendre un nom, et d'autres fois deux.

Alors, comment mettriez-vous en œuvre un système qui gère cela?

SpoonMeiser
la source
1
Il semble qu'il y ait trois types de verbe, un type pour les noms zéro, un autre pour deux, etc. Ce ne sont pas la même classe d'objet. Vous ne pouvez pas "regarder la pieuvre avec un pot de cornichons", tout lookcomme un verbe à nom unique, etc.
tenpn

Réponses:

10

Vous pouvez trouver plus facile à utiliser si vous inversez l'ordre de sélection. Ainsi, l'utilisateur clique sur un nom , puis le jeu affiche l'ensemble des verbes qui peuvent être exécutés sur ce nom. Si le verbe nécessite un objet (c'est-à-dire "donner à ___", alors le jeu attend que l'utilisateur sélectionne l'objet avant d'effectuer l'action.

Quelque chose comme:

  1. L'utilisateur clique sur un cheeseburger.
  2. Le jeu présente un menu: "ramasser, manger, regarder, donner à ___".
  3. L'utilisateur sélectionne «donner à ___».
  4. Le jeu dit "donne à qui?" et attend que l'utilisateur clique sur un autre nom (ou sur un bouton d'annulation).
  5. L'utilisateur clique sur un singe.
  6. Le jeu donne le cheeseburger au singe.

Au niveau de l'implémentation, chaque objet du jeu doit avoir des données pour:

  1. Quel ensemble de verbes vous pouvez lui appliquer.
  2. Pour les verbes, il permet de prendre un objet, quel ensemble d'objets peut être appliqué.
  3. Pour chaque verbe ou paire verb-objet, le comportement à effectuer lorsque l'utilisateur fait cela.

Puisque la grammaire n'est pas vraiment imbriquée ou quoi que ce soit, vous ne devriez pas avoir besoin de quelque chose d'aussi compliqué qu'un modèle d'interpréteur.

munificent
la source
+1, à la fois du côté de la modélisation des choses et du côté de l'interface des choses. Oui, la plupart du temps je suis d'accord parce que c'est comme ça que je le ferais , mais j'aime cette réponse.
drhayes
Si nous sommes d'accord, alors clairement, nous devons tous les deux avoir raison. ;)
magnifique
Donc, effectivement, vous pensez que le comportement à exécuter doit toujours être défini par le premier nom?
SpoonMeiser
1
Oui, je pense que plusieurs noms partageront le comportement (de sorte que "ramasser" utiliserait le même code pour ramasser différents objets), mais il est logique que ce soit au nom de déterminer l'ensemble de verbes qui peuvent être appliqués à elle. Étant donné que l'ensemble des noms est très grand (tout dans le jeu) et que l'ensemble des verbes est petit (probablement une poignée d'opérations), je pense qu'il est logique pour l'utilisateur de choisir un nom en premier, car cela réduit les combinaisons plus rapidement. Et, pragmatiquement, il permet à l'utilisateur de cliquer sur une chose pour lancer une interaction, et non sur un mot.
munificence
C'est à peu près à quel point l'accélérateur a fait.
Jari Komppa
2

Je présente une solution simpliste. Il peut bien entendu être prolongé.

Je pense qu'une simple liste de (verbe, objet1, objet2) le résoudrait:

  • si le joueur a cliqué sur l'objet (verbe) "utiliser" et cliqué sur l'objet "ballon" et que le joueur a cliqué sur l'objet "pompe" et qu'il existe un triplet ("utiliser", "ballon", "pompe") alors vous "avez utilisé un ballon avec pompe"
  • Parfois object2 serait NULL comme dans "use helium" (use, helium, NULL)
  • Exiger que le joueur clique d'abord sur le verbe de l'objet
  • si le joueur clique sur quelque chose qui ne correspond à rien, dites "je ne peux pas faire ça, c'est absurde"
  • Bien sûr, vous devez vérifier après chaque clic si la séquence est correcte.

Comment gérer les valeurs par défaut:

  • Si le premier clic n'est pas sur l'objet verbe, recherchez une action par défaut possible.
  • Une façon de stocker les valeurs par défaut serait de faire un quadruplet (verbe, objet1, objet2, is-default)
  • Une autre façon de les stocker serait d'avoir une liste de triplets par défaut
  • ...

Quelques exemples:

  • (utilisation, ballon, pompe)
  • (donne, John, pomme de terre)
  • (promenade, piranhas, NULL)
  • (utilisation, ballon en inventaire, pompe)
  • (ouvert, porte-à-toit, NULL), par défaut .... exemple d'action par défaut

Il peut être étendu:

  • ajouter des événements à déclencher (donner quelque chose au joueur, le joueur dira "je ne peux pas faire ça parce que je suis un puissant pirate", démarrer une cinématique, changer quelque chose dans le monde ...)
  • ajoutez quelques conditions préalables. Parfois, le ballon peut être en cage, vous devrez donc exprimer "si le ballon n'est pas en cage". Je pense que je pourrais aborder cela avec un calcul d'événement ou un prologue ou le faire avec un pointeur de fonction ...
  • parfois la phrase en ligne de commande ne serait pas "regarder dans le trou" mais serait réécrite pour "regarder dans le trou", cela nécessite juste une variable :)
user712092
la source
1

Il y a deux problèmes ici: interpréter l'entrée du joueur dans un arbre de syntaxe, puis exécuter cet arbre.

Pour la première étape, chaque bouton verbe créerait une instance concrète de verbe dérivée d'une interface verbale. Cette instance recevrait d'autres noms ou verbes pour validation. S'il est valide, il attacherait le nom à son arbre de syntaxe interne, sinon il le rejetterait avec une erreur appropriée.

Après chaque pression sur un bouton, vous pouvez demander à l'arborescence des verbes s'il était dans un état valide pour continuer (pour l'entrée de style Monkey Island).

Une fois à la deuxième étape, le verbe concret serait chargé d'analyser son propre arbre et de mettre à jour l'état du jeu.

Une solution plus complexe impliquerait d'analyser l'arbre extérieurement au verbe. Chaque élément d'arbre serait responsable de petites actions qui, ensemble, produisaient le résultat souhaité. Cette approche vous permettrait de faire des phrases plus émergentes à partir de petits blocs de construction.

Consultez le modèle d' interpréteur pour plus d'informations sur l'étape d'analyse.

tenpn
la source
1
Je ne pense pas que l'interprétation de l'entrée des joueurs soit un problème. Il n'y a certainement rien d'aussi sophistiqué que l'analyse syntaxique d'une aventure textuelle nécessaire ici. Vraiment, la question se résume à la façon dont vous concevriez votre hiérarchie d'objet et vos interactions pour permettre une flexibilité maximale sur quel objet définit l'action réelle à effectuer.
SpoonMeiser