Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.
Conectarse

Recuperar mi contraseña

Temas importantes
----------------------------------------
Páginas con recursos RPG Maker
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
Afiliados
Estadísticas
Tenemos 3821 miembros registrados.
El último usuario registrado es MikeWasauski.

Nuestros miembros han publicado un total de 86307 mensajes en 12304 argumentos.

[XP][Tutorial] Encuentros en mapa por eventos

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP][Tutorial] Encuentros en mapa por eventos

Mensaje por Wecoc el 2017-01-23, 13:34

Hoy os explicaré cómo hacer que los encuentros por mapa funcionen por eventos. Éstos no tendrán gráfico y serán atravesables; el jugador sigue sin saber donde se encuentran así que éste no notará diferencia frente al sistema por defecto.
Pero hacer que los encuentros en mapa sean por evento tiene varias ventajas respecto al sistema por defecto:

- Controlas cuantos encuentros puede haber en el mapa y con qué enemigos.
- No todos los encuentros tienen el mismo ratio de encuentro (dependerá del número de eventos iguales)
- Puedes hacer que éstos dependan de interruptores, variables...
- Puedes hacer encuentros únicos (borrar el evento para siempre tras haber luchado)
- Puedes obtener métodos para que el jugador sepa de antemano por dónde evitar pasar (por ejemplo representado los eventos en el minimapa con un punto rojo)

Sí, es cierto que tiene un inconveniente; más eventos en el mapa significa más lag, pero son con condición Toparse con Héroe, no Proceso Paralelo, así que no causan tanto lag. Además si dentro del evento de encuentro pones varias posibilidades de encuentro distintas y que se escoja una al azar, con pocos eventos puedes lograr muchas opciones de tropa enemiga.

Hoy os explicaré cómo controlar todo eso, en un sistema que combina engine y scripts.

1. Definir los eventos en el mapa

Crearemos los eventos de encuentro donde sea en el mapa y los llamaremos "ENCOUNTER". Ese nombre de evento lo usaremos luego para detectarlos, porque en cada mapa tendrán ID distintas y necesitamos ese punto en común para identificarlos.
Dentro del evento pondremos una batalla con condición Escapar activada.

Spoiler:

En el ejemplo puse 4, los que quieras poner dependerá de la tasa de encuentro que quieras y del tamaño del mapa.
Creo que en los mapas grandes con unos 10 como mucho debería haber suficientes.

Crearemos una condición justo al principio del evento y le pondremos ésta condición:
$DEBUG && Input.press?(Input::CTRL)

Y si se cumple, pondremos Parar proceso de evento.
De ese modo, si estamos en modo Debug y pulsamos Control no se iniciará la batalla.

2. Colocar los eventos por el mapa al azar

Hace poco hice un post explicando cómo posicionar eventos al azar por el mapa.
Usaremos el mismo método. Hay dos opciones, por Pathfinding y por Area; ámbas son válidas.
Tutorial - Colocar eventos al azar en el mapa

Os adelanto que éste segundo paso lo haremos en un evento común, así que aunque por ahora esté vacío lo primero que haremos es llamarlo.
Reposicionaremos los eventos al cambiar de mapa y al terminar cada una de las batallas (opcional).

Para reposicionar al terminar batalla solo hay que poner en el mismo evento "Llamar a Evento Común", justo después de donde pusimos "Combatir".

Spoiler:

Para hacerlo al transportarse en cambio lo haremos con un pequeño script que amplíe el método Setup de Game Map (el que se activa al iniciar el mapa)´

Código:
class Game_Map
  alias encounter_map_setup setup unless $@
  def setup(map_id)
    encounter_map_setup(map_id)
    $game_temp.common_event_id = 1 # ID del Evento Común
  end
end

Otro modo más limpio de hacer lo mismo es con un evento en proceso paralelo que llame al evento común y luego se borre, pero de éste modo nos ahorramos un evento.
Hacedlo como prefiráis.

