Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[RMXP] Formación (Leader Select)

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [RMXP] Formación (Leader Select)

Mensaje por Wecoc el 2014-05-26, 03:36

Crea una escena en el mapa que permite, haciendo uso de las flechas de dirección, cambiar de líder del equipo.



Pegadlo encima de main:

Código:
#==============================================================================
# ** Formación (Leader Select) v1.1
#------------------------------------------------------------------------------
#  Autor: Wecoc
#==============================================================================

class Game_System
  attr_accessor :leader_select
  alias leader_sel_ini initialize unless $@
  def initialize
    leader_sel_ini
    @leader_select = true
  end
end

class Scene_Map
  alias leader_sel_upd update unless $@
  def update
    if Input.trigger?(Input::Z)
      $game_system.se_play($data_system.decision_se)
      $scene = Scene_LeaderSelect.new
      return
    end
    leader_sel_upd
  end
end

class Game_Actor < Game_Battler
  attr_accessor :leadership
  alias leader_ini initialize unless $@
  def initialize(actor_id)
    leader_ini(actor_id)
    @leadership = true
  end
end

class Window_LeaderSelect < Window_Base
  def initialize(width, height)
    x = $game_player.screen_x - (width / 2)
    y = $game_player.screen_y - (height / 2)
    x = [[x, 0].max, 640 - width].min
    y = [[y, 0].max, 480 - height].min
    super(x, y, width, height)
    self.contents = Bitmap.new(width - 32, height - 32)
    @actor_sprites = []
    self.opacity = 0
    refresh
  end
 
  def dispose
    super
    @actor_sprites.each{|x| x.dispose}
    @actor_sprites = []
  end

  def draw_actor_graphic(actor, x, y, color=Color.new(0, 0, 0, 0), opacity=255)
    name = actor.character_name
    hue = actor.character_hue
    graphic = RPG::Cache.character(name, hue) rescue nil
    return if graphic.nil?
    cw = graphic.width / 4
    ch = graphic.height / 4
    bitmap = Bitmap.new(cw, ch)
    bitmap.blt(0, 0, graphic, Rect.new(0, 0, cw, ch))
    sprite = Sprite.new()
    sprite.bitmap = bitmap
    sprite.color = color
    sprite.opacity = opacity
    sprite.x = self.x + x
    sprite.y = self.y + y - 48
    sprite.z = 128
    @actor_sprites.push(sprite)
  end
  
  def refresh
    actors = $game_party.actors.clone
    actors.sort!{|a, b| a.id <=> b.id}
    color = Color.new(0, 0, 0, 0)
    disabled = Color.new(0, 0, 0, 160)
    opacity = 180
    disabled_opacity = 160
    w = self.width - 32
    h = self.height
    if actors[0] != nil
      unless actors[0].leadership
        color = disabled
        opacity = disabled_opacity
      end
      draw_actor_graphic(actors[0], w / 2, 32, color, opacity)
    end
    if actors[1] != nil
      unless actors[1].leadership
        color = disabled
        opacity = disabled_opacity
      end
      draw_actor_graphic(actors[1], 16, h / 2, color, opacity)
    end
    if actors[2] != nil
      unless actors[2].leadership
        color = disabled
        opacity = disabled_opacity
      end
      draw_actor_graphic(actors[2], w - 16, h / 2, color, opacity)
    end
    if actors[3] != nil
      unless actors[3].leadership
        color = disabled
        opacity = disabled_opacity
      end
      draw_actor_graphic(actors[3], w / 2, h - 32, color, opacity)
    end
  end
end

