jueves, 4 de marzo de 2021

Tutorial - Sistema de lanzar flechas/proyectiles y colisiones (Rpg maker 2003 - Otros)

 Desde que hice la parte de habilidades del Lufia de rpg maker no he contado cómo funciona internamente cada cosa, más de uno me ha preguntado como se hace, puede ser un poco lioso, pero con la teoría/lógica se aprende.
En mi caso me puse a hacer pruebas y a ver como lograba hacerlo, no es que leyera tutoriales.

 En el título he puesto lo de otros porque puede valer para más cosas que no sean Rpg Maker, es lógica del funcionamiento de un videojuego.


Veamos.

Tal como funciona Rpg maker 2003 hay que tener eventos, que son los cuadrados que se ven,
pero las acciones dentro del mismo también se les llama eventos. al final hay que verlo como un contenedor.

Como yo hice el sistema, para tener flechas y poder usar toda las propiedades, la flecha con su gráfico es como un evento de esos cuadrado.

Rpg maker ya tiene un sistema para poner en un proceso que está todo el rato funcionando (proceso paralelo) que al pulsar un botón pase x cosa, en este caso al pulsar el botón lanza la flecha.

Como Rpg maker tiene una sección llamada Eventos comunes donde puedes llamar a una serie de procesos sin copiar y pegar en cada mapa, solo está una vez.

-Detalles generales- 

Como se ve en la imagen de la derecha hay recuadros que representan coordenadas del mapa.
Rpg maker tiene 2 formas de usarlas,
Coordenadas X e Y, (el cuadro entero, lo que pasa desde que el primer píxel llega hasta él, se manejan sumando y restando 1 para pasasr de recuadro)
Posición X e Y (píxel a píxel, de un cuadro a otro hay una distancia de 16 píxeles)

Usando rangos de posición X y otros rangos de Y desde una posición a otra se puede hacer una caja de colisión, algo habitual en los juegos. Aunque Rpg maker ya integra formas propias sin llegar a decir la terminología tal como se conoce.

Uso de Variables, hay que saber que se pueden guardar valores y usando la función
de condiciones y efectos (Conditional branch) se pueden comprobar si
unas variables tienen el mismo valor, mayor, menor, etc

Como decía arriba usé una flecha que está como evento en el mapa, que es la que manejo.

-Cosas a definir-

En Variables
Coordenada del personaje X
Coordenada del personaje X+1 (Tomar valor de X y sumar 1)
Coordenada del personaje X-1 (Tomar valor de X y restar 1)


Coordenada del personaje Y
Coordenada del personaje Y+1 (Tomar valor de Yy sumar 1)
Coordenada del personaje Y-1 (Tomar valor de Yy restar 1)

A más variables guardemos de lo que rodea al personaje, luego podremos hacer más cosas.

Valor de Terreno, según el cuadro. (Terreno es algo de Rpg maker que se puede usar para colisiones)
Digamos que el valor 0 es no pasable y 1 pasable

Coordenada del X de Flecha
Coordenada del Y de Flecha

 
Coordenada del interruptor X
Coordenada del interruptor Y


(Esto último se puede ahorrar poniendo un proceso paralelo que guarde esa posición)

 -Acciones-

 Esta es la parte que hay que estrujarse un poco los sesos.
Al menos en Rpg maker 2003 todo se procesa a una velocidad rapidísima, así que hay que usar esperas continuas.

Si nuestro personaje está mirando a la izquierda,
Cambiar ubicación de Evento "Flecha"
Debe irse a la posición ID X-1

