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

Nuestros miembros han publicado un total de 84115 mensajes en 11982 argumentos.

Tecla rápida para llamar a una escena desde el mapa

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP Tecla rápida para llamar a una escena desde el mapa

Mensaje por Wecoc el 2014-08-20, 20:45

Supongamos que en nuestro juego se usa mucho una escena, en el ejemplo Scene_Item en XP, y queremos que a parte de poder acceder a ella desde el Menú se pueda también desde el mapa, pulsando una tecla rápida.

Os explicaré por pasos lo que hay que hacer para lograr tal cosa.

Parte general: Creando la llamada en Scene_Map

Primero creamos un nuevo script encima de main y le copiamos el update de Scene_Map. No usaremos alias y lo copiaremos entero, porque nos interesa modificarlo por la mitad.

Código:
# Llamada desde Scene_Map

class Scene_Map
  def update
    loop do
      $game_map.update
      $game_system.map_interpreter.update
      $game_player.update
      $game_system.update
      $game_screen.update
      unless $game_temp.player_transferring
        break
      end
      transfer_player
      if $game_temp.transition_processing
        break
      end
    end
    @spriteset.update
    @message_window.update
    if $game_temp.gameover
      $scene = Scene_Gameover.new
      return
    end
    if $game_temp.to_title
      $scene = Scene_Title.new
      return
    end
    if $game_temp.transition_processing
      $game_temp.transition_processing = false
      if $game_temp.transition_name == ""
        Graphics.transition(20)
      else
        Graphics.transition(40, "Graphics/Transitions/" +
          $game_temp.transition_name)
      end
    end
    if $game_temp.message_window_showing
      return
    end
    if $game_player.encounter_count == 0 and $game_map.encounter_list != []
      unless $game_system.map_interpreter.running? or
            $game_system.encounter_disabled
        n = rand($game_map.encounter_list.size)
        troop_id = $game_map.encounter_list[n]
        if $data_troops[troop_id] != nil
          $game_temp.battle_calling = true
          $game_temp.battle_troop_id = troop_id
          $game_temp.battle_can_escape = true
          $game_temp.battle_can_lose = false
          $game_temp.battle_proc = nil
        end
      end
    end
    if Input.trigger?(Input::B)
      unless $game_system.map_interpreter.running? or
            $game_system.menu_disabled
        $game_temp.menu_calling = true
        $game_temp.menu_beep = true
      end
    end
    if $DEBUG and Input.press?(Input::F9)
      $game_temp.debug_calling = true
    end
    unless $game_player.moving?
      if $game_temp.battle_calling
        call_battle
      elsif $game_temp.shop_calling
        call_shop
      elsif $game_temp.name_calling
        call_name
      elsif $game_temp.menu_calling
        call_menu
      elsif $game_temp.save_calling
        call_save
      elsif $game_temp.debug_calling
        call_debug
      end
    end
  end
end


Luego lo que hay que hacer es agregarle la llamada, como véis usa varias llamadas call_(nombre) desde un atajo en $game_temp. Eso lo hace porque interesa que no llame la escena si el jugador se está moviendo, podría dar problemas.

Código:
# Llamada desde Scene_Map

class Scene_Map
  def update
    loop do
      $game_map.update
      $game_system.map_interpreter.update
      $game_player.update
      $game_system.update
      $game_screen.update
      unless $game_temp.player_transferring
        break
      end
      transfer_player
      if $game_temp.transition_processing
        break
      end
    end
    @spriteset.update
    @message_window.update
    if $game_temp.gameover
      $scene = Scene_Gameover.new
      return
    end
    if $game_temp.to_title
      $scene = Scene_Title.new
      return
    end
    if $game_temp.transition_processing
      $game_temp.transition_processing = false
      if $game_temp.transition_name == ""
        Graphics.transition(20)
      else
        Graphics.transition(40, "Graphics/Transitions/" +
          $game_temp.transition_name)
      end
    end
    if $game_temp.message_window_showing
      return
    end
    if $game_player.encounter_count == 0 and $game_map.encounter_list != []
      unless $game_system.map_interpreter.running? or
            $game_system.encounter_disabled
        n = rand($game_map.encounter_list.size)
        troop_id = $game_map.encounter_list[n]
        if $data_troops[troop_id] != nil
          $game_temp.battle_calling = true
          $game_temp.battle_troop_id = troop_id
          $game_temp.battle_can_escape = true
          $game_temp.battle_can_lose = false
          $game_temp.battle_proc = nil
        end
      end
    end
    if Input.trigger?(Input::B)
      unless $game_system.map_interpreter.running? or
            $game_system.menu_disabled
        $game_temp.menu_calling = true
        $game_temp.menu_beep = true
      end
    end
    if $DEBUG and Input.press?(Input::F9)
      $game_temp.debug_calling = true
    end
   
    # Llamada a Scene_Item
    if Input.press?(Input::Z) # Presionar tecla D
      $game_temp.item_calling = true
    end
   
    unless $game_player.moving?
      if $game_temp.battle_calling
        call_battle
      elsif $game_temp.shop_calling
        call_shop
      elsif $game_temp.name_calling
        call_name
      elsif $game_temp.menu_calling
        call_menu
      elsif $game_temp.save_calling
        call_save
      elsif $game_temp.debug_calling
        call_debug
      elsif $game_temp.item_calling # Llamar call_item
        call_item
      end
    end
  end
