CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 14 Ago 2020 13:09

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 9 mensajes ] 
Autor Mensaje
NotaPublicado: 26 Ago 2010 00:00 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 04 Sep 2008 17:23
Mensajes: 747
Hola, llevo un par de días dándole vueltas a un problema de programación. Estaba seguro que sería algo muy sencillo, pero me he bloqueado y no sé por dónde echarle mano. Pensé que tal vez alguno podría ayudarme un poco. La idea era diseñar una malla de MxN casillas por la que el jugador pudiese desplazarse. Él siempre estaría en una de las casillas y el movimiento se podría realizar hacia cualquiera de las casillas contiguas. Simplemente eso.

En una malla 3x3 bastaría con crear las 9 localidades (casillas) y crear las uniones entre ellas, pero en una malla 10x10 hacerlo así es una tortura... ¿Cómo plantearíais vosotros el problema?


Arriba
 Perfil  
 
NotaPublicado: 26 Ago 2010 01:51 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 24 Ago 2007 00:41
Mensajes: 2023
Ubicación: Chile
Eso ya está hecho. Consulta la librería TRIESPACIO de InformATE! Si la quieres para INFSP, no debería costar nada portarla.

http://www.caad.es/informate/informate/index.html

Busca ahí la librería TRIESPACIO.

Citar:
Triespacio v020811 (K) (Baltasar) Aparentar que una localidad (una nave, un barco, un coche...) se mueve por un espacio tridimensional.


Saludos :)

P.S: Y por cierto, la solución es tan sencilla como codificar un array o usar dos variables (x, y) para guardar una posición espacial. Y varías los mensajes y los objetos existentes dentro de la localidad, en función de la posición indicada por esas dos variables. :)

_________________
Eliuk Blau
eliukblau (AT) gmail.com
http://www.caad.es/eliukblau/


Arriba
 Perfil  
 
NotaPublicado: 26 Ago 2010 09:58 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5312
Ubicación: Coruña
Código:
for i = 0..9
  for j = 0..9
    crear nueva habitación hab[i][j]
    if ( i > 0 ) crear nuevos caminos hab[i][j] -> hab[i-1][j], hab[i-1][j] -> hab[i][j]
    if ( j > 0 ) crear nuevos caminos hab[i][j] -> hab[i][j-1], hab[i][j-1] -> hab[i][j]

Con eso lo haces, luego ya cómo se creen habitaciones dinámicamente en cada sistema es otro tema.

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
NotaPublicado: 26 Ago 2010 10:45 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 10 Mar 2004 11:58
Mensajes: 1817
Ubicación: Madrid
El problema de Triespacio es que no contempla la actualización de objetos dentro de la malla. Así, si dejamos algo, aparecerá en todas las localidades.

Para que la malla sea perfecta hay que incluir una función de mete-saca objetos, que tras cada movimiento saque todos los objetos que no deban estar en esas coordenadas y meta los que sí.

En definitiva:
1. Adjudicar las propiedades posx y posy a todos los objetos susteptibles de estar en la malla (tanto los de escenario como los de inventario)

2. Crear un objeto malla con las propiedades posx y posy, y un objeto "limbo_malla" que servirá de trastero para meter y sacar objetos.

3. Cada vez que el jugador se mueve incrementar posx/posy en las propiedades de la malla, llamar a una función que rastree con un objectloop qué objetos con las propiedades posx y posx tienen coordenadas coincidentes con las de la malla, mandar al "limbo_malla" los de coordenadas que no coincidan, y traer los que sí.
Lo más fácil es sacar absolutamente todo, menos al jugador, y luego volver a meter lo que corresponda.
Algunas cosas se meterán y sacarán a mano, como el objeto muro que delimite las casillas perimetrales. En este caso, estará presente en todas las casillas menos en la central en la malla de 3x3.

