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 85209 mensajes en 12131 argumentos.

[¿Tutorial? ¿Script?] El problema clásico de los menús por engine: una solución rápida

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [¿Tutorial? ¿Script?] El problema clásico de los menús por engine: una solución rápida

Mensaje por silvanash el Dom 8 Jun 2014 - 6:21

Alguno de los enginers del foro (profesión a punto de extinguirse) habrá hecho alguna vez un menú por engines, con sus imágenes, su descomposición de variables, sus más imágenes y demases. Generalmente, estos menús están metidos en un evento común (a veces en varios) en proceso paralelo, con su clásico interruptor de activación. Ahora bien, estos menús tienen un problema en común:

Al ser un evento común en proceso paralelo, es posible activarlos en cualquier situación, a diferencia del menú normal. ¿Que hay una espera de 40 frames durante una secuencia? Ningún problema, el Maker no te deja abrir el menú mientras hay una espera activa. Sin embargo, el Maker te permitirá cargar un menú por engines en esa situación, y todos sabemos lo horrible que queda ver un menú en pantalla durante una secuencia. Por no hablar de la desincronización entre los eventos, y, en el peor de los casos, que las imágenes del menú borren a las de la pantalla al compartir IDs.

La primera solución que se viene a la mente es desactivar manualmente el interruptor del proceso paralelo. Es decir, en cada evento del juego, desactivar el interruptor al principio y reactivarlo al final, dado que el Maker carga el menú incluso durante los diálogos. Al desactivar el interruptor, el evento común desaparece, con lo que el Maker deja de cargar el menú. El método funciona, pero es extremadamente engorroso, por no decir que es fácil olvidarse de desactivar el interruptor en un evento. Además, no soluciona el segundo problema de estos engines:

Si el jugador pulsa la tecla de "aceptar" dentro del engine, puede activar eventos que estuviesen al lado del personaje cuando cargó el menú. Es decir, si había una anciana repartiendo manzanas enfrente del personaje, al pulsar "aceptar" en el menú se inicia el diálogo con la anciana.

La solución para este problema, tristemente, requiere de usar scripts.

Código:

class Game_Player < Game_Character
  def check_event_trigger_there(triggers)
    result = false
    # If event is running
    if $game_system.map_interpreter.running?
      return result
    end
    # Calculate front event coordinates
    new_x = @x + (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
    new_y = @y + (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
   
    # Impide activar eventos con el menú abierto
    if $game_switches[3] == true
      return result
    end
   
    # All event loops
    for event in $game_map.events.values
      # If event coordinates and triggers are consistent
      if event.x == new_x and event.y == new_y and
        triggers.include?(event.trigger)
        # If starting determinant is front event (other than jumping)
        if not event.jumping? and not event.over_trigger?
          event.start
          result = true
        end
      end
    end
    # If fitting event is not found
    if result == false
      # If front tile is a counter
      if $game_map.counter?(new_x, new_y)
        # Calculate 1 tile inside coordinates
        new_x += (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
        new_y += (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
        # All event loops
        for event in $game_map.events.values
          # If event coordinates and triggers are consistent
          if event.x == new_x and event.y == new_y and
            triggers.include?(event.trigger)
            # If starting determinant is front event (other than jumping)
            if not event.jumping? and not event.over_trigger?
              event.start
              result = true
            end
          end
        end
      end
    end
    return result
  end
end


Ese código impide que el jugador pueda activar eventos con el menú abierto. Lo que hace es comprobar si un interruptor está activado, y en caso de ser así, ignora los eventos que se activen por pulsar aceptar. En el script tengo puesto el interruptor con ID3, pero es posible cambiarlo por cualquier otro. Obviamente, el engine tendrá que activar ese interruptor cuando cargue el menú y desactivarlo al salir. Lo que recomiendo es usar ese interruptor para activar un segundo evento común en proceso paralelo, cuyo único comando sea "mover evento: personaje, mirar a héroe". Ese comando impide que el jugador se mueva al pulsar los cursores con el menú activado.

Para que no pueda activarse el menú cuando hay un evento activo, hay que cambiar la forma en la que llama al menú. Dentro del evento común en proceso paralelo, el comando para abrir el menú suele ser un "condiciones y efectos, tecla [laquesea] pulsada". Dentro de esa condición, en lugar de cargar todo el menú, hay que añadir una segunda condición, usando la opción de script:

Código:
$game_system.map_interpreter.running?


La parte de menú se coloca en la excepción a esa condición, dado que la condición favorable es que se esté ejecutando un evento, y ésa es la situación que queremos evitar.
avatar
silvanash
Aventurero
Aventurero

0/3

Créditos 1621

Gracias : 227

Volver arriba Ir abajo

RPG Maker XP Re: [¿Tutorial? ¿Script?] El problema clásico de los menús por engine: una solución rápida

Mensaje por mrhawi el Dom 8 Jun 2014 - 6:51

No sé cómo harán menúes los enginers de este foro, pero yo nunca tuve ese problema xD. De todas formas como aporte se agradece.

mrhawi
Aventurero
Aventurero

0/3

Créditos 2668

Gracias : 89

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.