¿Cómo puedo implementar un sistema de comando para un juego de aventura de estilo de apuntar y hacer clic?

11

Estoy haciendo un juego de aventura de apuntar y hacer clic, y actualmente estoy tratando de encontrar la mejor manera de implementar un sistema de comando.

Asuma una interfaz de estilo Monkey Island o Maniac Mansion, con una paleta de verbos y objetos en la escena y en el inventario. Al hacer clic en estos, construyes una oración para ejecutar.

por ejemplo, puede hacer clic look aty luego en un árbol para "mirar el árbol" o hacer clic en una manzana, y luego give, y luego en una niña, para obtener "dar manzana a niña".

Hay tres formas posibles de una oración:

  • verb, por ejemplo "guardar"
  • verb noun, por ejemplo "recoger manzana", "mirar pulpo"
  • verb noun noun, por ejemplo, "dar encurtido al perro rabioso", "usar la palanca con el tarro de encurtidos"

En diferentes situaciones, querré que la acción que se lleve a cabo esté definida por diferentes objetos.

Por ejemplo, para el giveverbo, puede haber una acción predeterminada definida que haga que el personaje diga algo como "Prefiero aferrarme a eso", o el perro rabioso podría definir una acción donde se come cualquier cosa que intentes darle. .

Si la interfaz va a funcionar como Maniac Mansion, entonces construye la oración y luego le dice que se ejecute (en Maniac Mansion, ya sea haciendo clic en la oración o haciendo clic nuevamente en la última cosa en la que hizo clic).

Si va a funcionar como Monkey Island, la oración se ejecuta tan pronto como esté completa, lo que plantea un problema para verbos como los useque a veces pueden tomar un sustantivo y otras dos veces.

Entonces, ¿cómo implementaría un sistema que maneje esto?

SpoonMeiser
fuente
1
Parece que hay tres tipos de verbos, un tipo para sustantivos cero, otro para dos, etc. No son la misma clase de objeto. No se puede "ver pulpo con tarro de la salmuera", por lo lookque es un verbo de un solo sustantivo, etc
tenpn

Respuestas:

10

Puede resultarle más fácil de usar si invierte el orden de selección. Entonces, el usuario hace clic en un sustantivo y luego el juego muestra el conjunto de verbos que se pueden realizar en ese sustantivo. Si el verbo requiere un objeto (es decir, "dar a ___", entonces el juego espera a que el usuario seleccione el objeto antes de realizar la acción.

Algo como:

  1. El usuario hace clic en una hamburguesa con queso.
  2. El juego muestra un menú: "recoger, comer, mirar, dar a ___".
  3. El usuario selecciona "dar a ___".
  4. El juego dice "¿dar a quién?" y espera a que el usuario haga clic en otro nombre (o en un botón de cancelar).
  5. El usuario hace clic en un mono.
  6. El juego le da la hamburguesa al mono.

En cuanto a la implementación, cada objeto en el juego necesita tener datos para:

  1. Qué conjunto de verbos puedes aplicarle.
  2. Para los verbos, permite tomar un objeto, qué conjunto de objetos se puede aplicar.
  3. Para cada verbo o par verbo-objeto, el comportamiento a realizar cuando el usuario hace eso.

Dado que la gramática realmente no anida ni nada, no debería necesitar algo tan complicado como un patrón de intérprete.

munificente
fuente
+1, tanto en el lado de modelado de las cosas como en el lado de la interfaz de las cosas. Sí, sobre todo estoy de acuerdo porque así es como lo haría, pero me gusta esta respuesta.
drhayes
Si estamos de acuerdo, entonces claramente ambos debemos tener razón. ;)
munificente
Entonces, efectivamente, ¿crees que el comportamiento a realizar siempre debe estar definido por el primer sustantivo?
SpoonMeiser
1
Sí, creo que varios sustantivos compartirán el comportamiento (de modo que "recoger" usaría el mismo código para recoger diferentes objetos), pero tiene sentido que corresponda al sustantivo para determinar el conjunto de verbos que se pueden aplicar lo. Dado que el conjunto de sustantivos es muy grande (cada cosa en el juego) y el conjunto de verbos pequeños (probablemente un puñado de operaciones), creo que tiene sentido que el usuario elija un sustantivo primero ya que eso reduce las combinaciones más con rapidez. Y, pragmáticamente, permite al usuario hacer clic en una cosa para iniciar una interacción, y no en una palabra.
munificente
Esto es más o menos cómo lo hizo a todo gas.
Jari Komppa
2

