CAAD
http://foro.caad.es/

Movimiento en mallas
http://foro.caad.es/viewtopic.php?f=10&t=4177
Página 1 de 1

Autor:  Makinaimo [ 26 Ago 2010 00:00 ]
Asunto:  Movimiento en mallas

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?

Autor:  Eliuk Blau [ 26 Ago 2010 01:51 ]
Asunto:  Re: Movimiento en mallas

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. :)

Autor:  Al-Khwarizmi [ 26 Ago 2010 09:58 ]
Asunto:  Re: Movimiento en mallas

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.

Autor:  jarel [ 26 Ago 2010 10:45 ]
Asunto:  Re: Movimiento en mallas

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

Autor:  Fernando Gregoire [ 27 Ago 2010 01:28 ]
Asunto:  Re: Movimiento en mallas

¿Y se puede trabajar sin crear el limbo? Digo para que al leer el código sea un poquito menos complicado.

¡Saludos!

Autor:  Makinaimo [ 27 Ago 2010 02:11 ]
Asunto:  Re: Movimiento en mallas

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!

Autor:  mastodon [ 27 Ago 2010 07:49 ]
Asunto:  Re: Movimiento en mallas

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;

Autor:  baltasarq [ 01 Sep 2010 10:21 ]
Asunto:  Re: Movimiento en mallas

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".

Autor:  jarel [ 01 Sep 2010 20:37 ]
Asunto:  Re: Movimiento en mallas

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

Página 1 de 1 Todos los horarios son UTC + 1 hora
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/