class Scene_LeaderSelect
  def main
    @spriteset = Spriteset_Map.new
    @spriteset.instance_eval("
      # Color de fondo de pantalla
      back_color = Color.new(0, 0, 0, 0)
      @viewport1.color = back_color
    ")
    @select_window = Window_LeaderSelect.new(160, 160)
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
    @select_window.dispose
    @spriteset.dispose
  end
  
  def update
    @select_window.update
    @spriteset.update
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Map.new
      return
    end
    if Input.trigger?(Input::UP)
      actors = $game_party.actors.clone
      actors.sort!{|a, b| a.id <=> b.id}
      if actors[0] == nil
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      if actors[0].leadership == false
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.decision_se)
      $game_party.actors.replace(actors)
      $game_player.refresh
      $scene = Scene_Map.new
      return
    end
    if Input.trigger?(Input::LEFT)
      actors = $game_party.actors.clone
      actors.sort!{|a, b| a.id <=> b.id}
      if actors[1] == nil
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      if actors[1].leadership == false
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.decision_se)
      $game_party.actors.replace(actors)
      $game_party.actors[0] = actors[1]
      $game_party.actors[1] = actors[0]
      $game_player.refresh
      $scene = Scene_Map.new
      return
    end
    if Input.trigger?(Input::RIGHT)
      actors = $game_party.actors.clone
      actors.sort!{|a, b| a.id <=> b.id}
      if actors[2] == nil
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      if actors[2].leadership == false
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.decision_se)
      $game_party.actors.replace(actors)
      $game_party.actors[0] = actors[2]
      $game_party.actors[2] = actors[0]
      $game_player.refresh
      $scene = Scene_Map.new
      return
    end
    if Input.trigger?(Input::DOWN)
      actors = $game_party.actors.clone
      actors.sort!{|a, b| a.id <=> b.id}
      if actors[3] == nil
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      if actors[3].leadership == false
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.decision_se)
      $game_party.actors.replace(actors)
      $game_party.actors[0] = actors[3]
      $game_party.actors[3] = actors[0]
      $game_player.refresh
      $scene = Scene_Map.new
      return
    end
  end
end

No requiere créditos.

Para llamarlo usad la tecla D. Para cambiarla buscad [line]if Input.trigger?(Input::Z)[/line] hacia el principio del script y lo cambiáis ahí.

Se puede activar y desactivar el script a voluntad usando $game_system.leader_select = true / false
Para que un actor no pueda ser el líder del grupo podéis usar $data_actors[id].leadership = false cambiando id por su orden en la lista de la Base de Datos.

Tened en cuenta que al igualar algo a false en las llamadas de script se congela el juego por un bug interno del maker, si ponéis ; true detrás ya no ocurre.

Configuración avanzada

1 - Cómo cambiar la distancia entre los actores a seleccionar

Éstos se sitúan en una ventana invisible, y sus coordenadas dependen del tamaño de esa ventana, así que lo único que hay que hacer es cambiar el tamaño de esa ventana.

Buscad la línea
[line]@select_window = Window_LeaderSelect.new(160, 160)[/line]

Esos dos 160 son el width y el height (ancho y alto) de esa ventana.
Para cambios de posición más avanzados habrá que retocarlos dentro del refresh de Window_LeaderSelect.

2 - Cómo cambiar la dirección de los actores mostrados

Versión 1.0:
Buscad la línea
[line]direction = 2[/line]

2 - abajo
4 - izquierda
6 - derecha
8 - arriba

Y si en vez de un número ponéis $game_player.direction se adaptará a la dirección del jugador en ese momento.

En la nueva versión esto ya no es demasiado óbvio.
En la siguiente línea
[line]bitmap.blt(0, 0, graphic, Rect.new(0, 0, cw, ch))[/line]
Ese segundo 0 del último paréntesis indica desde qué altura se obtiene el gráfico del chara, por lo que viene a ser la dirección, siendo:

Abajo - 0
Izquierda - ch
Derecha - ch * 2
Arriba - ch * 3

3 - Cómo cambiar la opacidad y color de los actores mostrados

Buscad las líneas (van seguidas)
Código:
   color = Color.new(0, 0, 0, 0)
    disabled = Color.new(0, 0, 0, 160)
    opacity = 180
    disabled_opacity = 160

