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

Nuestros miembros han publicado un total de 84767 mensajes en 12064 argumentos.

[XP] Diagonales en movimiento al azar

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Diagonales en movimiento al azar

Mensaje por orochii el 2016-09-19, 03:46

Diagonales en movimiento al azar
Autor: Orochii Zouveleki, para RGSS1

Esto es un script bastante sencillo y una idea un tanto tonta. Simplemente hace que los eventos, al moverse al azar, consideren hacerlo en diagonal también. Esto también incluye mirar hacia una dirección al azar, por lo que el "mover al frente/hacia atrás" también responden acorde, así como girar 90º y 180º.

No pido créditos, y sólo le sirve a quien le interese en primer lugar que sus NPCs y whatever se muevan en diagonal. Si todo lo demás va recto se verá un tanto fuera de lugar que de pronto cosas empiecen a caminar diagonal xD.

Código:
class Game_Character
  
  # New direction methods
  def turn_lower_left
    unless @direction_fix
      @direction = 1
      @stop_count = 0
    end
  end
  def turn_lower_right
    unless @direction_fix
      @direction = 3
      @stop_count = 0
    end
  end
  def turn_upper_left
    unless @direction_fix
      @direction = 7
      @stop_count = 0
    end
  end
  def turn_upper_right
    unless @direction_fix
      @direction = 9
      @stop_count = 0
    end
  end
  
  #--------------------------------------------------------------------------
  # * Turn 90° Right
  #--------------------------------------------------------------------------
  def turn_right_90
    case @direction
    when 1
      turn_upper_left
    when 2
      turn_left
    when 3
      turn_lower_left
    when 4
      turn_up
    when 6
      turn_down
    when 7
      turn_upper_right
    when 8
      turn_right
    when 9
      turn_lower_right
    end
  end
  #--------------------------------------------------------------------------
  # * Turn 90° Left
  #--------------------------------------------------------------------------
  def turn_left_90
    case @direction
    when 1
      turn_lower_right
    when 2
      turn_right
    when 3
      turn_upper_right
    when 4
      turn_down
    when 6
      turn_up
    when 7
      turn_lower_left
    when 8
      turn_left
    when 9
      turn_upper_left
    end
  end
  #--------------------------------------------------------------------------
  # * Turn 180°
  #--------------------------------------------------------------------------
  def turn_180
    case @direction
    when 1
      turn_upper_right
    when 2
      turn_up
    when 3
      turn_upper_left
    when 4
      turn_right
    when 6
      turn_left
    when 7
      turn_lower_right
    when 8
      turn_down
    when 9
      turn_lower_left
    end
  end
  #--------------------------------------------------------------------------
  # * Turn at Random
  #--------------------------------------------------------------------------
  def turn_random
    case rand(8)
    when 0
      turn_up
    when 1
      turn_right
    when 2
      turn_left
    when 3
      turn_down
    when 4
      turn_lower_left
    when 5
      turn_lower_right
    when 6
      turn_upper_left
    when 7
      turn_upper_right
    end
  end
  
  def move_forward
    case @direction
    when 1
      move_lower_left
    when 2
      move_down(false)
    when 3
      move_lower_right
    when 4
      move_left(false)
    when 6
      move_right(false)
    when 7
      move_upper_left
    when 8
      move_up(false)
    when 9
      move_upper_right
    end
  end
  
  def move_backward
    # Remember direction fix situation
    last_direction_fix = @direction_fix
    # Force directino fix
    @direction_fix = true
    # Branch by direction
    case @direction
    when 1
      move_upper_right
    when 2  # Down
      move_up(false)
    when 3
      move_upper_left
    when 4  # Left
      move_right(false)
    when 6  # Right
      move_left(false)
    when 7
      move_lower_right
    when 8  # Up
      move_down(false)
    when 9
      move_lower_left
    end
    # Return direction fix situation back to normal
    @direction_fix = last_direction_fix
  end
  
  #--------------------------------------------------------------------------
  # * Move toward Player
  #--------------------------------------------------------------------------
  def move_toward_player
    # Get difference in player coordinates
    sx = @x - $game_player.x
    sy = @y - $game_player.y
    # If coordinates are equal
    if sx == 0 and sy == 0
      return
    end
    # Get absolute value of difference
    abs_sx = sx.abs
    abs_sy = sy.abs
    # If horizontal and vertical distances are equal
    if abs_sx == abs_sy
      # Increase one of them randomly by 1
      #rand(2) == 0 ? abs_sx += 1 : abs_sy += 1
      if (sy > 0) 
        # Upwards
        sx > 0 ? move_upper_left : move_upper_right
      else
        # Downwards
        sx > 0 ? move_lower_left : move_lower_right
      end
      return
    end
    # If horizontal distance is longer
    if abs_sx > abs_sy
      # Move towards player, prioritize left and right directions
      sx > 0 ? move_left : move_right
      if not moving? and sy != 0
        sy > 0 ? move_up : move_down
      end
    # If vertical distance is longer
    else
      # Move towards player, prioritize up and down directions
      sy > 0 ? move_up : move_down
      if not moving? and sx != 0
        sx > 0 ? move_left : move_right
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Move away from Player
  #--------------------------------------------------------------------------
  def move_away_from_player
    # Get difference in player coordinates
    sx = @x - $game_player.x
    sy = @y - $game_player.y
    # If coordinates are equal
    if sx == 0 and sy == 0
      return
    end
    # Get absolute value of difference
    abs_sx = sx.abs
    abs_sy = sy.abs
    # If horizontal and vertical distances are equal
    if abs_sx == abs_sy
      # Increase one of them randomly by 1
      #rand(2) == 0 ? abs_sx += 1 : abs_sy += 1
      if (sy > 0) 
        # Upwards
        sx > 0 ? move_lower_right : move_lower_left
      else
        # Downwards
        sx > 0 ? move_upper_right : move_upper_left
      end
      return
    end
    # If horizontal distance is longer
    if abs_sx > abs_sy
      # Move away from player, prioritize left and right directions
      sx > 0 ? move_right : move_left
      if not moving? and sy != 0
        sy > 0 ? move_down : move_up
      end
    # If vertical distance is longer
    else
      # Move away from player, prioritize up and down directions
      sy > 0 ? move_down : move_up
      if not moving? and sx != 0
        sx > 0 ? move_right : move_left
      end
    end
  end
 
  #--------------------------------------------------------------------------
  # * Move at Random
  #--------------------------------------------------------------------------
  def move_random
    case rand(8)
    when 0  # Move down
      move_down(false)
    when 1  # Move left
      move_left(false)
    when 2  # Move right
      move_right(false)
    when 3  # Move up
      move_up(false)
    when 4
      move_lower_left
    when 5
      move_lower_right
    when 6
      move_upper_left
    when 7
      move_upper_right
    end
  end
 
  def direction
    return 2 if @direction==1
    return 2 if @direction==3
    return 8 if @direction==7
    return 8 if @direction==9
    return @direction
  end