4. Como el PJ realmente no se mueve, hay que simular el cambio de localidad, imprimiendo el título con el estilo "Subheader", la descripción, salidas, listado de objetos presentes, y todo lo que se quiera.
Creamos una función de descripción de localidades que pueda personalizarlas en función de la casilla en la que nos encontremos o usando objetos presentes como referencia.

5. Conviene almacenar las posx_anterior y la posy_anterior, así como las posx_preanterior y posy_preanterior, para saber la dirección del último movimiento. Ayuda a definir más dinámicamente las descripciones narrando si hemos ido hacia el norte, el sur... si continuamos avanzando hacia el sur, o si giramos 90 grados para continuar hacia el este...

6. La función que revisa las órdenes de movimiento, es la principal desde donde controlaremos los límites de la malla, y en caso de poder realizarse el desplazamiento, incrementar o decrementar las coordenadas, llamar al mete-saca objetos e imprimir la descripción de falsa nueva localidad.

7. Intervenir tras dejar un objeto, haciendo coincidir sus coordenadas con las de la casilla de la malla, o será barrido para siempre al desplazarnos.

8. Si haces una malla, aprovecha para meter PSIS que se muevan o rastreen, la malla es ideal para ello.

En los códigos fuente de Regreso al Edén (plantilla4.inf) o PUJ (plantilla2.inf) puedes ver ejemplos de mallas.
http://www.caad.es/jarel/trastero.html

Saludos

_________________
_/ /\ R e \_


Arriba
 Perfil  
 
NotaPublicado: 27 Ago 2010 01:28 
Desconectado
Implementador
Implementador

Registrado: 09 Jun 2010 14:50
Mensajes: 1677
Ubicación: Argentina
¿Y se puede trabajar sin crear el limbo? Digo para que al leer el código sea un poquito menos complicado.

¡Saludos!


Arriba
 Perfil  
 
NotaPublicado: 27 Ago 2010 02:11 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 04 Sep 2008 17:23
Mensajes: 747
Gracias por las respuestas. Ahora mismo estoy demasiado liado como para intentar programar algo usable en Inform6, que es con lo que me desenvuelvo bien para hacer aventuras; pero ya tengo algunos pequeños ejemplos en Java que parecen funcionar (tengo que dedicarle algo más de atención a AGE cuando pueda). Voy a intentar juguetear un poco con objetos que merodeen y me persigan por la malla :) .

Gracias de nuevo. Un saludo!


Arriba
 Perfil  
 
NotaPublicado: 27 Ago 2010 07:49 
Desconectado
Guionista
Guionista
Avatar de Usuario

Registrado: 20 Ene 2007 20:09
Mensajes: 356
Hola, Makinaimo, la funcionalidad básica para lo que necesitas creo que sería algo como esto:
Spoiler: Mostrar
Código:
Class Malla
with    ANCHO,   ALTO, ! ancho y alto de la malla
          x , y,                    ! posición inicial del jugador en la malla (empieza en la cero)
         avanzar [px py;
            if (self.x+px < 0 || self.x+px > self.ANCHO-1 || self.y+py < 0 || self.y+py > self.ALTO-1)
               rfalse;
            else
            {
               self.x = self.x + px;
               self.y = self.y +  py;
               <<Look>>;
            }
         ],
         reorganizar [o;
            objectloop (o ofclass ObjetodeJuego)
            {
               if (self.x == o.posx && self.y == o.posy)
                  move o to location;
               else if (o.posx ~= -1 || o.posy ~= -1)
                  remove o;
            }
         ],
         before [;
            Go:
               switch (noun)
               {
                  n_obj: return self.avanzar(0, -1);
                  s_obj: return self.avanzar(0, 1);
                  w_obj: return self.avanzar(-1, 0);
                  e_obj: return self.avanzar(1, 0);
                  nw_obj: return self.avanzar(-1, -1);
                  ne_obj: return self.avanzar(1, -1);
                  se_obj: return self.avanzar(1, 1);
                  sw_obj: return self.avanzar(-1, 1);
               }
            Look:
               self.reorganizar(); rfalse;
         ];

