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 4191 miembros registrados.
El último usuario registrado es Victor Inkheart.

Nuestros miembros han publicado un total de 85160 mensajes en 12122 argumentos.

Truco para saber si Mover Evento fue efectuado o no

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP Truco para saber si Mover Evento fue efectuado o no

Mensaje por Wecoc el 2015-08-21, 22:12

No sabía muy bien dónde ponerlo, el caso es que me preguntaron por MP cómo comprobar el Mover Evento y me pareció interesante responderlo en un post por si a alguien más le puede ser de utilidad.

Uno de los modos de saber si un Mover Evento fue efectuado o por lo contrario se saltó debido a la pasabilidad, es usando las coordenadas del siguiente modo:

- Se guardan las coordenadas del evento antes de Mover Evento
- Se guardan otra vez tras el Mover Evento
- Se comparan

El problema es que eso es absoluto por Mover Evento, no para cada uno de los movimientos de éste.
En realidad visualmente en el juego es lo mismo poner ésto:

> Mover Evento:
> - Mover Arriba
> - Mover Arriba
> Esperar a finalizar movimiento


Que poner ésto:

> Mover Evento:
> - Mover Arriba
> Esperar a finalizar movimiento
> Mover Evento:
> - Mover Arriba
> Esperar a finalizar movimiento


Eso implica que se puede comprobar en cada uno de los movimientos igualmente fragmentando el movimiento total de ese modo.
Lo que pasa es que guardar las coordenadas y comprobarlas cada vez es lento y tedioso.

Otro pequeño problema que alentiza el progreso es que para que funcione, primero tiene que hacer el movimiento y luego comprobar las coordenadas, no puede saberlo mientras se está empezando a mover (o intentando mover).

Otro método es comprobar la pasabilidad del evento hacia donde debe ir antes de intentar efectuar el movimiento, para así saber de entrada si podrá ir allí o no.
Con movimientos de tipo Mover Arriba / Mover Abajo / Mover Derecha / Mover Izquierda es perfectamente válido si se usa juntamente con las coordenadas actuales del evento, pero con otros como Seguir a Héroe / Huir de Héroe / Avanzar un paso / Retroceder un paso se vuelve un auténtico rompecabezas y con Movimiento Aleatorio dejémoslo en que es imposible.

Así que otro modo mejor (y el mejor que se me ocurre) de saber si el movimiento fue efectuado o no es con un script que guarde el estado de "skip" del Mover Evento dentro de una variable (en éste caso usé una de Game_Temp) tras cada movimiento.

El script es el siguiente:

Código:
class Game_Temp
  attr_accessor :skip_state
  alias skipmode_ini initialize unless $@
  def initialize
    skipmode_ini
    @skip_state = false
  end
end

