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 4193 miembros registrados.
El último usuario registrado es Godot.

Nuestros miembros han publicado un total de 85222 mensajes en 12132 argumentos.

[XP][Tutorial] Colocar eventos al azar en el mapa

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP][Tutorial] Colocar eventos al azar en el mapa

Mensaje por Wecoc el 2017-01-03, 23:27

A veces puede resultar algo molesto el hecho de que al salir de un mapa y entrar más tarde las posiciones de los eventos que se mueven al azar se reseteen cada vez igual. La solución más habitual es usar un script para que las posiciones de los eventos se guarden al salir del mapa, y al volver a entrar sigan siendo las mismas.

Pero hoy vengo a hablar de otra alternativa distinta; colocar mediante llamada de script ciertos eventos en posiciones al azar a lo largo del mapa. Puede resultar útil por ejemplo para enemigos de batallas en mapa.

Asignar una posición al azar de un evento interactuable no significa colocarlo a X e Y random del mapa y ya está. La posición debe tener dos características básicas; que sea pasable para el evento y que el personaje pueda acceder a éste.

Para ello os explicaré dos métodos distintos de hacer tal cosa.

1. Pathfinding

El personaje podrá acceder al evento si el evento puede llegar hasta el personaje. Así que dado un rango de posibles X, Y (digamos que es todo el mapa), podemos hacer lo siguiente:

1 - Asignar X, Y al azar dentro del rango
2 - Comprobar si X,Y es pasable y comprobar con Pathfinding si el evento puede acceder hasta las coordenadas del personaje.
3 - Si se cumplen los requisitos, mover el evento a esa posición. Si no, repetir desde punto 1.

Ésto se hará mediante un método de script que he creado expresamente.

Necesitáis el siguiente script, ponedlo encima de main:

Código:
#==============================================================================
# ** [XP] Wecoc's Rand Event Position (Pathfinding)
#------------------------------------------------------------------------------
#  Author: Wecoc (no credits required)
#==============================================================================

class Interpreter
  #===========================================================================
  # * Basic Pathfinding Formula
  #---------------------------------------------------------------------------
  # event - RPG::Event
  # tx    - Target X
  # ty    - Target Y
  #===========================================================================
  def find_path(event, tx, ty)
    x, y = event.x, event.y
    path = []
    max_elements = $game_map.width * $game_map.height
    coords = Table.new($game_map.width, $game_map.height)
    coords[x, y] = 1
    n = 0
    loop do
      n += 1
      return [] if n >= max_elements
      dx = tx - x
      dy = ty - y
      if dx.abs > dy.abs
        if dx > 0
          r = (dy > 0) ? [6, 2] : [6, 8]
        else
          r = (dy > 0) ? [4, 2] : [4, 8]
        end
      else
        if dy > 0
          r = (dx > 0) ? [2, 6] : [2, 4]
        else
          r = (dx > 0) ? [8, 6] : [8, 4]
        end
      end
      r << 10 - r[1]
      r << 10 - r[0]
      nx = nil ; ny = nil
      for d in r
        new_x = x + (d == 6 ? 1 : 0) - (d == 4 ? 1 : 0)
        new_y = y + (d == 2 ? 1 : 0) - (d == 8 ? 1 : 0)
        next if !$game_map.passable?(new_x, new_y, d)
        next if coords[new_x, new_y] != 0
        nx = new_x ; ny = new_y
        break
      end
      return [] if nx == nil or ny == nil
      x = nx ; y = ny
      coords[x, y] = 1
      path << [x, y]
      break if x == tx and y == ty
    end
    return path
  end
  #===========================================================================
  # * Teleport Event to a new position
  #---------------------------------------------------------------------------
  # rand_event_position(event[, sx, sy, width, height, px, py])
  #---------------------------------------------------------------------------
  # event  - RPG::Event // Event ID
  # sx     - Range X [Default: 0]
  # sy     - Range Y [Default: 0]
  # width  - Range WIDTH  [Default: Map WIDTH]
  # height - Range HEIGHT [Default: Map HEIGHT]
  # px     - Pathfinding Target X [Default: Player X]
  # py     - Pathfinding Target Y [Default: Player Y]
  #===========================================================================
  def rand_event_position(*args)
    event = args[0]
    event = $game_map.events[args[0]] if event.is_a?(Integer)
    sx = args[1] ; sx = 0 if sx == nil
    sy = args[2] ; sy = 0 if sy == nil
    width  = args[3] ; width  = $game_map.width  if width == nil
    height = args[4] ; height = $game_map.height if height == nil
    px = args[5] ; px = $game_player.x if px == nil
    py = args[6] ; py = $game_player.y if py == nil
    n = 0
    loop do
      n += 1
      next if n > (width * height)
      new_x = sx + rand(width)
      new_y = sy + rand(height)
      next if !event.passable?(new_x, new_y, 0)
      event.moveto(new_x, new_y)
      if self.respond_to?(:find_path)
        path = find_path(event, px, py)
        next if path.size == 0
      end
      break
    end
    return true
  end
end

Para llamarlo usad:
rand_event_position(ID de Evento)

Podéis asignar también un rango en el mapa, para limitar la zona donde puede aparecer:
rand_event_position(ID de Evento, X, Y, Ancho, Alto)