end


Por ahora lo único que hemos hecho es imitar el maker, pero si os fijáis hemos creado una nueva variable en $game_temp llamada item_calling y un nuevo método en Scene_Map llamado call_item, y habrá que definir ambos.

Lo primero se hace con un alias del initialize y un attr_accessor, siempre se hace igual. Usad el que he hecho para adaptarlo. Para el call_item nuevamente nos copiamos del default.
Además, aunque solo es un detalle, está bien asignarle un interruptor de modo que puedas desactivar la opción cuando quieras.

Código:
# Definir variable en Game_Temp

class Game_Temp
  attr_accessor :item_calling
  alias call_item_ini initialize unless $@
  def initialize
    call_item_ini
    @item_calling = false
  end
end
   
# Llamada desde Scene_Map

class Scene_Map
  def update
    loop do
      $game_map.update
      $game_system.map_interpreter.update
      $game_player.update
      $game_system.update
      $game_screen.update
      unless $game_temp.player_transferring
        break
      end
      transfer_player
      if $game_temp.transition_processing
        break
      end
    end
    @spriteset.update
    @message_window.update
    if $game_temp.gameover
      $scene = Scene_Gameover.new
      return
    end
    if $game_temp.to_title
      $scene = Scene_Title.new
      return
    end
    if $game_temp.transition_processing
      $game_temp.transition_processing = false
      if $game_temp.transition_name == ""
        Graphics.transition(20)
      else
        Graphics.transition(40, "Graphics/Transitions/" +
          $game_temp.transition_name)
      end
    end
    if $game_temp.message_window_showing
      return
    end
    if $game_player.encounter_count == 0 and $game_map.encounter_list != []
      unless $game_system.map_interpreter.running? or
            $game_system.encounter_disabled
        n = rand($game_map.encounter_list.size)
        troop_id = $game_map.encounter_list[n]
        if $data_troops[troop_id] != nil
          $game_temp.battle_calling = true
          $game_temp.battle_troop_id = troop_id
          $game_temp.battle_can_escape = true
          $game_temp.battle_can_lose = false
          $game_temp.battle_proc = nil
        end
      end
    end
    if Input.trigger?(Input::B)
      unless $game_system.map_interpreter.running? or
            $game_system.menu_disabled
        $game_temp.menu_calling = true
        $game_temp.menu_beep = true
      end
    end
    if $DEBUG and Input.press?(Input::F9)
      $game_temp.debug_calling = true
    end
   
    # Llamada a Scene_Item
    if $game_switches[1] == true and Input.press?(Input::Z) # Interruptor 1 activado // Presionar tecla D
      $game_temp.item_calling = true
    end
   
    unless $game_player.moving?
      if $game_temp.battle_calling
        call_battle
      elsif $game_temp.shop_calling
        call_shop
      elsif $game_temp.name_calling
        call_name
      elsif $game_temp.menu_calling
        call_menu
      elsif $game_temp.save_calling
        call_save
      elsif $game_temp.debug_calling
        call_debug
      elsif $game_temp.item_calling
        # Llamar call_item
        call_item
      end
    end
  end
 
  def call_item
    # Resetear la variable de Game_Temp
    $game_temp.item_calling = false
    $game_player.straighten
    # Llamar a escena
    $scene = Scene_Item.new
  end
end


Llegados a éste punto podemos probarlo y ya funcionará, pero hay un problema. ¿Cuá? Se preguntaran los patos. Pues el problema es que si intentas volver de esa escena con X (cancelar), no volverá al mapa, volverá al menú porque es su comportamiento por defecto. Eso complica las cosas, habrá que modificar ese script en concreto para poder marcarle la diferencia entre cuando se ha llamado desde el mapa y cuando se hizo desde el menú. Y eso se hace modificando la llamada y asignándole una nueva variable.

Parte específica: Situando desde dónde se ha llamado

En nuestro script anterior habrá que modificar nuestra llamada de escena, en éste caso $scene = Scene_Item.new, por una que incluya una variable de modo que se indique que ésta ha sido llamada desde el mapa.

Código:
# Definir variable en Game_Temp

class Game_Temp
  attr_accessor :item_calling
  alias call_item_ini initialize unless $@
  def initialize
    call_item_ini
    @item_calling = false
  end
end
   
# Llamada desde Scene_Map