Algo así:
Condiciones y efectos: Dirección de Héroe "Izquierda"
-(Cambiar gráfico de personaje (haciendo gesto de lanzar si queremos)
--Movimiento de personaje: Flecha "Mirar a izquierda"
---Cambiar Posición de "Flecha" a Coordenada del personaje X-1 e Y (sin cambiar)
----Esperar 0.0s (las esperas así permiten que se procesen las cosas sin interrupciones)

Hasta ahora ya hemos conseguido que la flecha se mueva, pero solo si miramos a izquierda, ojo.
El movimiento, tal como se llaman las acciones en rpg maker: 

Condiciones y efectos: Coordenada del evento flecha X / flecha Y
-Adquirir ID de terreno de "Flecha" (en realidad debe ser de X-1 para saber si pasa)
--Condiciones y efectos: Variable Valor = 0 (No se cumple)
---Ir a etiqueta 1

--Condiciones y efectos: Variable Valor = 1 (Si se cumple)
---Movimiento de personaje: Flecha / "Comenzar Ruta" (Así tradujeron la acción de atravesar todo) "Avanzar" (Avanza un cuadrado)
----Esperar 0.2s (generalmente el tiempo de espera de un movimiento de tile, según la velocidad)
(En este punto se repite la acción, si no hay nada contra lo que chocar la flecha seguirá avanzando)
-Etiqueta 1
-- (Animación de chocar, o de momento ponemos que desaparezca la flecha)


Ahora viene lo que afecta al interruptor que pulsamos:
Rpg maker 2003 puede tener eventos haciendo procesos en paralelo comprobando cosas sin apenas afectar al rendimiento, y es lo que se suele hacer.

En el interruptor ponemos un evento

Ya tenemos de antes guardadas,
Coordenada del interruptor X
Coordenada del interruptor Y

Pues:

-Condiciones y efectos:
--Coordenada del interruptor X = Coordenada de Flecha X?
---Coordenada del interruptor Y = Coordenada de Flecha Y? (Si ambas se cumplen)
----Efecto de sonido (el que queramos)
----Activar interruptor: Palanca pulsada (El que queramos)
----Esperar 0.2s

-Esperar 0.0s (para evitar posible lag al estar todo el rato comprobando las coordenadas)

En mi ejemplo el interruptor tiene otro nombre, la palanca está mirando a otro lado
 (Como ya sabéis si habéis llegado aquí es solo un cambio de página, en la 2 no hay nada)


 En el proyecto había algo más aparte el terreno, el ID de lo que hay en un recuadro,
así no podía atravesar ciertas cosas como pilares, cierto rango lo dejaba para colisiones.

 Puede ser bastante lioso, voy a poner todo el evento común del Lufia aquí (es muy caótico por los pequeños ajustes que hacía sobre la marcha  😅),
igualmente está el juego en la seccion descargas,esto está en Evento común 0071-Flecha:
13 es el terreno de pared


-Evento original-

@> Conditional Branch: Variable [0014:habilidad] == 0
  @> Conditional Branch: Switch [0060:PERMITIR TECNICAS] is ON
    @> Key Input Processing: [0001:Teclas], Wait
    @> Call Event: [Flecha standby]
    @> Conditional Branch: Variable [0001:Teclas] == 7
      @> Control Switches: [0023:detectar teclas] = OFF
      @> Play SE: 'gadesx_029_arrow', 100, 100, 50
      @> Set Move Route: Player, Change Graphic..., Wait
      @> Set Move Route: [30 - Flecha], Change Graphic...
      @> Set Event Location: [30 - Flecha], Variable [0101][0102]
      @> Get Terrain ID: [0295], Variable [0099][0100]
      @> Control Switches: [0076:lanzando flecha] = ON
      @> Wait: 0.0 seconds
      @> Set Move Route: Player, Change Graphic..., Wait
      @> Set Move Route: [30 - Flecha] (Skip), Through ON
      @> Wait: 0.0 seconds
      @> Wait: 0.0 seconds
      @> Wait: 0.0 seconds
      @> Call Event: [Flecha standby]
      @> Conditional Branch: Switch [0096 detener flecha] is ON
        @> Jump to Label: 1
        @>
       : Branch End
      @> Conditional Branch: Player is facing Right
        @> Conditional Branch: Variable [0291 flecha terreno x+1] >= 13
          @> Jump to Label: 1
          @>
         : Branch End
        @>
       : Branch End
      @> Conditional Branch: Player is facing Left
        @> Conditional Branch: Variable [0292 flecha terreno x-1] >= 13
          @> Jump to Label: 1
          @>
         : Branch End
        @>
       : Branch End
      @> Conditional Branch: Player is facing Up
        @> Conditional Branch: Variable [0294 flecha terreno y-1] >= 13
          @> Jump to Label: 1
          @>
         : Branch End
        @>
       : Branch End
      @> Conditional Branch: Player is facing Down
        @> Conditional Branch: Variable [0293 flecha terreno y+1] >= 13
          @> Jump to Label: 1
          @>
         : Branch End
        @>
       : Branch End
      @> Wait: 0.0 seconds
      @> Wait: 0.0 seconds
      @> Comment: -------movimiento-------
      @> Conditional Branch: Player is facing Up
        @> Set Move Route: [30 - Flecha] (Skip), Turn Up, Change Graphic...,

Move Up, Move Up, Move Up, Move Up, Move Up, Move Up, Move Up
        @>
       : Branch End
      @> Conditional Branch: Player is facing Right
        @> Set Move Route: [30 - Flecha] (Skip), Turn Right, Change Graphic...,

Move Right, Move Right, Move Right, Move Right, Move Right
        @>
       : Branch End
      @> Conditional Branch: Player is facing Down
        @> Set Move Route: [30 - Flecha] (Skip), Turn Down, Change Graphic...,

Move Down, Move Down, Move Down, Move Down, Move Down, Move Down
        @>
       : Branch End
      @> Conditional Branch: Player is facing Left
        @> Set Move Route: [30 - Flecha] (Skip), Turn Left, Change Graphic...,

Move Left, Move Left, Move Left, Move Left, Move Left, Move Left
        @>
       : Branch End
      @> Wait: 0.0 seconds
      @> Comment: ----si choca, irse al final----
      @> Loop
        @> Control Variables: [0289 flechax primera] = [30 - Flecha]'s Screen X
        @> Control Variables: [0290 flechay primera] = [30 - Flecha]'s Screen Y
        @> Set Move Route: Player, Wait
        @> Wait: 0.0 seconds
        @> Control Variables: [0287 flecha x desaparece] = [30 - Flecha]'s

Screen X
        @> Control Variables: [0288 flecha y desaparece] = [30 - Flecha]'s

Screen Y
        @> Conditional Branch: Variable [0289 flechax primera] == Variable [0287

flecha x desaparece]
          @> Conditional Branch: Variable [0290 flechay primera] == Variable

[0288 flecha y desaparece]
            @> Jump to Label: 1
            @>
           : Branch End
          @>
         : Branch End
        @> Call Event: [Flecha standby]
        @> Conditional Branch: Switch [0096 detener flecha] is ON
          @> Jump to Label: 1
          @>
         : Branch End
        @> Conditional Branch: Player is facing Right
          @> Conditional Branch: Variable [0291 flecha terreno x+1] >= 13
            @> Jump to Label: 1
            @>
           : Branch End
          @>
         : Branch End
        @> Conditional Branch: Player is facing Left
          @> Conditional Branch: Variable [0292 flecha terreno x-1] >= 13
            @> Jump to Label: 1
            @>
           : Branch End
          @>
         : Branch End
        @> Conditional Branch: Player is facing Up
          @> Conditional Branch: Variable [0294 flecha terreno y-1] >= 13
            @> Jump to Label: 1
            @>
           : Branch End
          @>
         : Branch End
        @> Conditional Branch: Player is facing Down
          @> Conditional Branch: Variable [0293 flecha terreno y+1] >= 13
            @> Jump to Label: 1
            @>
           : Branch End
          @>
         : Branch End
        @> Control Variables: [0296 veces lanzando] += 1
        @> Conditional Branch: Variable [0296 veces lanzando] >= 18
          @> Break Loop
          @>
         : Branch End
        @>
       : Repeat Above
      @> Comment: ----------------------------------------------------
      @> Comment: ----------------------------------------------------
      @> Comment: ----------------------------------------------------
      @> Comment: ----------------------------------------------------
      @> Comment: ----------------------------------------------------
      @> Loop
        @> Control Variables: [0289 flechax primera] = [30 - Flecha]'s Screen X
        @> Control Variables: [0290 flechay primera] = [30 - Flecha]'s Screen Y
        @> Set Move Route: Player, Wait
        @> Wait: 0.0 seconds
        @> Control Variables: [0287 flecha x desaparece] = [30 - Flecha]'s

Screen X
        @> Control Variables: [0288 flecha y desaparece] = [30 - Flecha]'s

Screen Y
        @> Conditional Branch: Variable [0289 flechax primera] == Variable [0287

flecha x desaparece]
          @> Conditional Branch: Variable [0290 flechay primera] == Variable

[0288 flecha y desaparece]
            @> Jump to Label: 1
            @>
           : Branch End
          @>
         : Branch End
        @> Conditional Branch: Variable [0289 flechax primera] == Variable [0287

flecha x desaparece]
          @> Conditional Branch: Variable [0290 flechay primera] == Variable

[0288 flecha y desaparece]
            @> Jump to Label: 1
            @>
           : Branch End
          @>
         : Branch End
        @> Call Event: [Flecha standby]
        @> Conditional Branch: Switch [0096 detener flecha] is ON
          @> Jump to Label: 1
          @>
         : Branch End
        @> Conditional Branch: Player is facing Right
          @> Conditional Branch: Variable [0291 flecha terreno x+1] >= 13
            @> Jump to Label: 1
            @>
           : Branch End
          @>
         : Branch End
        @> Conditional Branch: Player is facing Left
          @> Conditional Branch: Variable [0292 flecha terreno x-1] >= 13
            @> Jump to Label: 1
            @>
           : Branch End
          @>
         : Branch End
        @> Conditional Branch: Player is facing Up
          @> Conditional Branch: Variable [0294 flecha terreno y-1] >= 13
            @> Jump to Label: 1
            @>
           : Branch End
          @>
         : Branch End
        @> Conditional Branch: Player is facing Down
          @> Conditional Branch: Variable [0293 flecha terreno y+1] >= 13
            @> Jump to Label: 1
            @>
           : Branch End
          @>
         : Branch End
        @> Control Variables: [0297 veces sin mantener] += 1
        @> Conditional Branch: Variable [0297 veces sin mantener] >= 29
          @> Break Loop
          @>
         : Branch End
        @>
       : Repeat Above
      @> Comment:

------------------------------------------------------------------
      @> Label: 1
      @> Control Switches: [0096 detener flecha] = OFF
      @> Control Variables: [0296 veces lanzando] = 0
      @> Control Variables: [0297 veces sin mantener] = 0
      @> Call Event: [Flecha standby]
      @> Control Switches: [0076:lanzando flecha] = OFF
      @> Set Move Route: Player, Change Graphic..., Wait
      @> Control Switches: [0023:detectar teclas] = ON
      @> Wait: 0.0 seconds
      @> End Event Processing
      @>
     : Branch End
    @>
   : Branch End
  @>
 : Branch End

 

 Supongo que uno de los eventos que llama al final es el que hace la animación de chocar y caerse, exactamente igual que en el juego de snes. Hace bastante tiempo desde que hice esto 2012-2014

No hay comentarios:

Publicar un comentario

Los comentarios deben pasar una moderación.