Finalmente podéis hacer que el pathfinding no se calcule hacia el personaje sinó otra coordenada, para casos más avanzados:
rand_event_position(ID de Evento, X, Y, Ancho, Alto, Target X, Target Y)

Lo ponéis en un proceso paralelo con cada evento que queráis posicionar de ese mapa, luego un Borrar Evento Temporalmente y ya está, sistema listo.

2. Areas

Es una alternativa de lo anterior usando mi sistema de Areas para RPG maker XP.
Es otro modo de asegurarse que el evento no aparece en algún lugar loco, pero no teniendo en cuenta la pasabilidad sinó el area.

Debajo del script Area Support necesitaremos insertar un código similar al del ejemplo anterior.

Código:
#==============================================================================
# ** [XP] Wecoc's Rand Event Position (Area)
#------------------------------------------------------------------------------
#  Author: Wecoc (no credits required)
#==============================================================================

class Interpreter
  #===========================================================================
  # * Teleport Event to a new position
  #---------------------------------------------------------------------------
  # rand_event_area(event, area[, sx, sy, width, height])
  #---------------------------------------------------------------------------
  # event  - RPG::Event // Event ID
  # area   - Area ID
  # sx     - Range X [Default: 0]
  # sy     - Range Y [Default: 0]
  # width  - Range WIDTH  [Default: Map WIDTH]
  # height - Range HEIGHT [Default: Map HEIGHT]
  #===========================================================================
  def rand_event_area(event, area, *args)
    event = $game_map.events[event] if event.is_a?(Integer)
    sx = args[0] ; sx = 0 if sx == nil
    sy = args[1] ; sy = 0 if sy == nil
    width  = args[2] ; width  = $game_map.width  if width == nil
    height = args[3] ; height = $game_map.height if height == nil
    n = 0
    loop do
      n += 1
      next if n > (width * height)
      new_x = sx + rand(width)
      new_y = sy + rand(height)
      next if !($game_map.area(new_x, new_y) == area)
      next if !event.passable?(new_x, new_y, 0)
      event.moveto(new_x, new_y)
      break
    end
    return true
  end
end

Para llamarlo usad:
rand_event_area(ID de Evento, ID de Area)

Podéis asignar también un rango en el mapa, para limitar la zona donde puede aparecer:
rand_event_area(ID de Evento, ID de Area, X, Y, Ancho, Alto)

Lo ponéis en un proceso paralelo con cada evento que queráis posicionar de ese mapa, luego un Borrar Evento Temporalmente y ya está, sistema listo.

Eso es todo, espero que ésta explicación haya ayudado a álguien ;D
avatar
Wecoc
Administrador
Administrador



Créditos 9272

Gracias : 503

Volver arriba Ir abajo

RPG Maker XP Re: [XP][Tutorial] Colocar eventos al azar en el mapa

Mensaje por Producciones The Golden el 2017-01-04, 00:43

Interesante... interesante... y cambiando de tema, lo que decías al comienzo de todo que hay scripts para guardar las posiciones de eventos al cambiar de mapa... ¿me dices como puedo buscarlos? necesitaría uno ajajjaja.
avatar
Producciones The Golden
Veterano
Veterano

0/3

Créditos 640

Gracias : 60

Volver arriba Ir abajo

RPG Maker XP Re: [XP][Tutorial] Colocar eventos al azar en el mapa

Mensaje por Wecoc el 2017-01-04, 01:53

Yo hice uno hace tiempo pero pese a ir bien es poco compatible con según qué otros scripts, a diferencia de los que puse en éste topic. Para teletransportar el evento a posiciones al azar no hay que hacer ningún cambio estructural. En cambio para almacenar las coordenadas de los eventos para luego recuperarlas al volver a entrar al mapa es necesario cambiar bastantes cosas, entre ellas los datos que se guardan al guardar partida, así que en ese caso es poco compatible con otros sistemas, "poco amigable" o como quieras llamarlo.

No sé qué otros hay, habría que buscar más a fondo, yo solo conozco el mío y uno de gameus. Los pongo aquí:

Game Map Event Position
Remember Events Position
avatar
Wecoc
Administrador
Administrador



Créditos 9272

Gracias : 503

Volver arriba Ir abajo

RPG Maker XP Re: [XP][Tutorial] Colocar eventos al azar en el mapa

Mensaje por Producciones The Golden el 2017-01-04, 02:56

Probaré este nuevo aporte (colocar eventos al azar) ya que en parte me vendría bien ya que me haría spawners de animales aleatorios en mi proyecto, que por cierto! sus vidas privadas ya va perfecta! tenemos al lagarto que persigue al escorpión para "comérselo", la serpiente que si te topas con ella te envenena y se va a tomar por cul#, el escorpión que te pica y se mete bajo tierra, el ciervito que sigue al ciervo grande y la hiena que va por ahí matando a todos XD; si este script no me genera ningún conflicto... (tengo 2 scripts de movimiento que me han generado problemas con algunos scripts) sin duda alguna se queda, y ya estás entre los créditos del proyecto obviamente :3, ya voy a ver si este script funciona.
avatar
Producciones The Golden
Veterano
Veterano

0/3

Créditos 640

Gracias : 60

Volver arriba Ir abajo

RPG Maker XP Re: [XP][Tutorial] Colocar eventos al azar en el mapa

Mensaje por Contenido patrocinado


Contenido patrocinado


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.