Class ObjetodeJuego
with posx -1, posy -1,
    after [;
       Take, Remove:
          if (location ofclass Malla)
          {
             self.posx = -1;
             self.posy = -1;
          }
          rfalse;
       Drop, Insert:
          if (location ofclass Malla)
          {
             self.posx = location.x;
             self.posy = location.y;
          }
          rfalse;
    ];


...y un ejemplo de uso:

Spoiler: Mostrar
Código:
Malla mimalla "Caja de cerillas"
with
   ANCHO 10, ALTO 10,
   x 5, y 5,
   description "Perdido en la inmensidad de esta caja de cerillas. Casi a oscuras, es difícil saber hacia dónde dirigirte.",
   cant_go [; "¡Bump!, te topas con una pared de duro cartón al dirigirte al ", (name) noun, "."; ],
has light;
   

ObjetodeJuego cerilla "cerilla"
with posx 5, posy 5,
        name 'cerilla',
        description "Una cerilla enorme. Lástima que esté gastada. ¿Por qué la gente siempre vuelve a meter las cerillas usadas en la caja?",
        before [;
           SwitchOn, Burn:
              "Aunque encontraras una superficie para encenderla, ya ha sido usada.";
        ],
        has female;


Arriba
 Perfil  
 
NotaPublicado: 01 Sep 2010 10:21 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 23 Abr 2004 08:49
Mensajes: 2973
Ubicación: España (Galicia)
Hola !

jarel escribió:
El problema de Triespacio es que no contempla la actualización de objetos dentro de la malla. Así, si dejamos algo, aparecerá en todas las localidades.
(...)
4. Como el PJ realmente no se mueve, hay que simular el cambio de localidad, imprimiendo el título con el estilo "Subheader", la descripción, salidas, listado de objetos presentes, y todo lo que se quiera.
Creamos una función de descripción de localidades que pueda personalizarlas en función de la casilla en la que nos encontremos o usando objetos presentes como referencia.


Triespacio sirve para mover una localidad (una lancha, como en "La gema Karssakis", o un overcraft, como en "Error de copia"...) por una malla simulada. Si dejas un objeto, lo dejas dentro de la localidad móvil (repito, lancha, overcraft...), por lo que no existe ese problema, en la realidad. Así, los objetos no aparecen en "todas las localidades".

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 01 Sep 2010 20:37 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 10 Mar 2004 11:58
Mensajes: 1817
Ubicación: Madrid
baltasarq escribió:
Hola !

jarel escribió:
El problema de Triespacio es que no contempla la actualización de objetos dentro de la malla. Así, si dejamos algo, aparecerá en todas las localidades.
(...)
4. Como el PJ realmente no se mueve, hay que simular el cambio de localidad, imprimiendo el título con el estilo "Subheader", la descripción, salidas, listado de objetos presentes, y todo lo que se quiera.
Creamos una función de descripción de localidades que pueda personalizarlas en función de la casilla en la que nos encontremos o usando objetos presentes como referencia.


Triespacio sirve para mover una localidad (una lancha, como en "La gema Karssakis", o un overcraft, como en "Error de copia"...) por una malla simulada. Si dejas un objeto, lo dejas dentro de la localidad móvil (repito, lancha, overcraft...), por lo que no existe ese problema, en la realidad. Así, los objetos no aparecen en "todas las localidades".


Pero a fín de cuentas el resultado es precisamente ese: los objetos aparecen en todas las localidades de la malla... aunque dentro de la barca (que puede considerarse localidad movil, contenedor flotante, o medium intermalla).
Y dentro del contexto en el que se hizo la pregunta y la propuesta de usar Triespacio, creo que la apreciación era correcta con el resultado que tendría.

Saludos

_________________
_/ /\ R e \_


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 9 mensajes ] 

Todos los horarios son UTC + 1 hora


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados


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