end

COMPATIBILIDAD
El código consiste de un montón de reescrituras de métodos default, así que lo mejor es ponerlo de último, y ver qué se ha estropeado. Sólo deberían haber problemas con cosas que afecten al mapa, específicamente movimiento. Aún así, no debería haber problema.

Salut!


Última edición por orochii el 2016-09-21, 00:13, editado 1 vez
avatar
orochii
Caballero Shiro
Caballero Shiro

0/3

Créditos 6388

Gracias : 332

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Diagonales en movimiento al azar

Mensaje por Wecoc el 2016-09-19, 04:28

Una duda; no entiendo mucho el propósito de ese último def direction. ¿Lo que hace no es precisamente estropear esa adaptación a las 8 direcciones y volverla a 4 direcciones?... No entiendo, tampoco se usa a lo largo del script xD.

Además si es por obtener el gráfico (aunque lo ideal en éste script sería usar gráficos de 8 direcciones), por defecto creo que a veces la dirección es 1 y en vez de estar mirando hacia abajo mira hacia la izquierda, no recuerdo cómo va montado pero diría que depende de si la dirección anterior ya era izquierda. Lo mismo con las demás direcciones.

En fin, a parte de esa duda creo que es un buen script. De hecho creía que ya existía eso xD

Recomendación: Jump con 8 direcciones también, según las coordenadas.
avatar
Wecoc
Administrador
Administrador



