Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[XP] Event Trigger Keys

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Event Trigger Keys

Mensaje por Wecoc el 2015-11-06, 07:03

He hecho un script que permite que ciertos eventos en vez de usar Aceptar como tecla de activación, puedan usar otra tecla.
Eso se puede hacer por engine pero de éste modo te ahorras un interruptor (para cada evento), dos procesos paralelos, y una comprobación de coordenadas y dirección.
Además lo hice de modo que el lag no suponga ningún problema.

Código:
#==============================================================================
# ** [XP] Event Trigger Keys v1.1
#------------------------------------------------------------------------------
# Autor: Wecoc (no requiere créditos)
#==============================================================================

class Game_Event < Game_Character
  attr_accessor :trigger_key
  alias trigger_key_ini initialize unless $@
  def initialize(*args)
    trigger_key_ini(*args)
    @trigger_key = Input::C # Tecla de activación por defecto
  end
end

class Game_Player < Game_Character
  attr_accessor :event_keys
  alias key_activation_ini initialize unless $@
  def initialize(*args)
    key_activation_ini(*args)
    @event_keys = [Input::C] # Teclas posibles por defecto
  end

  def check_event_trigger_here(triggers, key=Input::C)
    return false if $game_system.map_interpreter.running?
    for event in $game_map.events.values
      if event.x == @x and event.y == @y and triggers.include?(event.trigger)
        if not event.jumping? and event.over_trigger?
          if (event.trigger == 0 and event.trigger_key == key) or
              event.trigger > 0
            event.start
            return true
          end
        end
      end
    end
    return false
  end

  def check_event_trigger_there(triggers, key=Input::C)
    return false if $game_system.map_interpreter.running?
    new_x = @x + (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
    new_y = @y + (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
    new_x2 = new_x ; new_y2 = new_y
    if $game_map.counter?(new_x, new_y)
      new_x2 += (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
      new_y2 += (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
    end
    for event in $game_map.events.values
      if (event.x == new_x and event.y == new_y or
         event.x == new_x2 and event.y == new_y2) and
         triggers.include?(event.trigger)
        if not event.jumping? and not event.over_trigger?
          if (event.trigger == 0 and event.trigger_key == key) or
              event.trigger > 0
            event.start
            return true
          end
        end
      end
    end
    return false
  end

  def update
    last_moving = moving?
    unless moving? or $game_system.map_interpreter.running? or
           @move_route_forcing or $game_temp.message_window_showing
      case Input.dir4
        when 2: move_down
        when 4: move_left
        when 6: move_right
        when 8: move_up
      end
    end
    last_real_x = @real_x
    last_real_y = @real_y
    super
    if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
      $game_map.scroll_down(@real_y - last_real_y)
    end
    if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
      $game_map.scroll_left(last_real_x - @real_x)
    end
    if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
      $game_map.scroll_right(@real_x - last_real_x)
    end
    if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
      $game_map.scroll_up(last_real_y - @real_y)
    end
    unless moving?
      if last_moving
        result = check_event_trigger_here([1,2])
        if result == false
          unless $DEBUG and Input.press?(Input::CTRL)
            @encounter_count -= 1 if @encounter_count > 0
          end
        end
      end
      for key in @event_keys
        if Input.trigger?(key)
          check_event_trigger_here([0], key)
          check_event_trigger_there([0,1,2], key)
        end
      end
    end
  end
end

Versión antígua:

Código:
#==============================================================================
# ** [XP] Event Trigger Keys
#==============================================================================

class Game_Event
  attr_accessor :trigger_key
  alias key_activation_ini initialize unless $@
  def initialize(*args)
    key_activation_ini(*args)
    @trigger_key = Input::C # Tecla de activación por defecto
  end
end

class Game_Player < Game_Character
  attr_accessor :event_keys
  alias key_activation_ini initialize unless $@
  def initialize(*args)
    key_activation_ini(*args)
    @event_keys = [Input::C] # Teclas posibles por defecto
  end

  def check_event_trigger_here(triggers, key=Input::C)
    result = false
    if $game_system.map_interpreter.running?
      return result
    end
    for event in $game_map.events.values
      if event.x == @x and event.y == @y and triggers.include?(event.trigger)
        if not event.jumping? and event.over_trigger?
          if (event.trigger == 0 and event.trigger_key == key) or
              event.trigger > 0
            event.start
            result = true
          end
        end
      end
    end
    return result
  end

  def check_event_trigger_there(triggers, key=Input::C)
    result = false
    if $game_system.map_interpreter.running?
      return result
    end
    new_x = @x + (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
    new_y = @y + (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
    for event in $game_map.events.values
      if event.x == new_x and event.y == new_y and
         triggers.include?(event.trigger)
        if not event.jumping? and not event.over_trigger?
          if (event.trigger == 0 and event.trigger_key == key) or
              event.trigger > 0
            event.start
            result = true
          end
        end
      end
    end
    if result == false
      if $game_map.counter?(new_x, new_y)
        new_x += (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
        new_y += (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
        for event in $game_map.events.values
          if event.x == new_x and event.y == new_y and
             triggers.include?(event.trigger)
            if not event.jumping? and not event.over_trigger?
              if (event.trigger == 0 and event.trigger_key == key) or
                  event.trigger > 0
                event.start
                result = true
              end
            end
          end
        end
      end
    end
    return result
  end

  def update
    last_moving = moving?
    unless moving? or $game_system.map_interpreter.running? or
           @move_route_forcing or $game_temp.message_window_showing
      case Input.dir4
      when 2
        move_down
      when 4
        move_left
      when 6
        move_right
      when 8
        move_up
      end
    end
    last_real_x = @real_x
    last_real_y = @real_y
    super
    if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
      $game_map.scroll_down(@real_y - last_real_y)
    end
    if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
      $game_map.scroll_left(last_real_x - @real_x)
    end
    if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
      $game_map.scroll_right(@real_x - last_real_x)
    end
    if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
      $game_map.scroll_up(last_real_y - @real_y)
    end
    unless moving?
      if last_moving
        result = check_event_trigger_here([1,2])
        if result == false
          unless $DEBUG and Input.press?(Input::CTRL)
            if @encounter_count > 0
              @encounter_count -= 1
            end
          end
        end
      end
      for key in @event_keys
        if Input.trigger?(key)
          check_event_trigger_here([0], key)
          check_event_trigger_there([0,1,2], key)
        end
      end
    end
  end
end

Para definir las teclas posibles se cambiaría en la siguiente línea:
@event_keys = [InputC] # Teclas posibles por defecto

Aún así, la mejor forma de ahorrar lag es dejando Input::C (Enter) como única tecla por defecto, y al entrar en un mapa en el que haya algún evento con otra posibilidad, cambiar eso para abarcarlas todas; con ésta llamada de evento:

$game_player.event_keys = (keys)

Por ejemplo:

$game_player.event_keys = [Input::C, Input::X]

Luego para que un evento concreto utilice una tecla en vez de otra, su opción será Pulsar Aceptar, solo que previamente tendrás que asignar ésto en una llamada de evento:

$game_map.events[ID].trigger_key = (key)

Por ejemplo:

$game_map.events[2].trigger_key = Input::X

Ahora ese evento se activa solo si pulsas A

Aquí una lista con las teclas principales:

Input::A - Z, Shift
Input::B - X, ESC (Cuidado con el menú!)
Input::C - C, Enter, Espacio (Por defecto)
Input::X - A
Input::Y - S
Input::Z - D
Input::L - Q, RePag
Input::R - W, AvPag

También puedes usar Input::DOWN, Input::LEFT, Input::RIGHT, Input::UP.
En ese caso funcionará como el Toparse con héroe pero solo desde la dirección contraria a la tecla que lo activa.

Es incompatible solo con scripts que modifiquen la interacción con los eventos.
No hay muchos casos; Pixel-Movement, quizá algún script de vehículo...

Sé que el script no contempla todas las posibilidades, pero como añadido básico creo que os puede servir.

Spoiler:
Cosas que no se pueden hacer:
- Más de una tecla de activación a la vez
- Distintas páginas de evento con teclas de activación distintas

Edito: Éste script es para casos muy puntuales dentro del juego. Si queréis un script con una integración más completa leed éste tema:
KCheckEventByCoords
avatar
Wecoc
Administrador
Administrador



Créditos 12384

Gracias : 595

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Event Trigger Keys

Mensaje por Wecoc el 2018-02-21, 23:46

Update: He subido una nueva versión del script, la 1.1 Es muy similar y todo va igual, solo arreglé algunos detalles de formato para acabar de optimizarlo bien.

- Arreglada incompatibilidad por el alias de Game_Event (podía dar problemas según qué otro script de eventos usaras)
- Ahora no se pueden llamar dos eventos simultáneamente si se da la condición para hacerlo en ambos (solo llama al de ID más baja)
- Reducido el lag en mapas con muchos eventos
- Reducido el lag al testear tiles con propiedad Counter (Mostrador)
- Ahora el script es algo más corto


Espero que os sirva... siempre me pareció un script interesante, aunque según parece nadie le hiciera caso
La versión vieja usaba el método default de referencia directamente y resulta que hay lugar para la mejora porque al fin y al cabo lo de que se llamen dos eventos de mapa a la vez tampoco puede ocurrir en situaciones normales... No tiene mucho sentido tirar el loop hasta el final si ya encontró un evento a llamar en esas coordenadas. Lo que sí es cierto es que el script (ambas versiones) reescribe tres métodos importantes de Game_Event así que hay que vigilar con las incompatibilidades.

Si tenéis alguna duda de cómo usarlo solo tenéis que decirlo. También, si usáis algún script de Keyboard completo no es demasiado difícil de integrarlo.
avatar
Wecoc
Administrador
Administrador



Créditos 12384

Gracias : 595

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Event Trigger Keys

Mensaje por orochii el 2018-02-22, 05:27

Hay algo que sería... no sé cómo decirlo, ¿interesante? xD. Que sería hacer que un evento, si le hablas con C por ejemplo haga lo de siempre ("Hola soy Felipe Negrande."). Pero si le hablas con la A corra otra página de evento ("Por las noches suelen llamarme Pepina.").

No sé si me doy a explicar xD. Es como para hacer que puedas, por ejemplo, usar la tecla A para activar un tipo de interacciones especiales, como jugar cartas con NPCs o alguna tontería así.

No zhe.
avatar
orochii
Reportero

0/3

Créditos 7614

Gracias : 415

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Event Trigger Keys

Mensaje por Wecoc el 2018-02-22, 15:03

Lo sé, y de hecho lo puse en el spoiler del post principal. Ese script es solo una base y no contempla eventos con más de una tecla de activación y aún menos distintos procesos según ésta (ya sea con páginas distintas o con un Condiciones y Efectos, con lo que se necesitaría una variable que guarde con qué tecla se ha llamado).

Estaría bien para una puerta que puedes intentar abrir o bien directamente forzar según la tecla, como se ve en algunos juegos... o bueno también para cosas como tus ejemplos del travestido o del ludópata xD

Veré si más adelante puedo hacer una versión extendida.
avatar
Wecoc
Administrador
Administrador



Créditos 12384

Gracias : 595

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Event Trigger Keys

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.