El primero es el color cuando puede ser cambiado a líder
El segundo es el color cuando no puede ser cambiado a líder (en la versión 1.0 era rojizo, en la 1.1 solo es más oscuro)
El tercero es la opacidad cuando puede ser cambiado a líder
El cuarto es la opacidad cuando no puede ser cambiado a líder

4 - Cómo cambiar el color de fondo de la escena

Buscad la línea
[line]back_color = Color.new(0, 0, 0, 0)[/line]

Y la cambiáis por el color de fondo que queráis, por ejemplo (0, 0, 0, 128) para un negro translúcido

5 - Cómo hacer que los eventos y autotiles sigan funcionando

Buscad la línea
[line]@spriteset.update[/line]

Y debajo le ponéis
[line]$game_map.update[/line]

6 - (Otros)

Cualquier otra cosas que queráis modificar de la apariéncia del script me la decís y veré qué se puede hacer. En principio ésto es todo.


Última edición por Wecoc el 2018-02-20, 22:44, editado 3 veces
avatar
Wecoc
Administrador
Administrador



Créditos 12384

Gracias : 595

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Formación (Leader Select)

Mensaje por orochii el 2014-05-27, 00:05

Una cosa que podría hacer que esto funcione con Mode7 xD.
Código:
class Scene_LeaderSelect
  attr_accessor :spriteset
end

No recuerdo porqué, pero el script de Mode7 al dibujar el spriteset usa una referencia al objeto en la escena. Si no hay forma de acceder a él, pos crashea.

En fin, era por aportar algo. La idea está interesante. :3.
avatar
orochii
Reportero

0/3

Créditos 7614

Gracias : 415

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Formación (Leader Select)

Mensaje por Dianciel29 el 2015-02-03, 04:45

¿Alguna forma de que la parte de los personajes no se cancele al presionar esc? xD
avatar
Dianciel29
Iniciado
Iniciado

0/3

Créditos 10

Gracias : 2

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Formación (Leader Select)

Mensaje por Wecoc el 2015-02-03, 15:28

Busca en el script ésta parte:

Código:
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Map.new
      return
    end

y la borras o le pones # delante de cada línea
avatar
Wecoc
Administrador
Administrador



Créditos 12384

Gracias : 595

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Formación (Leader Select)

Mensaje por MarstonMuere el 2015-02-03, 21:30

Esta genial Wecoc, aunque lamentablemente a mi no me acaba de servir, puesto que con las 8 direcciones es un poco lioso ( se ven los charas mirando abajo a la izquierda y abajo xD) pero lo dicho es un gran script! Ya buscare algun apaño para ver como acoplarlo...

EDIT: Medio solucionado, he hecho un pequeño apaño xD Aunque estaria bien saber por ejemplo como podria en caso de que un personaje sea seleccionado por ejemplo, se active una fase. Por ejemplo con el actor 001 (Aluxess) como lider no pasa nada, pero con el 006 se activa una fase al seleccionarlo.

EDIT 2: Ya he conseguido, lograrlo xD
avatar
MarstonMuere
Iniciado
Iniciado

0/3

Créditos 25

Gracias : 5

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Formación (Leader Select)

Mensaje por Wecoc el 2018-02-20, 22:51

Update: ¡Ya está disponible la versión 1.1! Pues sí, otro viejo script que recupero para mejorarle algunas cosas, ya van varios.

Pongo aquí las mejoras de esta nueva versión:

- Ahora ya no requiere evento común ni interruptor para iniciarse
- Ahora se puede activar y desactivar con una variable de Game_System (ver post principal)
- Mostrado de sprites de chara optimizado (menos lag)
- Ya no edita nada de RPG::Actor ni Spriteset, por lo que es más compatible
- El script ahora es más corto


Todos vamos mejorando con el tiempo y no tendría sentido dejar todo aporte como algo permanente pudiendo mejorarle cosas unos años más tarde.
Saludos.
avatar
Wecoc
Administrador
Administrador



Créditos 12384

Gracias : 595

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Formación (Leader Select)

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.