CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 04 Jun 2020 19:34

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 17 mensajes ]  Ir a página Anterior  1, 2
Autor Mensaje
NotaPublicado: 04 Jun 2010 06:58 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 22 May 2004 10:50
Mensajes: 890
La línea de tiempo en una aventura está definida por los estados de sus objetos. El problema que planteas es precisamente el que yo intentaba solucionar, el poder hacer seguimiento de todos los estados del juego para poder 'visualizar' el flujo del juego. Podemos darle un par de vueltas y definir algo si tienes tiempo. Los diagramas van en xml asi que luego pueden convertirse al código del lenguaje que se necesite.

En cuanto a como organizar el código, me he encontrado con dos formas de hacerlo:

1. Cada objeto lleva control de su estado. Esto requiere muchas veces meter rutinas que se ejecuten cada turno, mirar el estado de otros objetos, sus variables, etc. Es la forma más intuitiva pero en el momento en que el juego crece se vuelve inmanejable pues pierdes la visión global muy rápido. Hay que navegar de un lado a otro del código para saber en un momento dado el estado en que se encuentra todo.

2. Llevar una máquina de estados dedicada. Un objeto lleva el control de los estados, sólo se necesita ejecutar cada turno su rutina. Los objetos con múltiples estados(normalmente PNJ) llevan tres variables: estado, estado_anterior y contador (para los estados con duración definida). El código de la máquina lo agrupas por etapas en el juego (por capítulos por ejemplo), de modo que resulta muy fácil ver que implica un estado actual sobre los objetos del juego.

Un trozo de código Informita a modo de ejemplo:


Código:
Object state_machine "estados"
    with capitulo 0,
    with estado_juego 0,
    with subestado_juego 0,
    with esta_en[; rtrue;  ], ! La omnipresente máquina de estados...
    cada_turno[o;

    ! Controla el estado del juego en cada turno...
    switch(self.capitulo)
   {
   0: !
    ! ---------------------------------------------------------------------
    ! PROLOGO                                                           ---
    ! ---------------------------------------------------------------------
     if (pnj.estado==0 && pnj in localizacion && localidadde(pnj)==l_patio_exterior)
      {
      print "...";
      pnj.estado=1; ! Ahora ya le hemos saludado..
      }   
   
   1:
   ! Estados del Capítulo 1
   }
],
has femenino escenario;


Aparte llevo una lista de estados para cada pnj, de modo que en todo momento conozco la implicación del estado en el mundo. Es muy importante tomar esta lista al pie de la letra y ceñirse a ella, sin añadir, renombrar o borrar estados en distintos puntos del código. Normalmente la máquina de estados de cada personaje se lleva bien, pero si es muy complicada la paso a papel para tener las ideas más claras. El diagrama en papel es muy similar a lo que he puesto en el primer post, la idea es que cada estado es un 'globo' y el paso entre estados se da al cumplirse una condición.

Código:
 Lista de estados
================================
cielo_mansion
0: Detenido.
1: Ciclo del cielo nocturno.

Klaus
0: Inicial
1: Se ha encontrado con Blaus
2: Cuando sigue el jugador.
3: En modo pánico...

Blaus
0: Inicial
1: Se ha encontrado con Klaus
2: sigue al jugador.
3: En modo pánico...


El segundo método me ha dado un resultado excelente en el juego que estamos a punto de publicar y aunque es mejorable lo recomiendo como forma de organizar una aventura con un número elevado de estados interrelacionados.

Un saludo

_________________
---
KMBR! http://www.aliensuavito.com @lecambre


Arriba
 Perfil  
 
NotaPublicado: 04 Jun 2010 09:34 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
saimazoom escribió:
Normalmente la máquina de estados de cada personaje se lleva bien, pero si es muy complicada la paso a papel para tener las ideas más claras. El diagrama en papel es muy similar a lo que he puesto en el primer post, la idea es que cada estado es un 'globo' y el paso entre estados se da al cumplirse una condición.


A ese diagrama me refería, al visual, al que muestra el flujo de la información gráficamente y no por medio de código. Aunque para el proyecto que llevo entre manos es ya un poco tarde, me gustaría intentar crear ese gráfico que me daría una visión global del juego, por eso preguntaba lo de los diagramas.

Ahora mismo, mi proyecto está a caballo entre los dos métodos que aquí muestras, los cambios de estado de los objetos se reparten entre el propio objeto (propiedades), y un objeto especial llamado entidad abstracta, que es el que se encarga de controlar la línea del tiempo donde se generan los eventos que aunque modifican los estados de otros objetos, no son propiciados por ninguno en particular.

Por ejemplo si en el guión se habla de una tormenta que origina un incendio en un momento dado, habrá una descripción del bosque, antes y después de la tormenta, y quien habla de descripción habla de muchas otras cosas. Pero si en vez de la tormenta, es el propio jugador el que origina el incendio quemando la maleza, es posible que sea el código de la maleza el que muestre el incendio, o bien que sea la maleza la que active la escena del incendio en la entidad abstracta. Mi problema es que en mi código ahora se dan los dos casos, y es tarde para empezar a mover bloques de código de un lado para otro, porque la aventura está ya muy avanzada.

Eso sí, para mi próximo proyecto intentaré seguir unas pautas y volveré a sacar el tema, porque sería muy interesante hacer realidad lo que dices. Seguir un patrón ya definido que sirva para cualquier lenguaje. :)

Saludos
Jenesis

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 17 mensajes ]  Ir a página Anterior  1, 2

Todos los horarios son UTC + 1 hora


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro

Buscar:
Saltar a:  
cron
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM