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

Nuestros miembros han publicado un total de 86207 mensajes en 12284 argumentos.

[Tutorial] Controlar movimiento de personaje y eventos

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [Tutorial] Controlar movimiento de personaje y eventos

Mensaje por Wecoc el Mar 4 Oct - 6:13

Éste tutorial es para  XP RPG maker XP, pero en principio debería servir para  VX RPG maker VX y  VX Ace RPG maker VX Ace.

A veces en un engine nos puede interesar saber si en ese momento estás moviendo el personaje o no. Para ello las condiciones por defecto en Condiciones y Efectos no nos ayudan, hay que usar la opción Script que viene en ellas.

1. Comprobar si el personaje o evento se mueve o está parado

Game_Character, que es la clase madre de Game_Player (Personaje) y Game_Event (Evento), tiene un atajo especial para comprobar si éste se está moviendo, llamado moving? que devuelve true si se mueve y false si no.

Obtener si se está moviendo:

$game_player.moving?
$game_map.events[ID].moving?


En un script para obtener lo contrario (es decir comprobar que no se está moviendo) se usa un ! delante de lo que estamos comprobando, lo que quedaría así:

!$game_player.moving?
!$game_map.events[ID].moving?


Pero hay un problema con ese método. Lo que comprueba moving? es si el personaje está completamente fijado en la rejilla de los tiles (según él no se está moviendo) o si por lo contrario está descuadrado (lo que significará que se está moviendo).



Eso implica que para hacer algo que ocurra mientras el personaje se mueve, comprobando moving? es suficiente, pero en cambio para comprobar que no se mueve no sirve el negativo de la condición porque en cada paso el sprite queda cuadrado en la rejilla y se leerá como parado.



Para comprobar si el personaje está parado entonces se usa una alternativa; una variable de Game_Character llamada stop_count. Esa variable vale 0 mientras se está moviendo y justo al pararse, en cambio mientras está parado va incrementando cada frame.

Por defecto stop_count no es accesible así que necesitamos el siguiente script:

Código:
class Game_Character
  attr_reader :stop_count
end

Entonces para comprobar si está parado solo hay que usar:

$game_player.stop_count != 0
$game_map.events[ID].stop_count != 0


2. Comprobar si el personaje o evento empezó o dejó de moverse

Mientras el personaje esté descuadrado, se encuentre en el punto que se encuentre respecto al centro del tile, moving? vale true. Eso significa que para comprobar que el personaje o evento justo está empezando a andar no nos sirve.

Nuevamente tenemos que recurrir a stop_count para ello. Que un personaje justo empiece a andar significa que su stop_count pasa de tener un valor mayor que 0 a valer 0.

Ese cambio ocurre en el increase_steps y también al definir dirección, por lo que podemos ser un poco astutos y definir una variable que valga true solo en ese momento y solo si stop_count no valía 0 de entrada.

Código:
#==============================================================================
# ** Game_Character Start Moving Add-On
#==============================================================================

class Game_Character

  unless $@
    alias start_move_ini        initialize
    alias start_move_steps      increase_steps
    alias start_move_upd_move  update_move
    alias start_move_turn_down  turn_down
    alias start_move_turn_left  turn_left
    alias start_move_turn_right turn_right
    alias start_move_turn_up    turn_up
  end
 
  def initialize(*args)
    start_move_ini(*args)
    @start_moving = false
  end
 
  def increase_steps
    if @stop_count > 0
      @start_moving = true
    end
    start_move_steps
  end
 
  def turn_down
    unless @direction_fix
      if @stop_count > 0
        @start_moving = true
      end
    end
    start_move_turn_down
  end
 
  def turn_left
    unless @direction_fix
      if @stop_count > 0
        @start_moving = true
      end
    end
    start_move_turn_left
  end
 
  def turn_right
    unless @direction_fix
      if @stop_count > 0
        @start_moving = true
      end
    end
    start_move_turn_right
  end

  def turn_up
    unless @direction_fix
      if @stop_count > 0
        @start_moving = true
      end
    end
    start_move_turn_up
  end
 
  def update_move
    if @start_moving == true && @anime_count != 0
      @start_moving = false
    end
    start_move_upd_move
  end
 
  def start_moving?
    return @start_moving
  end
end

Con eso integrado, para comprobar si el personaje o evento justo empezó a moverse usad:

$game_player.start_moving?
$game_map.events[ID].start_moving?


Finalmente falta comprobar si el personaje o evento justo paró de moverse. Al primer frame de estar parado stop_count aún vale 0, pero al moverse también así que a cada paso se cumple que stop_count vale 0 y moving? vale false aunque el personaje no se esté realmente parando, por lo que no nos sirve ninguna de las dos condiciones ni las dos juntas. Lo que solo se cumple una vez justo después de pararse es otra condición mucho más simple; que stop_count valga 1, puesto que siempre que se esté moviendo vale 0 y mientras esté parado va subiendo.

Para comprobar si el personaje acaba de pararse:

$game_player.stop_count == 1
$game_map.events[ID].stop_count == 1


Hasta aquí el tutorial, ojalá os sirva para vuestros engines, especialmente la primera parte puesto que suele usarse más.
avatar
Wecoc
Administrador
Administrador



Créditos 12102

Gracias : 522

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.