Créditos 9217

Gracias : 493

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Diagonales en movimiento al azar

Mensaje por orochii el 2016-09-19, 05:12

Sí, es por lo del gráfico. Fue un arreglo chapuza, no me tomé gran rato en ello. xD
Lo mejor sería guardar la dirección previa y que, por ejemplo, si te mueves arriba-derecha, si la dirección previa es arriba o derecha la deje tal cual, sino pues la actualice, o algo así. O quiza crear una "dirección lógica" usada para estas cosas.

O mejor aún, soporte de gráficos de 8 direcciones, pero pues lo dejé lo más plug 'n play. Y no me compliqué XD. Son cosas que pueden expandirse...
avatar
orochii
Caballero Shiro
Caballero Shiro

0/3

Créditos 6388

Gracias : 332

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Diagonales en movimiento al azar

Mensaje por Ledai el 2016-09-19, 16:47

Hum... no funciona, lo he probado incluso sin ese ultimo "def direction" que menciona Wecoc, pero los eventos no se desplazan en diagonal con el movimiento aleatorio en la ruta, sí he notado que te siguen en diagonal, pero al moverse aleatorialemente no lo hacen.

No he notado que cause ningun error, y eso que tengo algún que otro edit del Game Character.
avatar
Ledai
Aventurero
Aventurero

0/3

Créditos 2354

Gracias : 170

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Diagonales en movimiento al azar

Mensaje por rigel2 el 2016-09-20, 18:47

extrabagante script   lo guardare por alli aunque de momento no le encuentro   algun uso uno nunca sabe y es mejor estar prevenido jajaja
avatar
rigel2
Principiante
Principiante

0/3

Créditos 920

Gracias : 33

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Diagonales en movimiento al azar

Mensaje por orochii el 2016-09-21, 00:16

@Leda: Ah ostras me olvidé de la parte más importante x'D!!!! Sí es que normalmente el movimiento al azar lo hago por medio de turn_random y move_forward, porque suelo hacerlos moverse varios pasos antes de que cambien de dirección (es porque me parece molesto que den tantas vueltas tan tontas xD). Entonces, hice la prueba con lo mío, no verifiqué, y ahora revisando me di cuenta que olvidé retocar el método más importante: move_random xD!

Ya lo he actualizado.
avatar
orochii
Caballero Shiro
Caballero Shiro

0/3

Créditos 6388

Gracias : 332

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Diagonales en movimiento al azar

Mensaje por Ledai el 2016-09-21, 19:09

OK, ahora sí todo perfecto y parece que sigue sin dar error ^_^, (Así que puede que sea más compatible de lo que parece XD), está muy bien y si sigue sin darme conflicto con nada, pienso usarlo!! Ya que hasta ahora solo los personajes andaban en diagonal gracias a tu Fix, por eso casi que se hacia raro que los enemigos y eventos no y este script lo hace de maravilla por ahora. Gracias por la idea y por compartirla!!!!!!
avatar
Ledai
Aventurero
Aventurero

0/3

Créditos 2354

Gracias : 170

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Diagonales en movimiento al azar

Mensaje por orochii el 2016-09-22, 02:32

De nada, me alegra hacer fixes/detalles random que a alguien le sirvan :'D!. Algún día le quito la corona a Wec de scripter random (???????????). No, no creo poder. xD Es broma, o quiza un tipo raro de halago.

Salut!
avatar
orochii
Caballero Shiro
Caballero Shiro

0/3

Créditos 6388

Gracias : 332

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Diagonales en movimiento al azar

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.