Les presento una solución simplista. Se puede extender, por supuesto.

Creo que una simple lista de (verbo, objeto1, objeto2) lo resolvería:

  • si el jugador hizo clic en el objeto (verbo) "usar" y hizo clic en el objeto "globo" y el jugador hizo clic en el objeto "bomba" y existe un triplete ("usar", "globo", "bomba"), entonces "usó el globo con la bomba"
  • A veces, object2 sería NULL como en "use helium" (use, helium, NULL)
  • Requiere que el jugador haga clic en el verbo de objeto primero
  • si el jugador hace clic en algo que no coincide con nada, diga "No puedo hacer esto, esto no tiene sentido"
  • Por supuesto, debe verificar después de cada clic si la secuencia es correcta.

Cómo manejar los valores predeterminados:

  • Si el primer clic no está en el objeto del verbo, busque una posible acción predeterminada.
  • Una forma de almacenar valores predeterminados sería hacer cuádruple (verbo, objeto1, objeto2, es predeterminado)
  • Otra forma de almacenarlos sería tener una lista de trillizos predeterminados
  • ...

Algunos ejemplos:

  • (uso, globo, bomba)
  • (dale, John, papa)
  • (caminar, pirañas, NULL)
  • (uso, globo en inventario, bomba)
  • (abierto, puerta a techo, NULL), predeterminado ... ejemplo de acción predeterminada

Se puede extender:

  • agrega algunos eventos para que se activen (dale algo al jugador, el jugador dirá "No puedo hacer eso porque soy un poderoso pirata", comienza la escena de corte, cambia algo en el mundo ...)
  • Añadir algunas condiciones previas. A veces, el globo puede estar en la jaula, por lo que deberá expresar "si el globo no está en la jaula". Creo que podría abordar esto con cálculo de eventos o prólogo o hacerlo con puntero de función ...
  • a veces la oración en la línea de comando no sería "mirar en el hoyo" sino que sería reescrita para "mirar en el hoyo", esto requiere solo una variable :)
usuario712092
fuente
1

Aquí hay dos problemas: interpretar la entrada del jugador en un árbol de sintaxis, luego ejemplificar ese árbol.

Para la primera etapa, haría que cada botón de verbo creara una instancia de verbo concreta derivada de alguna interfaz de verbo. Esa instancia se pasaría más sustantivos o verbos para su validación. Si es válido, adjuntaría el sustantivo a su árbol de sintaxis interna, de lo contrario lo rechazaría con un error apropiado.

Después de presionar cada botón, puede preguntarle al árbol de verbos si estaba en un estado válido para continuar (para la entrada de estilo Monkey Island).

Una vez en la segunda etapa, el verbo concreto sería responsable de analizar su propio árbol y actualizar el estado del juego.

Una solución más compleja implicaría analizar el árbol externamente al verbo. Cada elemento del árbol sería responsable de pequeñas acciones que juntas produjeran el resultado deseado. Este enfoque le permitiría hacer oraciones más emergentes a partir de pequeños bloques de construcción.

Consulte el patrón de intérprete para obtener más información sobre la etapa de análisis.

tenpn
fuente
1
No creo que interpretar la entrada de los jugadores sea un problema. Ciertamente, no hay nada tan sofisticado como analizar la entrada a una aventura de texto que se necesita aquí. Realmente, la pregunta se reduce a cómo diseñaría su jerarquía de objetos e interacciones para permitir la máxima flexibilidad sobre qué objeto define la acción real que se llevará a cabo.
SpoonMeiser