class Game_Character
  def move_type_custom
    if jumping? or moving?
      return
    end
    while @move_route_index < @move_route.list.size
      $game_temp.skip_state = false
      command = @move_route.list[@move_route_index]
      if command.code == 0
        if @move_route.repeat
          @move_route_index = 0
        end
        unless @move_route.repeat
          if @move_route_forcing and not @move_route.repeat
            @move_route_forcing = false
            @move_route = @original_move_route
            @move_route_index = @original_move_route_index
            @original_move_route = nil
          end
          @stop_count = 0
        end
        return
      end
      if command.code <= 14
        case command.code
        when 1  # Move down
          move_down
        when 2  # Move left
          move_left
        when 3  # Move right
          move_right
        when 4  # Move up
          move_up
        when 5  # Move lower left
          move_lower_left
        when 6  # Move lower right
          move_lower_right
        when 7  # Move upper left
          move_upper_left
        when 8  # Move upper right
          move_upper_right
        when 9  # Move at random
          move_random
        when 10  # Move toward player
          move_toward_player
        when 11  # Move away from player
          move_away_from_player
        when 12  # 1 step forward
          move_forward
        when 13  # 1 step backward
          move_backward
        when 14  # Jump
          jump(command.parameters[0], command.parameters[1])
        end
        if not @move_route.skippable and not moving? and not jumping?
          $game_temp.skip_state = true
          return
        end
        @move_route_index += 1
        return
      end
      if command.code == 15
        @wait_count = command.parameters[0] * 2 - 1
        @move_route_index += 1
        return
      end
      if command.code >= 16 and command.code <= 26
        case command.code
        when 16  # Turn down
          turn_down
        when 17  # Turn left
          turn_left
        when 18  # Turn right
          turn_right
        when 19  # Turn up
          turn_up
        when 20  # Turn 90° right
          turn_right_90
        when 21  # Turn 90° left
          turn_left_90
        when 22  # Turn 180°
          turn_180
        when 23  # Turn 90° right or left
          turn_right_or_left_90
        when 24  # Turn at Random
          turn_random
        when 25  # Turn toward player
          turn_toward_player
        when 26  # Turn away from player
          turn_away_from_player
        end
        @move_route_index += 1
        return
      end
      if command.code >= 27
        case command.code
        when 27  # Switch ON
          $game_switches[command.parameters[0]] = true
          $game_map.need_refresh = true
        when 28  # Switch OFF
          $game_switches[command.parameters[0]] = false
          $game_map.need_refresh = true
        when 29  # Change speed
          @move_speed = command.parameters[0]
        when 30  # Change freq
          @move_frequency = command.parameters[0]
        when 31  # Move animation ON
          @walk_anime = true
        when 32  # Move animation OFF
          @walk_anime = false
        when 33  # Stop animation ON
          @step_anime = true
        when 34  # Stop animation OFF
          @step_anime = false
        when 35  # Direction fix ON
          @direction_fix = true
        when 36  # Direction fix OFF
          @direction_fix = false
        when 37  # Through ON
          @through = true
        when 38  # Through OFF
          @through = false
        when 39  # Always on top ON
          @always_on_top = true
        when 40  # Always on top OFF
          @always_on_top = false
        when 41  # Change Graphic
          @tile_id = 0
          @character_name = command.parameters[0]
          @character_hue = command.parameters[1]
          if @original_direction != command.parameters[2]
            @direction = command.parameters[2]
            @original_direction = @direction
            @prelock_direction = 0
          end
          if @original_pattern != command.parameters[3]
            @pattern = command.parameters[3]
            @original_pattern = @pattern
          end
        when 42  # Change Opacity
          @opacity = command.parameters[0]
        when 43  # Change Blending
          @blend_type = command.parameters[0]
        when 44  # Play SE
          $game_system.se_play(command.parameters[0])
        when 45  # Script
          result = eval(command.parameters[0])
        end
        @move_route_index += 1
      end
    end
  end
end

De ese modo $game_temp.skip_state vale true si el último movimiento fue "saltado" y false si no, y se puede ir comprobando directamente paso tras paso (o básicamente donde sea necesario).

Terminaré con un ejemplo.

Éste evento en proceso paralelo se mueve hacia abajo hasta que encuentra un obstáculo, luego hacia arriba hasta que nuevamente encuentra un obstáculo, y así contínuamente.

> Comenzar ciclo
> > Mover Evento:
> > - Mover Abajo
> > Condiciones y Efectos: Script : $game_temp.skip_mode == true
> > > Romper Ciclo
> > Fin
> > Esperar a finalizar movimiento
> Fin de ciclo
> Comenzar ciclo
> > Mover Evento:
> > - Mover Arriba
> > Condiciones y Efectos: Script : $game_temp.skip_mode == true
> > > Romper Ciclo
> > Fin
> > Esperar a finalizar movimiento
> Fin de ciclo


Los condiciones y efectos miran si skip_mode vale true, es decir si el evento no pudo moverse. Si realmente es así, se rompe el ciclo lo que significa que pasará de ir Arriba a Abajo o al revés, mientras que si sí pudo pasar se esperará al fin de ese paso y continuará en la dirección que ya iba.

Espero que se haya entendido.
avatar
Wecoc
Administrador
Administrador



Créditos 9264

Gracias : 502

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.