class Scene_Map
  def update
    loop do
      $game_map.update
      $game_system.map_interpreter.update
      $game_player.update
      $game_system.update
      $game_screen.update
      unless $game_temp.player_transferring
        break
      end
      transfer_player
      if $game_temp.transition_processing
        break
      end
    end
    @spriteset.update
    @message_window.update
    if $game_temp.gameover
      $scene = Scene_Gameover.new
      return
    end
    if $game_temp.to_title
      $scene = Scene_Title.new
      return
    end
    if $game_temp.transition_processing
      $game_temp.transition_processing = false
      if $game_temp.transition_name == ""
        Graphics.transition(20)
      else
        Graphics.transition(40, "Graphics/Transitions/" +
          $game_temp.transition_name)
      end
    end
    if $game_temp.message_window_showing
      return
    end
    if $game_player.encounter_count == 0 and $game_map.encounter_list != []
      unless $game_system.map_interpreter.running? or
            $game_system.encounter_disabled
        n = rand($game_map.encounter_list.size)
        troop_id = $game_map.encounter_list[n]
        if $data_troops[troop_id] != nil
          $game_temp.battle_calling = true
          $game_temp.battle_troop_id = troop_id
          $game_temp.battle_can_escape = true
          $game_temp.battle_can_lose = false
          $game_temp.battle_proc = nil
        end
      end
    end
    if Input.trigger?(Input::B)
      unless $game_system.map_interpreter.running? or
            $game_system.menu_disabled
        $game_temp.menu_calling = true
        $game_temp.menu_beep = true
      end
    end
    if $DEBUG and Input.press?(Input::F9)
      $game_temp.debug_calling = true
    end
   
    # Llamada a Scene_Item
    if $game_switches[1] == true and Input.press?(Input::Z) # Presionar tecla Z
      $game_temp.item_calling = true
    end
   
    unless $game_player.moving?
      if $game_temp.battle_calling
        call_battle
      elsif $game_temp.shop_calling
        call_shop
      elsif $game_temp.name_calling
        call_name
      elsif $game_temp.menu_calling
        call_menu
      elsif $game_temp.save_calling
        call_save
      elsif $game_temp.debug_calling
        call_debug
      elsif $game_temp.item_calling
        # Llamar call_item
        call_item
      end
    end
  end
 
  def call_item
    # Resetear la variable de Game_Temp
    $game_temp.item_calling = false
    $game_player.straighten
    # Llamar a escena : from_map = true (por defecto false)
    $scene = Scene_Item.new(true)
  end
end


En un nuevo script definimos esa variable, que por defecto valdrá false, eso se hace así:

Código:
class Scene_Item
  def initialize(from_map=false)
    @from_map = from_map
  end
end


Spoiler:
Scene_Item no tiene initialize en el script por defecto así que no necesita alias, lo podemos poner así directamente.
Miremos otro ejemplo para ver cómo sería si hubiera alias y además otras variables de llamada:

Código:
class Scene_Equip
  alias from_map_addon_ini initialize unless $@
  def initialize(actor_index=0, equip_index=0, from_map=false)
    from_map_addon_ini(actor_index, equip_index)
    @from_map = from_map
  end
end


Una vez definida la nueva variable, solo falta hacer una cosa: Buscar dentro de esa escena dónde se vuelve al menú, y cambiarlo de modo que cuando @from_map sea cierto, vaya al mapa directamente.
Buscando $scene = Scene_Menu.new vemos que en nuestro caso es dentro de update_item.

Código:
class Scene_Item
  def initialize(from_map=false)
    @from_map = from_map
  end
 
  alias from_map_upd_item update_item unless $@
  def update_item
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      # Al mapa
      if @from_map
        $scene = Scene_Map.new
      # Al menú
      else
        $scene = Scene_Menu.new(0)
      end
      return
    end
    from_map_upd_item
  end
end


¡Y ya está!
Espero que os haya sido útil, especialmente al que me lo preguntó xD
avatar
Wecoc
Administrador
Administrador



Créditos 9129

Gracias : 471

Volver arriba Ir abajo

RPG Maker XP Re: Tecla rápida para llamar a una escena desde el mapa

Mensaje por stiven202 el 2014-08-20, 20:58

yo te lo pregunté jaja muchas gracias.

Pero ya me lié con tanto script que pusiste ahí, ya no sé ni que copiar para que me funcione. Lo miraré con más detenimiento en unas horas jeje.
avatar
stiven202
Principiante
Principiante

0/3

Créditos 331

Gracias : 14

http://stiven202games.tumblr.com/

Volver arriba Ir abajo

RPG Maker XP Re: Tecla rápida para llamar a una escena desde el mapa

Mensaje por Wecoc el 2014-08-20, 21:02

Debes copiar el último que empieza por # Definir variable en Game_Temp y el último de todos. Los puedes poner en uno mismo, una parte encima de la otra.
avatar
Wecoc
Administrador
Administrador



Créditos 9129

Gracias : 471

Volver arriba Ir abajo

RPG Maker XP Re: Tecla rápida para llamar a una escena desde el mapa

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.