Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[RMXP] [Herramienta de eventing?] Esperar hasta condición en script

Ver el tema anterior Ver el tema siguiente Ir abajo

[RMXP] [Herramienta de eventing?] Esperar hasta condición en script

Mensaje por orochii el 2018-09-20, 16:24

He estado tocando algunas partes del código en Dreki para mis propios intereses, y me encontré con algo que talvez le interese a la gente quisquillosa como yo xD.

No sé si alguien recuerda un viejo bug que sucede en el llamar script si algo da false como última linea. Algo como esto:
Código:
$game_switches[2] = false
Creo que algo como eso bloquea el juego por tonterías de cómo está montado el llamar script.

Sin embargo le ví utilidad a ese bug, nada más que de forma más controlada. El asunto es así. Cada vez que un comando en el maker da resultado [line]false[/line], el RPG Maker no avanza el contador de índice del evento. Esto sirve para por ejemplo el comando esperar, el comando de scroll de mapa, y otros en donde el intérprete debe esperar a que suceda una condición específica.

Así que, con un par de modificaciones, logré hacer que eso funcionara a voluntad también con llamar script. Sirve para hacer efectos de esperar a x condición. Les mostraré luego dos ejemplos de cosas que se pueden hacer.

Primero, el código. Esto va en un script aparte. Añado de una vez un código que hice para scroll arbitrario a cualquier coordenada de mapa. El código de llamar script está "basado" en uno del script de Multiple Message Windows de ForeverZer0.
Código:
Game_Map
  def scroll_towards(orientation, coord, speed=4)
    case orientation
    when :horz
      cc = (@display_x / 128) + 9
      off = coord - cc
      #print coord.to_s + " - " + cc.to_s + " = " + off.to_s
      @scroll_direction = off>0 ? 6 : 4
      @scroll_rest = off.abs * 128
    when :vert
      cc = (@display_y / 128) + 7
      off = coord - cc
      #print coord.to_s + " - " + cc.to_s + " = " + off.to_s
      @scroll_direction = off>0 ? 2 : 8
      @scroll_rest = off.abs * 128
    end
    @scroll_speed = speed
  end
end

class Interpreter
  #--------------------------------------------------------------------------
  # * Script
  #--------------------------------------------------------------------------
  # Fix for RMXP bug: call script boxes that return false hang the game
  # See, e.g., http://rmxp.org/forums/showthread.php?p=106639  
  # EDIT: Reworked the bug since I got an use for it. :^D
  #--------------------------------------------------------------------------
  def command_355
    # Set first line to script
    script = @list[@index].parameters[0] + "\n"
    last_index = @index
    # Loop
    loop do
      # If next event command is second line of script or after
      if @list[@index+1].code == 655
        # Add second line or after to script
        script += @list[@index+1].parameters[0] + "\n"
      # If event command is not second line or after
      else
        # Abort loop
        break
      end
      # Advance index
      @index += 1
    end
    # Evaluation
    eval(script)
    result = $eval_result
    $eval_result = nil
    # If return value is false
    if result == false
      # End
      @index = last_index
      return false
    end
    # Continue
    return true
  end
end

Y ahora un ejemplo de uso.
Código:
if $game_map.scrolling?
  $eval_result = false
end
Este ejemplo hace al evento esperar hasta que termine de hacer scroll. Normalmente el evento sucede al mismo tiempo que hace scroll, a menos que tengas dos "Scroll de mapa" en sucesión, ante lo cual espera hasta el último scroll y... en fin es un enredo. Ahí tendrías que meter un "Esperar X frames". Esto reemplaza ese esperar, para no tener que probar cuántos condenados frames quedan bien.

Este es otro ejemplo.
Código:
if $game_player.moving?
  $eval_result = false
end
Este espera hasta que el jugador deje de moverse. Sé que hay un "Esperar a fin de movimiento", pero si tienes eventos moviéndose por ruta de movimiento o lo que sea, ese comando no sirve bien. Con este simplemente esperas a que el jugador, o un evento específico, se termine de mover. Igual reemplaza lo de "Esperar X frames".

Este es un ejemplo para usarlo con eventos.
Código:
if $game_map.events[5].moving?
  $eval_result = false
end
Esto esperaría hasta que el evento de ID 5 deje de moverse.

Ah y este es un ejemplo de cómo usarlo junto a mi código este para hacer scroll arbitrario.

Scroll a coordenadas específica (cada bloque puesto acá va en un "Llamar script" separado:
Código:
unless $game_map.scrolling?
  #Por cómo funciona el scroll, hay que hacer
  #scroll vertical y horizontal por separado
  $game_map.scroll_towards(:horz,21)
else
  $eval_result = false
end
Código:
unless $game_map.scrolling?
  $game_map.scroll_towards(:vert,9)
else
  $eval_result = false
end

Scroll de vuelta a jugador
Código:
unless $game_map.scrolling?
  x = $game_player.x
  $game_map.scroll_towards(:horz,x)
else
  $eval_result = false
end
Código:
unless $game_map.scrolling?
  y = $game_player.y
  $game_map.scroll_towards(:vert,y)
else
  $eval_result = false
end

Y pues sí, eso es todo.


Última edición por orochii el 2018-09-20, 16:40, editado 1 vez (Razón : más ejemplos de scroll)
avatar
orochii
Reportero

0/3

Créditos 7343

Gracias : 477

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.