Dentro del Evento común pondremos un Llamar Script con una selección de eventos llamados "ENCOUNTER" y su reposicionamiento en el mapa.
Nótese que para ello usé el método rand_event_position, según el script de posición que hayáis escogido será un método u otro.
Son dos códigos que van seguidos, porque primero hay que cambiar la pasabilidad de éstos a No pasables, luego reposicionarlos, y finalmente volver a cambiarla a Pasables.
Si no, podrían aparecer encima de otros eventos, o dos eventos de Encuentro en la misma coordenada y esas cosas.

Código:
for event in $game_map.events.values
 name = event.instance_eval("@event").name
 if name == "ENCOUNTER"
  ch = "@character_name = '051-Undead01'"
  event.instance_eval(ch) if $DEBUG
  event.instance_eval("@through = false")
  rand_event_position(event.id)
 end
end

Código:
for event in $game_map.events.values
 name = event.instance_eval("@event").name
 if name == "ENCOUNTER"
  event.instance_eval("@through = false")
 end
end

Además puse la opción de que en modo Debug se vean los eventos con el gráfico de fantasma, mientras que en el juego no se vean, así es más cómodo testear.
Para cambiar el gráfico buscad dentro del primer código '051-Undead01' y le ponéis el nombre de character que queráis (si ponés '', es decir borráis el nombre de dentro y dejáis solo las dos comillas o bien borráis esa línea y la siguiente, se desactivará esa opción y no se verán nunca los eventos)

Spoiler:

Con eso ya funciona el sistema de encuentros por evento. Pero quiero ir un paso más allá y mostraros un ejemplo de uso de éste sistema.

3. Hacer un radar para detectar encuentros

Crearemos un item que haga una animación encima de los eventos de encuentro que estén cerca del personaje.
Para ello, el item llamará a un evento común.

Dentro del evento común pondremos un llamar script muy similar al del otro, pero que en vez de reposicionar mostrará una animación a los eventos.

Código:
for event in $game_map.events.values
 name = event.instance_eval("@event").name
 if name == "ENCOUNTER"
  dx = ($game_player.x - event.x).abs
  dy = ($game_player.y - event.y).abs
  d = Math.sqrt(dx ** 2 + dy ** 2)
  if d < 5 # Rango
   event.animation_id = 1 # ID Animación
  end
 end
end

Spoiler:

Eso es todo. Muchas llamadas de script largas ésta vez, ya lo sé, pero es lo que hay xD
avatar
Wecoc
Administrador
Administrador



Créditos 12105

Gracias : 522

Volver arriba Ir abajo

RPG Maker XP Re: [XP][Tutorial] Encuentros en mapa por eventos

Mensaje por Eron el 2017-05-09, 10:56

Lo que más me gustó de ésto es que en realidad es una reescritura de los encuentros usando el comando de batalla de los eventos, lo que es muy útil porque permite hacer muchas cosas que normalmente costaría hacerlas incluso por script. Pongo una lista de las que se me ocurrieron:

- Encuentros en los que no se pueda escapar
- Encuentros en los que si pierdes en vez de ir a Game Over pasa otra cosa
- Encuentros en los que si ganas la batalla se activa algún evento común especial
- Encuentros únicos, solo suceden una vez en el juego (luego se activa un interruptor y ya está). También se puede usar una variable de contador para que solo sucedan n veces.
- Encuentros condicionales (por equipo, objeto obtenido... lo que sea)
- Aplicar animación de sorpresa al personaje antes de iniciar el encuentro.

Por último se me ocurre que si haces que esos eventos de encuentro te sigan (y se activen al colisionar) puedas diseñar un sistema de encuentros en mapa en el que quedarse quieto es peor que andar, a diferencia del default.

Las posibilidades son enormes =DD ¡Buen aporte!
PD: Espero que no se considere necro, quería aportar mis ideas...
avatar
Eron
Principiante
Principiante

0/3

Créditos 3593

Gracias : 56

Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


Permisos de este foro:
No puedes responder a temas en este foro.