¡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 3378 miembros registrados.
El último usuario registrado es Max003.

Nuestros miembros han publicado un total de 79744 mensajes en 11241 argumentos.
Navega con Google Chrome
[DESCARGA]

Ayuda con prioridades de imagen

 :: RPG Maker :: Ayuda RPG

Ver el tema anterior Ver el tema siguiente Ir abajo

Ayuda con prioridades de imagen

Mensaje por wemento el 2015-10-18, 13:45

Buenas a todos. Estoy usando el siguiente script, no sé si lo conoceréis:

Letra por letra:

Código:
#==============================================================================
# ** Letter by Letter Message Window
#------------------------------------------------------------------------------
# Slipknot (dubealex.com/asylum)
# Version 1.11
# September 8, 2006
#------------------------------------------------------------------------------
# Thanks to:
#  - Dubealex, for some of the features.
#  - RPG Advocate, for the hexadecimal color.
#==============================================================================

# Loads the maps' names
$data_map_infos = load_data('Data/MapInfos.rxdata')

#==============================================================================
# ** Game_Message
#------------------------------------------------------------------------------
#  This class handles the message data
#==============================================================================

class Game_Message
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :letter_by_letter, :speed, :can_skip, :height, :font,
    :sound_enable, :sound, :path, :face_rect, :fit, :skin, :nb_skin,
    :nbyo, :opacity, :shadow, :outline, :pause, :autoclose_frames
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    # Letter by letter mode
    @letter_by_letter = true
    # Lettter by letter mode's speed
    @speed = 3
    # If this option is false, the player can't skip the message
    @can_skip = true
    # Height of each line, used within the fit or above event options
    @height = 32
    # Always resize the message
    @fit = false
    # Font for the mesage text
    @font = Font.default_name
    # Sound enable
    @sound_enable = false
    # Sound for letter by letter, ['filename', vol]
    @sound = ['032-Switch01', 80]
    # Folder for the message pictures
    @path = 'Graphics/Pictures/'
    # Face rect (only the last two numbers are used)
    @face_rect = Rect.new(0, 0, 96, 96)
    # Skin for the message window, nil = default
    @skin = nil
    # Skin for the name box, nil = default
    @nb_skin = nil
    # Name box y offset
    @nbyo = 20
    # Message window's opacity
    @opacity = 160
    # Outline text
    @outline = false
    # Shadow text
    @shadow = false
    # Show or not the pause graphic
    @pause = true
    # Frames before the message autoclose
    @autoclose_frames = 8
  end
end

#==============================================================================
# ** Game_System
#------------------------------------------------------------------------------
#  Adds Game Message
#==============================================================================

class Game_System
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_reader :message
  #--------------------------------------------------------------------------
  # * Alias Listing
  #--------------------------------------------------------------------------
  alias slipknot_lblms_initialize initialize
  #--------------------------------------------------------------------------
  # * Load Database
  #--------------------------------------------------------------------------
  def initialize
    slipknot_lblms_initialize
    @message = Game_Message.new
  end
end

#==============================================================================
# ** Game_Event
#------------------------------------------------------------------------------
#  Adds a reader to the Event Name
#==============================================================================

class Game_Event < Game_Character
  #--------------------------------------------------------------------------
  # * Name
  #--------------------------------------------------------------------------
  def name
    @event.name
  end
end

#==============================================================================
# ** Spriteset_Map
#------------------------------------------------------------------------------
#  Adds a reader to the Character Sprites
#==============================================================================

class Spriteset_Map
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_reader :character_sprites
end

#==============================================================================
# ** Window_Message
#------------------------------------------------------------------------------
#  Rewrites Window_Message
#==============================================================================

class Window_Message < Window_Selectable
  #--------------------------------------------------------------------------
  # * Alias Listing
  #--------------------------------------------------------------------------
  alias slipknot_lblms_initialize initialize
  alias slipknot_lblms_terminatemessage terminate_message
  #--------------------------------------------------------------------------
  # * Initialize
  #--------------------------------------------------------------------------
  def initialize
    slipknot_lblms_initialize
    @autoclose = -1
  end
  #--------------------------------------------------------------------------
  # * Terminate Message
  #--------------------------------------------------------------------------
  def terminate_message
    slipknot_lblms_terminatemessage
    [@name_box, @picture].each do |x|
      x.dispose if x && ! x.disposed?
    end
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    self.opacity = $game_system.message_frame == 0 ? 255 : 0
    self.back_opacity = system.opacity
    unless system.fit
      self.width, self.height = 480, 160
      skin = system.skin ? system.skin : $game_system.windowskin_name
      self.windowskin = RPG::Cache.windowskin(skin)
      self.contents = Bitmap.new(448, 128)
    else
      contents.clear
      contents.font.color = normal_color
      contents.font.size = Font.default_size
    end
    contents.font.name = system.font
    @x = @y = @wait_count = indent = 0
    @fit_size, @sound = false, system.sound_enable
    @start_x = 4
    @cursor_width = [0, 0, 0, 0]
    @x = 8 if $game_temp.choice_start == 0
    return if ! (@text = $game_temp.message_text)
    @text.gsub!(/\\\\/) { "\000" }
    @text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
    @text.gsub!('\$') { $game_party.gold.to_s }
    @text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
      $game_actors[$1.to_i] ? $game_actors[$1.to_i].name : ''
    end
    @text.gsub!(/\\[Nn][Pp]\[([\d+])\]/) do
      $game_party.actors[$1.to_i] ? $game_party.actors[$1.to_i].name : ''
    end
    @text.gsub!(/\\[Cc]lass\[(\d+)\]/) do
      $game_actors[$1.to_i] ? $game_actors[$1.to_i].class_name : ''
    end
    @text.gsub!(/\\[Mm]ap/) { $data_map_infos[$game_map.map_id].name }
    gold_set = @text.gsub!(/\\[Gg]/, '')
    if @text[/\\[Nn]ame/]
      if @text.sub!(/\\[Nn]ame\[(.*?)\]/, '')
        name_text = $1
      elsif @text.sub!(/\\[Nn]ame/, '')
        name_text = $game_map.events[$game_system.map_interpreter.event_id].name
      end
    end
    if @text[/\\[Ff]ace/]
      # Left
      if @text.sub!(/\\[Ff]ace{(.+?)}/, '')
        face, face_name = 1, $1
      # Right
      elsif @text.sub!(/\\[Ff]ace\[(.+?)\]/, '')
        face, face_name = 2, $1
      end
    end
    picture = $1 if @text.sub!(/\\[Pp]ic\[(.+?)\]/, '')
    if @text[/\\[Pp]/]
      if @text.sub!(/\\[Pp]\[([-1,0-9]+)\]/, '')
        event = $1.to_i
      elsif @text.gsub!(/\\[Pp]/, '')
        event = $game_system.map_interpreter.event_id
      end
    end
    @text.gsub!('\$') { $game_party.gold.to_s }
    @text.gsub!(/\\[Cc]\[([0-9A-Fa-f #]+?)\]/) { "\001[#$1]" }
    @text.gsub!(/\\[Cc]/) { "\001[0]" }
    @text.gsub!(/\\[Ii]con{([IiWwAaSs])}\[(\d+)\]/) { change_icon($1, $2.to_i) }
    @text.gsub!(/\\[Ii]con\[(.*?)\]/) { "\002[#$1]" }
    @text.gsub!('\!') { "\003" }
    @text.gsub!('\.') { "\004" }
    @text.gsub!(/\\[Ss]\[([Xx\d]+)\]/) { "\005[#$1]" }
    @text.gsub!(/\\[Bb]/) { "\006" }
    @text.gsub!(/\\[Ii]/) { "\007" }
    @text.gsub!(/\\[Ff]\[(.*?)\]/) { "\010[#$1]" }
    @text.gsub!(/\\\%\[(\d+)\]/) { "\011[#$1]" }
    @text.gsub!('\%') { "\011" }
    if @fit_size = (event || system.fit)
      lines_size = [0, 0, 0, 0]
      save, lines = @text.clone, 0
      while (c = @text.slice!(/./m))
        if c == "\n"
          lines += 1
          break if lines == 4
          if lines >= $game_temp.choice_start
            lines_size[lines] += 16
          end
          next
        end
        lines_size[lines] += eval_text(c, true)
      end
    end
    if face
      if @fit_size
        mh = system.height
        fh = system.face_rect.height
        lines = (fh.to_f / mh.to_f).ceil if (lines * mh) < fh
        f_x = face == 2 ? 0 : lines_size.max + 16
        f_y = (lines * mh) <= fh ? 0 : (lines * mh - fh) / 2
        @start_x += system.face_rect.width + 4 if face == 2
        indent += system.face_rect.width + 8
      else
        f_x, f_y = face == 2 ? 16 : 336, 16
        @start_x += system.face_rect.width + 36 if face == 2
      end
      f_bitmap = RPG::Cache.load_bitmap(system.path, face_name)
    end
    if @fit_size
      @text = save
      self.height = lines * system.height + 32
      self.height += 32 if $game_temp.num_input_variable_id > 0
      self.width = lines_size.max + indent + 40
      windowskin = system.skin ? system.skin : $game_system.windowskin_name
      self.windowskin = RPG::Cache.windowskin(windowskin)
      self.contents = Bitmap.new(self.width - 32, self.height - 32)
      contents.font.name = system.font
    end
    contents.blt(f_x, f_y, f_bitmap, system.face_rect) if face
    if ! event
      h2 = self.height / 2
      self.y = $game_temp.in_battle ? 96 - h2 + system.nbyo :
        case $game_system.message_position
        when 0 then 96 - h2 + system.nbyo
        when 1 then 240 - h2
        when 2 then 384 - h2
        end
      self.x = 320 - self.width / 2
    else
      c = event > 0 ? $game_map.events[event] : $game_player
      mx, my = 636 - self.width, 476 - self.height
      fx = [[c.screen_x - self.width / 2, 4].max, mx].min
      sy = name_text ? system.nbyo + 4 : 4
      ch = [$scene.spriteset.character_sprites[event - 1].bitmap.height /
        4 + 4, 48].max
      fy = [[c.screen_y - (ch + self.height), sy].max, my].min
      self.x, self.y = fx, fy
    end
    if name_text
      @name_box = Window_NameBox.new(x, y - system.nbyo, name_text)
      @name_box.back.opacity = 0 if $game_system.message_frame == 1
    end
    if picture
      @picture = Sprite.new
      @picture.bitmap = RPG::Cache.load_bitmap(system.path, picture)
      @picture.x = self.x + self.width - @picture.bitmap.width
      @picture.y = self.y - @picture.bitmap.height
    end
    if gold_set
      @gold_window = Window_Gold.new
      @gold_window.x = 560 - @gold_window.width
      if $game_temp.in_battle
        @gold_window.y = 192
      else
        @gold_window.y = self.y >= 128 ? 32 : 384
      end
      @gold_window.opacity = self.opacity
      @gold_window.back_opacity = self.back_opacity
    end
  end
  #--------------------------------------------------------------------------
  # * Evaluate Text
  #--------------------------------------------------------------------------
  def eval_text(c, read = false)
    case c
    when "\000"
      c = '\\'
    when "\001"
      @text.sub!(/\[(.*?)\]/, '')
      return 0 if read
      h, c = $1, $1.to_i
      contents.font.color = h.slice!(/./) == '#' ? hex_color(h) : text_color(c)
      return
    when "\002"
      @text.sub!(/\[(.*?)\]/, '')
      return 24 if read
      y = @fit_size ? system.height * @y + (system.height - 24) / 2 : 32 * @y + 4
      contents.blt(@x + @start_x, y, RPG::Cache.icon($1.to_s), Rect.new(0, 0, 24, 24))
      @x += 24
      return unless @y >= $game_temp.choice_start
      @cursor_width[@y] += 24
      return
    when "\003"
      return 0 if read
      @stop = true
      return
    when "\004"
      return 0 if read
      @wait_count += 10
      return
    when "\005"
      @text.sub!(/\[([x\d]+)\]/, '')
      if $1.downcase == 'x'
        contents.font.size = Font.default_size
      else
        contents.font.size = [[$1.to_i, 6].max, system.height].min
      end
      return 0
    when "\006"
      contents.font.bold = (! contents.font.bold)
      return 0
    when "\007"
      contents.font.italic = (! contents.font.italic)
      return 0
    when "\010"
      @text.sub!(/\[(.*?)\]/, '')
      if $1.downcase == 'x'
        contents.font.name = system.font
      else
        contents.font.name = [$1.to_s, system.font]
      end
      return 0
    when "\011"
      @text.sub!(/\[(\d+)\]/, '')
      return 0 if read
      @autoclose = $1 ? $1.to_i : system.autoclose_frames
      return
    when "\n"
      @y += 1
      @x = 0
      @x = 8 if @y >= $game_temp.choice_start
      return
    end
    w = contents.text_size(c).width
    return w if read
    y = @fit_size ? system.height * @y : 32 * @y
    if system.outline
      color = contents.font.color.dup
      contents.font.color.set(0, 0, 0, 255)
      contents.draw_text(@x + @start_x + 1, y, w * 2, system.height, c)
      contents.draw_text(@x + @start_x, y + 1, w * 2, system.height, c)
      contents.draw_text(@x + @start_x - 1, y, w * 2, system.height, c)
      contents.draw_text(@x + @start_x, y - 1, w * 2, system.height, c)
      contents.font.color = color
      contents.draw_text(@x + @start_x, y, w * 2, system.height, c)
    elsif system.shadow
      color = contents.font.color.dup
      contents.font.color.set(0, 0, 0, 192)
      contents.draw_text(@x + @start_x + 2, y + 2, w * 2, system.height, c)
      contents.font.color = color
      contents.draw_text(@x + @start_x, y, w * 2, system.height, c)
    else
      contents.draw_text(@x + @start_x, y, w * 2, system.height, c)
    end
    @sound = (system.sound_enable && c != ' ')
    @x += w
    return if @y < $game_temp.choice_start || @y > 3
    @cursor_width[@y] += w
  end
  #--------------------------------------------------------------------------
  # * Finish
  #--------------------------------------------------------------------------
  def finish
    if temp.choice_max > 0
      @item_max, self.active, self.index = temp.choice_max, true, 0
    end
    if temp.num_input_variable_id > 0
      digits_max = temp.num_input_digits_max
      number = $game_variables[temp.num_input_variable_id]
      @input_number_window = Window_InputNumber.new(digits_max)
      input_number.number = number
      input_number.x = x + 8
      input_number.y = y + temp.num_input_start * (@fit_size ? system.height : 32)
    end
  end
  #--------------------------------------------------------------------------
  # * Database Icon
  #--------------------------------------------------------------------------
  def change_icon(option, index)
    s = case option.downcase
      when 'i'  then $data_items[index]
      when 'w' then $data_weapons[index]
      when 'a'  then $data_armors[index]
      when 's'  then $data_skills[index]
      end
    return sprintf("\002[%s]%s", s.icon_name, s.name) if s.name
  end
  #--------------------------------------------------------------------------
  # * Hexadecimal Color
  #--------------------------------------------------------------------------
  def hex_color(string)
    return normal_color if string.size != 6
    r = g = b = 0
    5.times do |i|
      s = string.slice!(/./m)
      v = hex_convert(s.downcase)
      case i
      when 0 then r += v * 16
      when 1 then r += v
      when 2 then g += v * 16
      when 3 then g += v
      when 4 then b += v * 16
      when 5 then b += v
      end
    end
    return Color.new(r, g, b)
  end
  #--------------------------------------------------------------------------
  def hex_convert(c)
    return c.to_i if c[/[0-9]/]
    case c
    when 'a' then 10
    when 'b' then 11
    when 'c' then 12
    when 'd' then 13
    when 'e' then 14
    when 'f' then 15
    end
  end
  #--------------------------------------------------------------------------
  # * Game Message
  #--------------------------------------------------------------------------
  def system() $game_system.message end
  #--------------------------------------------------------------------------
  # * Game Temp
  #--------------------------------------------------------------------------
  def temp() $game_temp end
  #--------------------------------------------------------------------------
  # * Input Number Window
  #--------------------------------------------------------------------------
  def input_number() @input_number_window end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    if @contents_showing
      super
      if @fade_in
        self.contents_opacity += 24
        if input_number
          input_number.contents_opacity += 24
        end
        @fade_in = contents_opacity != 255
        return
      end
      if @text
        if Input.trigger?(13)
          if @stop
            self.pause = @stop = false
            return
          end
          @skip = system.can_skip
        end
        return if @stop
        if @wait_count > 0 && ! @skip
          @wait_count -= 1
          return
        end
        loop do
          if (c = @text.slice!(/./m))
            eval_text(c)
            if @stop
              self.pause = system.pause
              return
            end
            if ! @skip && @sound
              Audio.se_play('Audio/SE/' + system.sound[0], system.sound[1])
              @sound = false
            end
            @wait_count += system.speed
          else
            @text = nil
            break
          end
          break if ! @skip
        end
        return if @text || @autoclose != -1
        finish
        return
      else
        if @autoclose > 0
          @autoclose -= 1
          return
        elsif @autoclose == 0
          terminate_message
          @autoclose = -1
          return
        end
      end
    end
    if input_number
      input_number.update
      if Input.trigger?(13)
        $game_system.se_play($data_system.decision_se)
        $game_variables[$game_temp.num_input_variable_id] = input_number.number
        $game_map.need_refresh = true
        input_number.dispose
        @input_number_window = nil
        terminate_message
      end
      return
    end
    if @contents_showing
      self.pause = ($game_temp.choice_max == 0) & system.pause
      if Input.trigger?(12)
        if $game_temp.choice_max > 0 && $game_temp.choice_cancel_type > 0
          $game_system.se_play($data_system.cancel_se)
          $game_temp.choice_proc.call($game_temp.choice_cancel_type - 1)
          terminate_message
        end
      end
      if Input.trigger?(13)
        if $game_temp.choice_max > 0
          $game_system.se_play($data_system.decision_se)
          $game_temp.choice_proc.call(self.index)
        end
        terminate_message
      end
      return
    end
    if ! @fade_out && $game_temp.message_text
      @contents_showing = temp.message_window_showing = true
      @stop = false
      @autoclose = -1
      @skip = (! system.letter_by_letter)
      reset_window
      refresh
      @wait_count, self.visible = 0, true
      return
    end
    return if ! visible
    @fade_out = true
    self.opacity -= 48
    if self.opacity == 0
      self.visible = @fade_out = false
      $game_temp.message_window_showing = false
    end
  end
  #--------------------------------------------------------------------------
  # * Updates Cursor Rectangle
  #--------------------------------------------------------------------------
  def update_cursor_rect
    if index >= 0
      n = $game_temp.choice_start + @index
      y = (@fit_size ? system.height : 32) * n
      cursor_rect.set(4 + @start_x, y, @cursor_width.max + 8,
        @fit_size ? system.height : 32)
    else
      cursor_rect.empty
    end
  end
end

#==============================================================================
# ** Window_NameBox
#------------------------------------------------------------------------------
#  This window is used to display the box above the message.
#==============================================================================

class Window_NameBox < Sprite
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_reader :back
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(x, y, text)
    dumb = Bitmap.new(160, 42)
    dumb.font.name = system.font
    size = dumb.text_size(text).width
    dumb.dispose
    @back = Window_Base.new(x, y, size + 12, 32)
    skin = system.nb_skin ? system.nb_skin : $game_system.windowskin_name
    @back.windowskin = RPG::Cache.windowskin(skin)
    viewport = Viewport.new(x + 6, y + 5, size, 22)
    @back.z = viewport.z = 9999
    super(viewport)
    self.bitmap = Bitmap.new(size, 22)
    bitmap.font.name = system.font
    bitmap.draw_text(0, 0, size, 22, text)
  end
  #--------------------------------------------------------------------------
  # * Game Message
  #--------------------------------------------------------------------------
  def system() $game_system.message end
  #--------------------------------------------------------------------------
  # * Dispose
  #--------------------------------------------------------------------------
  def dispose
    @back.dispose
    @back = nil
    super
  end
end

#==============================================================================
# ** Interpreter
#------------------------------------------------------------------------------
#  Adds a reader to the Event ID and Game Message
#==============================================================================

class Interpreter
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_reader :event_id
  #--------------------------------------------------------------------------
  # * Game Message
  #--------------------------------------------------------------------------
  def message
    $game_system.message
  end
end

#==============================================================================
# ** Scene_Map
#------------------------------------------------------------------------------
#  Adds a reader to the Spriteset
#==============================================================================

class Scene_Map
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_reader :spriteset
end

Consiste en un script para dar algunos comandos a los mensajes de texto en XP (como por ejemplo, añadir una cara, un nombre de quien habla, elegir la posición del cartel, colores, negrita, cursiva, etc etc...

Mi problema es que estoy usando un engine de linterna por lo que toda la pantalla a excepción del halo donde está el personaje, la estoy cubriendo con una imagen negra. Y al escribir \Pic[cara.png] en el mensaje, la cara no aparece porque se encuentra detrás de la imagen negra. ¿Qué puedo hacer para solucionar esto?

A ver si veis por ahí como cambiar la prioridad. Me da igual subirle la prioridad a las caras o bajársela a la imagen negra, mientras funcione...

En fin, mil gracias.

Salu2

EDIT: Vale, también me pasa con los mensajes del script de batalla táctica. Adjunto captura:


wemento
Iniciado
Iniciado

0/3

Créditos 57

Gracias : 5

Volver arriba Ir abajo

Re: Ayuda con prioridades de imagen

Mensaje por Wecoc el 2015-10-18, 14:45

No logro ver dónde está el problema dentro del script... ¿Seguro que es el responsable de que ocurra eso?

Yo te recomendaría, ya que es un script muy viejo (2006), usar alternativas más modernas, mejores y mucho más usadas.

Estan el UMS 1.8.0, el AMS R4 #2, el Hermes 0.4, el XRXS-MS 3 (no tengo el link) o si te gusta experimentar está el WMS 1.0 xD

Wecoc
Administrador
Administrador



Créditos 8263

Gracias : 372

Volver arriba Ir abajo

Re: Ayuda con prioridades de imagen

Mensaje por wemento el 2015-10-18, 15:09

El problema es que ya tengo la mitad del juego hecho y hay montones y montones de mensajes. Ponerme a actualizar todo eso podría ser un follón xD

En base a que la imagen se pone por delante de caras y carteles (de scripts diferentes) creo que debería buscar la forma de hacer que la antorcha no se ponga en primer plano. Pero no sé cómo. ¿Alguna idea?

wemento
Iniciado
Iniciado

0/3

Créditos 57

Gracias : 5

Volver arriba Ir abajo

Re: Ayuda con prioridades de imagen

Mensaje por wemento el 2015-12-17, 16:51

Buenas amigos, sigo un tanto perdido con este tema.

¿Alguna idea para las prioridades de las imágenes? He dejado esta parte en "pendiente", pero me gustaría poder arreglarla bien y no con una cutrez. Y ponerme a revisar todos los textos del juego puede ser un poco tedioso.

Si se os ocurre otra idea también soy todo oídos (ejemplo: otra forma de hacer el engine de la antorcha).

Gracias!

wemento
Iniciado
Iniciado

0/3

Créditos 57

Gracias : 5

Volver arriba Ir abajo

Re: Ayuda con prioridades de imagen

Mensaje por wemento el 2016-04-18, 10:08

Buenas a todos. He echado un ojo a los scripts para poder actualizar con un poco de feedback (que imagino que os hará falta).

Aquí os dejo una clase propia del script ZTBS:

Spoiler:

Código:
#==============================================================================
# [ZTBS] -Zenith Tactical Battle System- タクティカルバトルシステム
#   ~3:ZTBS メイン処理&各種メソッド~        by 水夜
#   ver1.10                          Zenith Creation (http://zenith.ifdef.jp/)
#------------------------------------------------------------------------------
# マップ上での戦略的なバトルを実現。
#==============================================================================

#==============================================================================
# ■ Scene_Map
#==============================================================================
class Scene_Map
  #--------------------------------------------------------------------------
  # ● メイン処理
  #--------------------------------------------------------------------------
  alias ztbs_main main
  def main
    # ウェイトカウント
    @wait_count = 0
    if $game_system.in_tactics and $game_system.tactics_setup and
       @help_window == nil
      # ヘルプウィンドウを作成
      @help_window = Window_Help.new
      @help_window.back_opacity = 160
      @help_window.visible = false
    end
    # 呼び戻す
    ztbs_main
    # ヘルプウィンドウを解放
    if @help_window != nil
      @help_window.dispose
      @help_window = nil
    end
    # コマンドウィンドウ解放
    dispose_command_window
    dispose_select_window
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias ztbs_update update
  def update
    if $game_system.in_tactics
      # 初期セットアップがされていない場合は実行
      if !$game_system.tactics_setup
        setup
        start_phase0
      end
      # ループ
      loop do
        # マップ、インタプリタ、プレイヤーの順に更新
        # (この更新順序は、イベントを実行する条件が満たされているときに
        #  プレイヤーに一瞬移動する機会を与えないなどの理由で重要)
        $game_map.update
        $game_system.map_interpreter.update
        $game_player.update if !$game_player.not_update and !effect?
        # システム (タイマー)、画面を更新
        $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
      # その他ウィンドウを更新
      update_windows
      # ウェイト中の場合
      if @wait_count > 0
        # ウェイトカウントを減らす
        @wait_count -= 1
        return
      end
      # エフェクト表示中の場合
      if @spriteset.effect?
        return
      end
      # ゲームオーバーの場合
      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_system.in_tactics
        # フェーズに応じて更新
        case $game_system.tactics_phase
        when 0
          update_phase0
        when 1
          update_phase1
        when 2
          update_phase2
        when 3
          update_phase3
        end
      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
    else
      ztbs_update
    end
  end
  #--------------------------------------------------------------------------
  # ● プレイヤーの場所移動
  #--------------------------------------------------------------------------
  alias ztbs_transfer_player transfer_player
  def transfer_player
    # 移動先が現在のマップと異なる場合
    if $game_map.map_id != $game_temp.player_new_map_id and $game_system.in_tactics
      # タクティクス終了処理
      end_tactics
    end
    # 呼び戻す
    ztbs_transfer_player
  end
  #--------------------------------------------------------------------------
  # ● タクティクス初期セットアップ
  #--------------------------------------------------------------------------
  def setup
    # ターンカウント初期化
    $game_system.tactics_turn = 0
    # すり抜け状態と移動速度を記憶
    $game_player.through_original = $game_player.through
    $game_player.speed_original = $game_player.move_speed
    # すり抜け ON と 速度
    $game_player.through = true
    $game_player.move_speed = ZTBS::CURSOR_SPEED
    # ヘルプウィンドウを作成
    @help_window = Window_Help.new
    @help_window.back_opacity = 160
    @help_window.visible = false
    # アクターとエネミーのセットアップ
    clear_battler
    setup_actors
    setup_enemies
    # ダメージをクリア
    for actor in $game_system.tactics_actors.values + $game_system.tactics_dead_actors.values
      actor.damage = nil
    end
    # フェーズを 0 に設定
    $game_system.tactics_phase = 0
    $game_system.tactics_step = 0
    # カーソル固定
    $game_player.not_update = true
    # 初期セットアップ完了フラグ
    $game_system.tactics_setup = true
    @select = nil
    @revival = nil
    @end_map = nil
    @level_up = nil
    @gold = nil
    @treasures = nil
  end
  #--------------------------------------------------------------------------
  # ● コマンドウィンドウ作成
  #--------------------------------------------------------------------------
  def make_command_window(index = 0)
    case $game_system.tactics_step
    when 0
      if ZTBS::POSSIBLE_SAVE
        s1 = "Personajes"
        s2 = "Fin del turno"
        s3 = "Guardar"
        s4 = "Salir"
        @command_window = Window_Command.new(170, [s1, s2, s3, s4])
      else
        s1 = "Personajes"
        s2 = "Fin del turno"
        s3 = "Salir"
        @command_window = Window_Command.new(170, [s1, s2, s3])
      end
      @command_window.x = 0
      @command_window.y = 64
    when 2
      s1 = "Mover"
      s2 = $data_system.words.attack
      s3 = $data_system.words.skill
      s4 = $data_system.words.item
      @command_window = Window_Command.new(120, [s1, s2, s3, s4])
      @command_window.x = 0
      @command_window.y = 64
    when 5
      s1 = $data_system.words.attack
      s2 = $data_system.words.skill
      s3 = $data_system.words.item
      s4 = "Esperar"
      @command_window = Window_Command.new(120, [s1, s2, s3, s4])
      @command_window.x = 0
      @command_window.y = 64
    end
    if @command_window != nil
      @command_window.back_opacity = 160
      @command_window.index = index
      if $game_player.y < 4
        @command_window.y = 416 - @command_window.height
      end
      if $game_player.x < 10
        @command_window.x = 640 - @command_window.width
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● コマンドウィンドウ解放
  #--------------------------------------------------------------------------
  def dispose_command_window
    if @command_window != nil
      @command_window.dispose
      @command_window = nil
    end
  end
  #--------------------------------------------------------------------------
  # ● セレクトウィンドウ作成
  #--------------------------------------------------------------------------
  def make_select_window(type, actor = nil, index = 0)
    case type
    # アクター一覧
    when 0
      @select_window = Window_TActors.new
    # スキル
    when 1
      @select_window = Window_TSkill.new(actor)
      if index != 0
        @select_window.index = @select_window.data.index(index)
      end
    # アイテム
    when 2
      @select_window = Window_TItem.new
      if index != 0
        @select_window.index = @select_window.data.index(index)
      end
    end
    if @select_window != nil
      @select_window.help_window = @help_window
      @select_window.back_opacity = 160
    end
  end
  #--------------------------------------------------------------------------
  # ● セレクトウィンドウ解放
  #--------------------------------------------------------------------------
  def dispose_select_window
    if @select_window != nil
      @select_window.dispose
      @select_window = nil
    end
  end
  #--------------------------------------------------------------------------
  # ● 各種ウィンドウ更新
  #--------------------------------------------------------------------------
  def update_windows
    if @command_window != nil
      @command_window.update
    end
    if @select_window != nil
      @select_window.update
    end
  end
  #--------------------------------------------------------------------------
  # ● タクティクス終了処理
  #--------------------------------------------------------------------------
  def end_tactics
    for actor in $game_system.tactics_actors.values + $game_system.tactics_dead_actors.values
      # DamageEX に対応
      if defined? XRXS19
        # 特殊効果をクリア
        actor.current_action.clear_xrxs19_special_effect
      end
      # ダメージをクリア
      actor.damage = nil
      # バトル用ステートを解除
      actor.remove_states_battle
    end
    # バトラーのクリア
    clear_battler
    # ヘルプウィンドウを解放
    if @help_window != nil
      @help_window.dispose
      @help_window = nil
    end
    # コマンドウィンドウ解放
    dispose_command_window
    dispose_select_window
    # すり抜け状態と移動速度を復帰
    $game_player.through = $game_player.through_original
    $game_player.move_speed = $game_player.speed_original
    # カーソル固定を解除
    $game_player.not_update = false
    # 初期セットアップをクリア
    $game_system.tactics_setup = false
    @select = nil
    @revival = nil
    @end_map = nil
    @level_up = nil
    @gold = nil
    @treasures = nil
  end
  #--------------------------------------------------------------------------
  # ● アクターのセットアップ
  #--------------------------------------------------------------------------
  def setup_actors
    $game_system.tactics_actors = {}
    for event in $game_map.events.values
      if event.name.include?("actor")
        actor_id = event.name.delete("actor").to_i
        if $game_actors[actor_id].dead?
          event.erase
          # アクターをハッシュに格納
          $game_system.tactics_dead_actors[event.id] = $game_actors[actor_id]
        else
          # アクターをハッシュに格納
          $game_system.tactics_actors[event.id] = $game_actors[actor_id]
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● エネミーのセットアップ
  #--------------------------------------------------------------------------
  def setup_enemies
    $game_system.tactics_enemies = {}
    for event in $game_map.events.values
      if event.name.include?("enemy")
        enemy_id = event.name.delete("enemy").to_i
        # エネミーをハッシュに格納
        $game_system.tactics_enemies[event.id] = Game_Enemy.new(0, enemy_id)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● バトラーのクリア
  #--------------------------------------------------------------------------
  def clear_battler
    $game_system.tactics_actors.clear
    $game_system.tactics_enemies.clear
    $game_system.tactics_dead_actors.clear
  end
  #--------------------------------------------------------------------------
  # ● 全員行動済み判定
  #--------------------------------------------------------------------------
  def all_acted?
    not_acted = []
    case $game_system.tactics_phase
    when 1
      for i in $game_system.tactics_actors.keys
        actor = $game_map.events[i]
        battler = $game_system.tactics_actors[i]
        if !actor.acted
          not_acted.push(battler)
        end
      end
    when 2
      for i in $game_system.tactics_enemies.keys
        enemy = $game_map.events[i]
        battler = $game_system.tactics_enemies[i]
        if !enemy.acted
          not_acted.push(battler)
        end
      end
    end
    # 全員行動した場合 1 を返す
    return 1 if not_acted.size == 0
    cant_action = 0
    for i in not_acted
      if i.restriction == 4
        cant_action += 1
      end
    end
    # 行動していないバトラーが全員「行動できない」状態の場合 2 を返す
    return 2 if cant_action == not_acted.size
    # その他の場合 0 を返す
    return 0
  end
  #--------------------------------------------------------------------------
  # ● 行動済みクリア
  #--------------------------------------------------------------------------
  def clear_acted
    for i in $game_system.tactics_actors.keys + $game_system.tactics_enemies.keys
      battler = $game_map.events[i]
      battler.acted = false
    end
  end
  #--------------------------------------------------------------------------
  # ● 消去バトラーセット
  #--------------------------------------------------------------------------
  def set_erase_battler
    @erase = []
    common_event = []
    for i in $game_system.tactics_actors.keys
      battler = $game_system.tactics_actors[i]
      # 戦闘不能か?
      if battler.dead?
        # コラプス
        $game_map.events[i].collapse = 1
        # 消去対象に入れる
        @erase.push($game_map.events[i])
        # 撃破イベントセット
        if defined? beat_event
          common_event += set_beat_event(i)
        end
      end
    end
    for i in $game_system.tactics_enemies.keys
      battler = $game_system.tactics_enemies[i]
      # 戦闘不能か?
      if battler.dead?
        # コラプス
        $game_map.events[i].collapse = 2
        # 消去対象に入れる
        @erase.push($game_map.events[i])
        # 撃破イベントセット
        if defined? beat_event
          common_event += set_beat_event(i)
        end
      end
    end
    # 撃破イベント実行
    if common_event.size > 0
      $game_system.map_interpreter.setup(common_event, 0)
    end
  end
  #--------------------------------------------------------------------------
  # ● アクター復活
  #--------------------------------------------------------------------------
  def battler_revival
    for i in $game_system.tactics_dead_actors.keys
      battler = $game_system.tactics_dead_actors[i]
      # 戦闘不能か?
      if !battler.dead?
        $game_map.events[i].cancel_erase
        $game_system.tactics_actors[i] = $game_system.tactics_dead_actors[i]
        $game_system.tactics_dead_actors.delete(i)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 勝敗判定
  #--------------------------------------------------------------------------
  def judge
    # 消去対象を消す
    if @erase != nil
      for battler in @erase
        if battler.invisible
          battler.erase
          if $game_system.tactics_actors.keys.include?(battler.id)
            $game_system.tactics_dead_actors[battler.id] = $game_system.tactics_actors[battler.id]
            $game_system.tactics_actors.delete(battler.id)
          else
            $game_system.tactics_enemies.delete(battler.id)
          end
          @battler = nil if @battler == battler
        end
      end
      @erase = nil
    end
    # エネミー全滅で勝利
    if $game_system.in_tactics and $game_system.tactics_enemies.size == 0
      start_phase3(0)
      return true
    end
    # アクター全滅で敗北
    if $game_system.in_tactics and $game_system.tactics_actors.size == 0
      start_phase3(1)
      return true
    end
    return false
  end
  #--------------------------------------------------------------------------
  # ● 終了後場所移動
  #--------------------------------------------------------------------------
  def tactics_end_transfer(parameters)
    # ゲームオーバーの場合
    if parameters[0] == 0
      $game_temp.gameover = true
      return
    end
    # 場所移動フラグをセット
    $game_temp.player_transferring = true
    # 移動先をセット
    $game_temp.player_new_map_id = parameters[0]
    $game_temp.player_new_x = parameters[1]
    $game_temp.player_new_y = parameters[2]
    # トランジション準備
    Graphics.freeze
    # 色調変更を開始
    if parameters[3]
      $game_screen.start_tone_change(Tone.new(-255, -255, -255), 0)
    end
    # トランジション処理中フラグをセット
    $game_temp.transition_processing = true
    $game_temp.transition_name = ""
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ位置調整
  #--------------------------------------------------------------------------
  def move_window
    if $game_player.y < 4
      @help_window.y = 416
    else
      @help_window.y = 0
    end
  end
  #--------------------------------------------------------------------------
  # ● 前のアクターへ
  #--------------------------------------------------------------------------
  def back_actor
    n = $game_system.tactics_actors.keys.index(@battler.id)
    if n > 0
      actor = $game_map.events[$game_system.tactics_actors.keys[n - 1]]
    else
      actor = $game_map.events[$game_system.tactics_actors.keys[$game_system.tactics_actors.keys.size - 1]]
    end
    $game_player.moveto(actor.x, actor.y)
  end
  #--------------------------------------------------------------------------
  # ● 次のアクターへ
  #--------------------------------------------------------------------------
  def next_actor
    n = $game_system.tactics_actors.keys.index(@battler.id)
    if n < $game_system.tactics_actors.keys.size - 1
      actor = $game_map.events[$game_system.tactics_actors.keys[n + 1]]
    else
      actor = $game_map.events[$game_system.tactics_actors.keys[0]]
    end
    $game_player.moveto(actor.x, actor.y)
  end
  #--------------------------------------------------------------------------
  # ● カーソル位置を戻す
  #--------------------------------------------------------------------------
  def back_cursor
    if @active_battler != nil
      # カーソル位置を戻す
      $game_player.moveto(@active_battler.x, @active_battler.y)
      get_cursor_battler
      # ヘルプウィンドウ更新
      set_battler_info
      @help_window.visible = true
    end
  end
  #--------------------------------------------------------------------------
  # ● カーソル位置のバトラー(イベント)取得
  #--------------------------------------------------------------------------
  def get_cursor_battler
    for event_id in $game_system.tactics_actors.keys + $game_system.tactics_enemies.keys
      @battler = $game_map.events[event_id]
      if @battler != nil
        if $game_player.x == @battler.x and $game_player.y == @battler.y
          break
        else
          @battler = nil
        end
      else
        @battler = nil
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● カーソルに最も近いバトラー取得
  #--------------------------------------------------------------------------
  def nearest_battler(list)
    nr = nil
    for i in list
      battler = $game_map.events[i]
      r = ($game_player.x - battler.x).abs + ($game_player.y - battler.y).abs
      if nr == nil or r < nr
        nr = r
        nearest = i
      elsif r == nr
        srand
        if rand(2) == 0
          nr = r
          nearest = i
        end
      end
    end
    return nearest
  end
  #--------------------------------------------------------------------------
  # ● 対象に最も近いポジション取得
  #--------------------------------------------------------------------------
  def nearest_position(target_pos, pos_list)
    nr = nil
    for position in pos_list
      r = (target_pos[0] - position[0]).abs + (target_pos[1] - position[1]).abs
      if nr == nil or r < nr
        nr = r
        nearest = position
      elsif r == nr
        srand
        if rand(2) == 0
          nr = r
          nearest = position
        end
      end
    end
    return nearest
  end
  #--------------------------------------------------------------------------
  # ● 対象から最も遠いポジション取得
  #--------------------------------------------------------------------------
  def far_away_position(target_pos, pos_list)
    nr = nil
    for position in pos_list
      r = (target_pos[0] - position[0]).abs + (target_pos[1] - position[1]).abs
      if nr == nil or r > nr
        nr = r
        far_away = position
      elsif r == nr
        srand
        if rand(2) == 0
          nr = r
          far_away = position
        end
      end
    end
    return far_away
  end
  #--------------------------------------------------------------------------
  # ● バトラー情報セット
  #--------------------------------------------------------------------------
  def set_battler_info
    if @battler != nil
      # ヘルプウィンドウにアクター or エネミーをセット
      if $game_system.tactics_actors.keys.include?(@battler.id)
        @help_window.set_actor($game_system.tactics_actors[@battler.id])
      elsif $game_system.tactics_enemies.keys.include?(@battler.id)
        @help_window.set_enemy($game_system.tactics_enemies[@battler.id])
      else
        @help_window.visible = false
        return
      end
      # ヘルプウィンドウを可視化
      @help_window.visible = true
    else
      @help_window.visible = false
    end
  end
  #--------------------------------------------------------------------------
  # ● バトラー情報リフレッシュ
  #--------------------------------------------------------------------------
  def refresh_battler_info
    if @battler != nil
      # ヘルプウィンドウにアクター or エネミーをセット
      if $game_system.tactics_actors.keys.include?(@battler.id)
        @help_window.refresh_actor($game_system.tactics_actors[@battler.id])
      else
        @help_window.refresh_enemy($game_system.tactics_enemies[@battler.id])
      end
      # ヘルプウィンドウを可視化
      @help_window.visible = true
    else
      @help_window.visible = false
    end
  end
  #--------------------------------------------------------------------------
  # ● エフェクト中判定
  #--------------------------------------------------------------------------
  def effect?
    for event_id in $game_system.tactics_actors.keys + $game_system.tactics_enemies.keys
      battler = $game_map.events[event_id]
      if battler.effect
        return true
      end
    end
    return false
  end
  #--------------------------------------------------------------------------
  # ● 未行動アクター処理
  #--------------------------------------------------------------------------
  def not_acted_actor_refresh
    for i in $game_system.tactics_actors.keys
      # 未行動の場合
      if !$game_map.events[i].acted
        # アクター取得
        actor = $game_system.tactics_actors[i]
        # スリップダメージ
        if actor.hp > 0 and actor.slip_damage?
          actor.slip_damage_effect
          $game_map.events[i].damage = actor.damage
          $game_map.events[i].damage_pop = true
        end
        # ステート自然解除
        actor.remove_states_auto
        # 消去対象をチェック
        set_erase_battler
        # バトラー情報リフレッシュ
        refresh_battler_info
        # 行動済みにする
        $game_map.events[i].acted = true
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 未行動エネミー処理
  #--------------------------------------------------------------------------
  def not_acted_enemy_refresh
    for i in $game_system.tactics_enemies.keys
      # 未行動の場合
      if !$game_map.events[i].acted
        # エネミー取得
        enemy = $game_system.tactics_enemies[i]
        # スリップダメージ
        if enemy.hp > 0 and enemy.slip_damage?
          enemy.slip_damage_effect
          $game_map.events[i].damage = enemy.damage
          $game_map.events[i].damage_pop = true
        end
        # ステート自然解除
        enemy.remove_states_auto
        # 消去対象をチェック
        set_erase_battler
        # バトラー情報リフレッシュ
        refresh_battler_info
        # 行動済みにする
        $game_map.events[i].acted = true
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 発動可能判定
  #--------------------------------------------------------------------------
  def possible_action?
    # 範囲内にカーソルがあるか判定
    if !in_area?($game_player.x, $game_player.y)
      return false
    end
    # 効果範囲内に対象がいるか判定
    case @attacker.current_action.kind
    when 0
      @can_attack = target_in_area($game_system.tactics_enemies.keys)
      if defined? @attacker.attack_range and @attacker.attack_range != nil
        battler_exist = @attacker.attack_range[1][3]
      else
        battler_exist = true
      end
    when 1
      skill = $data_skills[@attacker.current_action.skill_id]
      battler_exist = skill.range[1][3]
      case skill.scope
      when 0
        return false
      when 1, 2
        @can_attack = target_in_area($game_system.tactics_enemies.keys)
      when 3, 4
        @can_attack = target_in_area($game_system.tactics_actors.keys)
      when 5, 6
        return true
      end
    when 2
      item = $data_items[@attacker.current_action.item_id]
      battler_exist = item.range[1][3]
      case item.scope
      when 0
        return false
      when 1, 2
        @can_attack = target_in_area($game_system.tactics_enemies.keys)
      when 3, 4
        @can_attack = target_in_area($game_system.tactics_actors.keys)
      when 5, 6
        return true
      end
    end
    if @can_attack.size == 0
      @can_attack = nil
      return false
    end
    # カーソル位置に対象がいるか判定
    if battler_exist and @battler == nil
      return false
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● 次のエネミーへ
  #--------------------------------------------------------------------------
  def next_enemy
    # 全員行動済み判定
    case all_acted?
    when 1
      start_phase1
      return
    when 2
      # 未行動エネミー処理
      not_acted_enemy_refresh
      return
    end
    index = @enemy_index
    index += 1
    # 次の行動者設定
    if index >= $game_system.tactics_enemies.keys.size
      id = $game_system.tactics_enemies.keys[0]
      @active_battler = $game_map.events[id]
      @attacker = $game_system.tactics_enemies[id]
      @enemy_index = 0
      if @active_battler.acted
        next_enemy
      end
      $game_player.moveto(@active_battler.x, @active_battler.y)
      @battler = @active_battler
      set_battler_info
    elsif $game_system.tactics_enemies.keys[index] == nil
      @enemy_index = index
      next_enemy
    else
      id = $game_system.tactics_enemies.keys[index]
      @active_battler = $game_map.events[id]
      @attacker = $game_system.tactics_enemies[id]
      @enemy_index = index
      if @active_battler.acted
        next_enemy
      end
      $game_player.moveto(@active_battler.x, @active_battler.y)
      @battler = @active_battler
      set_battler_info
    end
  end
  #--------------------------------------------------------------------------
  # ● カーソル自動移動 (エネミーフェーズ)
  #--------------------------------------------------------------------------
  def move_cursor_auto(position)
    @enemy_move_count = ZTBS::ENEMY_THINKING if @enemy_move_count == nil
    unless $game_player.moving?
      $game_player.move_toward_position(position[0], position[1])
      if $game_player.x != position[0] or $game_player.y != position[1]
        return
      end
    end
    if $game_player.x == position[0] and $game_player.y == position[1]
      @enemy_move_count -= 1
      # カーソル固定
      $game_player.not_update = true
    end
    if @enemy_move_count == 0
      @enemy_move_count = nil
      return true
    else
      return false
    end
  end
  #--------------------------------------------------------------------------
  # ● バトラー存在判定 (エネミー用)
  #--------------------------------------------------------------------------
  def battlers_in_area(position_list, type = 0)
    battlers = []
    case type
    when 0
      n = $game_system.tactics_actors.keys
      for i in n
        battlers.push($game_map.events[i])
      end
    when 1
      n = $game_system.tactics_enemies.keys
      for i in n
        battlers.push($game_map.events[i])
      end
    when 2
      n = $game_system.tactics_actors.keys + $game_system.tactics_enemies.keys
      for i in n
        battlers.push($game_map.events[i])
      end
    end
    target_battlers = []
    for target in battlers
      for position in position_list
        if target.x == position[0] and target.y == position[1]
          target_battlers.push(target.id)
        end
      end
    end
    return target_battlers
  end
  #--------------------------------------------------------------------------
  # ● 対象ランダム選択 (エネミー用)
  #--------------------------------------------------------------------------
  def decide_target(targets)
    n = rand(targets.size)
    return targets[n]
  end
  #--------------------------------------------------------------------------
  # ● スキルターゲット判定 (エネミー用)
  #--------------------------------------------------------------------------
  def check_skill_target(skill, position_list)
    # 対象の種類取得
    battlers = []
    case skill.scope
    when 1, 2
      n = $game_system.tactics_actors.keys
      type = 0
      for i in n
        battlers.push($game_map.events[i])
      end
    when 3, 4, 7
      n = $game_system.tactics_enemies.keys
      type = 1
      for i in n
        battlers.push($game_map.events[i])
      end
    end
    if skill.range[1][3]
      on_target = true
    else
      on_target = false
    end
    # 対象エリア検索
    target_battlers = [[], [], false]
    for position in position_list
      next_position = 0
      for target in battlers
        if (target.x != position[0] or target.y != position[1]) and on_target
          next_position += 1
        end
      end
      if next_position == battlers.size
        next
      end
      target_positions = search_target_area(position[0], position[1])
      battler_count = []
      for area in target_positions
        for target in battlers
          if target.x == area[0] and target.y == area[1]          
            battler_count.push(target.id)
          end
        end
        # まず、対象が多いところを優先
        if battler_count.size > target_battlers[1].size
          target_battlers[0] = position
          target_battlers[1] = battler_count
          target_battlers[2] = on_area?(position[0], position[1], type)
        # 次に、カーソル位置にバトラーがいるところを優先
        elsif battler_count.size == target_battlers[1].size
          if on_area?(position[0], position[1], type)
            if target_battlers[2]
              if rand(2) == 0
                target_battlers[0] = position
                target_battlers[1] = battler_count
                target_battlers[2] = true
              end
            else
              target_battlers[0] = position
              target_battlers[1] = battler_count
              target_battlers[2] = true
            end
          end
        end
      end
    end
    return target_battlers
  end
  #--------------------------------------------------------------------------
  # ● 経験値など獲得
  #--------------------------------------------------------------------------
  def get_exp_etc(target)    
    @level_up = {} if @level_up == nil
    @gold = 0 if @gold == nil
    @treasures = [] if @treasures == nil
    # 経験値全員獲得の場合
    if ZTBS::EXP_ALL
      exp = target.exp
      for actor in $game_system.tactics_actors.values
        if actor == @attacker
          pre_level = actor.level
          actor.exp += exp if !actor.cant_get_exp?
          if actor.level > pre_level
            if @level_up[actor] == nil
              @level_up[actor] = [pre_level, actor.level]
            else
              @level_up[actor][1] = actor.level
            end
          end
        else
          pre_level = actor.level
          actor.exp += Integer(exp * ZTBS::C_EXP) if !actor.cant_get_exp?
          if actor.level > pre_level
            if @level_up[actor] == nil
              @level_up[actor] = [pre_level, actor.level]
            else
              @level_up[actor][1] = actor.level
            end
          end
        end
      end
    # トドメをさしたアクターのみ経験値獲得の場合
    elsif $game_system.tactics_step == 9
      if @attacker.is_a?(Game_Actor) and !@attacker.cant_get_exp?
        pre_level = @attacker.level
        @attacker.exp += target.exp
        if @attacker.level > pre_level
          if @level_up[@attacker] == nil
            @level_up[@attacker] = [pre_level, @attacker.level]
          else
            @level_up[@attacker][1] = @attacker.level
          end
        end
      end
    end
    # ゴールド獲得
    $game_party.gain_gold(target.gold)
    @gold += target.gold
    # トレジャー獲得
    if target.item_id > 0
      item = $data_items[target.item_id]
    end
    if target.weapon_id > 0
      item = $data_weapons[target.weapon_id]
    end
    if target.armor_id > 0
      item = $data_armors[target.armor_id]
    end
    if rand(100) < target.treasure_prob
      case item
      when RPG::Item
        @treasures.push(item)
        $game_party.gain_item(item.id, 1)
      when RPG::Weapon
        @treasures.push(item)
        $game_party.gain_weapon(item.id, 1)
      when RPG::Armor
        @treasures.push(item)
        $game_party.gain_armor(item.id, 1)
      end
    end
    if !defined? result_window
      @level_up = nil
      @gold = nil
      @treasures = nil
    end
  end
  #--------------------------------------------------------------------------
  # ● 基本アクション 結果作成
  #--------------------------------------------------------------------------
  def make_basic_action_result
    # 攻撃の場合
    if @attacker.current_action.basic == 0
      # DamageEX に対応
      if defined? XRXS19
        # 使用者のダメージ値を nil でリセット
        @attacker.damage = nil
        # 使用する武器の特殊効果の取得
        @attacker.set_xrxs19_special_effect(@attacker.equip_element_set)
      end
      # アニメーション ID を設定
      @animation1_id = @attacker.animation1_id
      @animation2_id = @attacker.animation2_id
      # 通常攻撃の効果を適用
      for target in @targets.values
        target.attack_effect(@attacker)
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● スキルアクション 結果作成
  #--------------------------------------------------------------------------
  def make_skill_action_result
    # スキルを取得
    @skill = $data_skills[@attacker.current_action.skill_id]
    # DamageEX に対応
    if defined? XRXS19
      # 使用者のダメージ値を nil でリセット
      @attacker.damage = nil
      # 使用するスキルの特殊効果の取得
      @attacker.set_xrxs19_special_effect(@attacker.skill_element_set(@skill))
    end
    # ヘルプウィンドウにスキル名を表示
    @help_window.set_text(@skill.name, 1)
    @help_window.visible = true
    # SP 消費
    @attacker.sp -= @skill.sp_cost
    # アニメーション ID を設定
    @animation1_id = @skill.animation1_id
    @animation2_id = @skill.animation2_id
    # スキルの効果を適用
    for target in @targets.values
      target.skill_effect(@attacker, @skill)
    end
  end
  #--------------------------------------------------------------------------
  # ● アイテムアクション 結果作成
  #--------------------------------------------------------------------------
  def make_item_action_result
    # アイテムを取得
    @item = $data_items[@attacker.current_action.item_id]
    # ヘルプウィンドウにアイテム名を表示
    @help_window.set_text(@item.name, 1)
    @help_window.visible = true
    # 消耗品の場合
    if @item.consumable
      # 使用したアイテムを 1 減らす
      $game_party.lose_item(@item.id, 1)
    end
    # アニメーション ID を設定
    @animation1_id = @item.animation1_id
    @animation2_id = @item.animation2_id
    # アイテムの効果を適用
    for target in @targets.values
      target.item_effect(@item)
    end
  end
end

Concretamente fijaos en este método, por ejemplo:

Spoiler:

Código:
def make_command_window(index = 0)
    case $game_system.tactics_step
    when 0
      if ZTBS::POSSIBLE_SAVE
        s1 = "Personajes"
        s2 = "Fin del turno"
        s3 = "Guardar"
        s4 = "Salir"
        @command_window = Window_Command.new(170, [s1, s2, s3, s4])
      else
        s1 = "Personajes"
        s2 = "Fin del turno"
        s3 = "Salir"
        @command_window = Window_Command.new(170, [s1, s2, s3])
      end
      @command_window.x = 0
      @command_window.y = 64
    when 2
      s1 = "Mover"
      s2 = $data_system.words.attack
      s3 = $data_system.words.skill
      s4 = $data_system.words.item
      @command_window = Window_Command.new(120, [s1, s2, s3, s4])
      @command_window.x = 0
      @command_window.y = 64
    when 5
      s1 = $data_system.words.attack
      s2 = $data_system.words.skill
      s3 = $data_system.words.item
      s4 = "Esperar"
      @command_window = Window_Command.new(120, [s1, s2, s3, s4])
      @command_window.x = 0
      @command_window.y = 64
    end
    if @command_window != nil
      @command_window.back_opacity = 160
      @command_window.index = index
      if $game_player.y < 4
        @command_window.y = 416 - @command_window.height
      end
      if $game_player.x < 10
        @command_window.x = 640 - @command_window.width
      end
    end
  end

Que imprime una de las ventanas para hacer un menú de combate táctico.

Si se usa una instancia de la clase Window_Command... ¿cómo es que aparece por debajo y no por encima? Las ventanas normales creadas por el propio RPG Maker sí que aparecen por encima. ¿Algún parámetro representa la prioridad?

Gracias.

----------------------------

EDIT:

Ya lo solucioné yo solito. Os cuento lo que he hecho por si a alguien le sirve en un futuro.

He creado los siguientes scripts:

Spoiler:
Código:
class Scene_Map
 
    def setup
    # ターンカウント初期化
    $game_system.tactics_turn = 0
    # すり抜け状態と移動速度を記憶
    $game_player.through_original = $game_player.through
    $game_player.speed_original = $game_player.move_speed
    # すり抜け ON と 速度
    $game_player.through = true
    $game_player.move_speed = ZTBS::CURSOR_SPEED
    # ヘルプウィンドウを作成
    @help_window = Window_Help.new
    @help_window.back_opacity = 160
    @help_window.visible = false
    @help_window.z = 2000              #Añadido
    # アクターとエネミーのセットアップ
    clear_battler
    setup_actors
    setup_enemies
    # ダメージをクリア
    for actor in $game_system.tactics_actors.values + $game_system.tactics_dead_actors.values
      actor.damage = nil
    end
    # フェーズを 0 に設定
    $game_system.tactics_phase = 0
    $game_system.tactics_step = 0
    # カーソル固定
    $game_player.not_update = true
    # 初期セットアップ完了フラグ
    $game_system.tactics_setup = true
    @select = nil
    @revival = nil
    @end_map = nil
    @level_up = nil
    @gold = nil
    @treasures = nil
  end
 
  def make_command_window(index = 0)
    case $game_system.tactics_step
    when 0
      if ZTBS::POSSIBLE_SAVE
        s1 = "Personajes"
        s2 = "Fin del turno"
        s3 = "Guardar"
        s4 = "Salir"
        @command_window = Window_Command.new(170, [s1, s2, s3, s4])
      else
        s1 = "Personajes"
        s2 = "Fin del turno"
        s3 = "Salir"
        @command_window = Window_Command.new(170, [s1, s2, s3])
      end
      @command_window.x = 0
      @command_window.y = 64
      @command_window.z = 200          #Añadido
    when 2
      s1 = "Mover"
      s2 = $data_system.words.attack
      s3 = $data_system.words.skill
      s4 = $data_system.words.item
      @command_window = Window_Command.new(120, [s1, s2, s3, s4])
      @command_window.x = 0
      @command_window.y = 64
      @command_window.z = 200          #Añadido
    when 5
      s1 = $data_system.words.attack
      s2 = $data_system.words.skill
      s3 = $data_system.words.item
      s4 = "Esperar"
      @command_window = Window_Command.new(120, [s1, s2, s3, s4])
      @command_window.x = 0
      @command_window.y = 64
      @command_window.z = 200          #Añadido
    end
    if @command_window != nil
      @command_window.back_opacity = 160
      @command_window.index = index
      @command_window.z = 200          #Añadido
      if $game_player.y < 4
        @command_window.y = 416 - @command_window.height
      end
      if $game_player.x < 10
        @command_window.x = 640 - @command_window.width
      end
    end
  end
 
  def make_select_window(type, actor = nil, index = 0)
    case type
    # アクター一覧
    when 0
      @select_window = Window_TActors.new
    # スキル
    when 1
      @select_window = Window_TSkill.new(actor)
      if index != 0
        @select_window.index = @select_window.data.index(index)
      end
    # アイテム
    when 2
      @select_window = Window_TItem.new
      if index != 0
        @select_window.index = @select_window.data.index(index)
      end
    end
    if @select_window != nil
      @select_window.help_window = @help_window
      @select_window.back_opacity = 160
      @select_window.z = 200          #Añadido
    end
  end
 
  def appear_actor_phase_picture
    @help_window.visible = false
    @count = 0
    @picture = Sprite.new
    @picture.bitmap = RPG::Cache.picture(ZTBS::ACTOR_PHASE)
    @picture.ox = @picture.bitmap.width / 2
    @picture.oy = @picture.bitmap.height / 2
    @picture.x = 320
    @picture.y = 240
    @picture.opacity = 0
    @picture.z = 200          #Añadido
    loop do
      @count += 1
      @picture.opacity += 15 if @count < 20
      @picture.opacity -= 15 if @count > 60
      break if @count == 80
      # ゲーム画面を更新
      Graphics.update
    end
    @picture.bitmap.dispose
    @picture.dispose
    @picture = nil
  end
 
  def appear_enemy_phase_picture
    @help_window.visible = false
    @count = 0
    @picture = Sprite.new
    @picture.bitmap = RPG::Cache.picture(ZTBS::ENEMY_PHASE)
    @picture.ox = @picture.bitmap.width / 2
    @picture.oy = @picture.bitmap.height / 2
    @picture.x = 320
    @picture.y = 240
    @picture.opacity = 0
    @picture.z = 200          #Añadido
    loop do
      @count += 1
      @picture.opacity += 15 if @count < 20
      @picture.opacity -= 15 if @count > 60
      break if @count == 80
      # ゲーム画面を更新
      Graphics.update
    end
    @picture.bitmap.dispose
    @picture.dispose
    @picture = nil
  end
 
end

Spoiler:
Código:
class Window_Message < Window_Selectable
 
  def refresh
    self.opacity = $game_system.message_frame == 0 ? 255 : 0
    self.back_opacity = system.opacity
    unless system.fit
      self.width, self.height = 480, 160
      skin = system.skin ? system.skin : $game_system.windowskin_name
      self.windowskin = RPG::Cache.windowskin(skin)
      self.contents = Bitmap.new(448, 128)
    else
      contents.clear
      contents.font.color = normal_color
      contents.font.size = Font.default_size
    end
    contents.font.name = system.font
    @x = @y = @wait_count = indent = 0
    @fit_size, @sound = false, system.sound_enable
    @start_x = 4
    @cursor_width = [0, 0, 0, 0]
    @x = 8 if $game_temp.choice_start == 0
    return if ! (@text = $game_temp.message_text)
    @text.gsub!(/\\\\/) { "\000" }
    @text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
    @text.gsub!('\$') { $game_party.gold.to_s }
    @text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
      $game_actors[$1.to_i] ? $game_actors[$1.to_i].name : ''
    end
    @text.gsub!(/\\[Nn][Pp]\[([\d+])\]/) do
      $game_party.actors[$1.to_i] ? $game_party.actors[$1.to_i].name : ''
    end
    @text.gsub!(/\\[Cc]lass\[(\d+)\]/) do
      $game_actors[$1.to_i] ? $game_actors[$1.to_i].class_name : ''
    end
    @text.gsub!(/\\[Mm]ap/) { $data_map_infos[$game_map.map_id].name }
    gold_set = @text.gsub!(/\\[Gg]/, '')
    if @text[/\\[Nn]ame/]
      if @text.sub!(/\\[Nn]ame\[(.*?)\]/, '')
        name_text = $1
      elsif @text.sub!(/\\[Nn]ame/, '')
        name_text = $game_map.events[$game_system.map_interpreter.event_id].name
      end
    end
    if @text[/\\[Ff]ace/]
      # Left
      if @text.sub!(/\\[Ff]ace{(.+?)}/, '')
        face, face_name = 1, $1
      # Right
      elsif @text.sub!(/\\[Ff]ace\[(.+?)\]/, '')
        face, face_name = 2, $1
      end
    end
    picture = $1 if @text.sub!(/\\[Pp]ic\[(.+?)\]/, '')
    if @text[/\\[Pp]/]
      if @text.sub!(/\\[Pp]\[([-1,0-9]+)\]/, '')
        event = $1.to_i
      elsif @text.gsub!(/\\[Pp]/, '')
        event = $game_system.map_interpreter.event_id
      end
    end
    @text.gsub!('\$') { $game_party.gold.to_s }
    @text.gsub!(/\\[Cc]\[([0-9A-Fa-f #]+?)\]/) { "\001[#$1]" }
    @text.gsub!(/\\[Cc]/) { "\001[0]" }
    @text.gsub!(/\\[Ii]con{([IiWwAaSs])}\[(\d+)\]/) { change_icon($1, $2.to_i) }
    @text.gsub!(/\\[Ii]con\[(.*?)\]/) { "\002[#$1]" }
    @text.gsub!('\!') { "\003" }
    @text.gsub!('\.') { "\004" }
    @text.gsub!(/\\[Ss]\[([Xx\d]+)\]/) { "\005[#$1]" }
    @text.gsub!(/\\[Bb]/) { "\006" }
    @text.gsub!(/\\[Ii]/) { "\007" }
    @text.gsub!(/\\[Ff]\[(.*?)\]/) { "\010[#$1]" }
    @text.gsub!(/\\\%\[(\d+)\]/) { "\011[#$1]" }
    @text.gsub!('\%') { "\011" }
    if @fit_size = (event || system.fit)
      lines_size = [0, 0, 0, 0]
      save, lines = @text.clone, 0
      while (c = @text.slice!(/./m))
        if c == "\n"
          lines += 1
          break if lines == 4
          if lines >= $game_temp.choice_start
            lines_size[lines] += 16
          end
          next
        end
        lines_size[lines] += eval_text(c, true)
      end
    end
    if face
      if @fit_size
        mh = system.height
        fh = system.face_rect.height
        lines = (fh.to_f / mh.to_f).ceil if (lines * mh) < fh
        f_x = face == 2 ? 0 : lines_size.max + 16
        f_y = (lines * mh) <= fh ? 0 : (lines * mh - fh) / 2
        @start_x += system.face_rect.width + 4 if face == 2
        indent += system.face_rect.width + 8
      else
        f_x, f_y = face == 2 ? 16 : 336, 16
        @start_x += system.face_rect.width + 36 if face == 2
      end
      f_bitmap = RPG::Cache.load_bitmap(system.path, face_name)
    end
    if @fit_size
      @text = save
      self.height = lines * system.height + 32
      self.height += 32 if $game_temp.num_input_variable_id > 0
      self.width = lines_size.max + indent + 40
      windowskin = system.skin ? system.skin : $game_system.windowskin_name
      self.windowskin = RPG::Cache.windowskin(windowskin)
      self.contents = Bitmap.new(self.width - 32, self.height - 32)
      contents.font.name = system.font
    end
    contents.blt(f_x, f_y, f_bitmap, system.face_rect) if face
    if ! event
      h2 = self.height / 2
      self.y = $game_temp.in_battle ? 96 - h2 + system.nbyo :
        case $game_system.message_position
        when 0 then 96 - h2 + system.nbyo
        when 1 then 240 - h2
        when 2 then 384 - h2
        end
      self.x = 320 - self.width / 2
    else
      c = event > 0 ? $game_map.events[event] : $game_player
      mx, my = 636 - self.width, 476 - self.height
      fx = [[c.screen_x - self.width / 2, 4].max, mx].min
      sy = name_text ? system.nbyo + 4 : 4
      ch = [$scene.spriteset.character_sprites[event - 1].bitmap.height /
        4 + 4, 48].max
      fy = [[c.screen_y - (ch + self.height), sy].max, my].min
      self.x, self.y = fx, fy
    end
    if name_text
      @name_box = Window_NameBox.new(x, y - system.nbyo, name_text)
      @name_box.back.opacity = 0 if $game_system.message_frame == 1
    end
    if picture
      @picture = Sprite.new
      @picture.bitmap = RPG::Cache.load_bitmap(system.path, picture)
      @picture.x = self.x + self.width - @picture.bitmap.width
      @picture.y = self.y - @picture.bitmap.height
      @picture.z = 200
    end
    if gold_set
      @gold_window = Window_Gold.new
      @gold_window.x = 560 - @gold_window.width
      if $game_temp.in_battle
        @gold_window.y = 192
      else
        @gold_window.y = self.y >= 128 ? 32 : 384
      end
      @gold_window.opacity = self.opacity
      @gold_window.back_opacity = self.back_opacity
    end
  end
 
end

Ambos scripts sustituyen métodos para añadir a las imágenes/ventanas (en general, a los bitmaps) una cordenada z de valor 200 (mayor que el de las imágenes del sistema, lo que hará que se muestren por delante de éstas).

Aquí el resultado:
(Problemas al subir la imagen, creo que por el proxy. La subiré cuando llegue a casa)

Simplemente hay que copiar y pegar delante del main ;)

wemento
Iniciado
Iniciado

0/3

Créditos 57

Gracias : 5

Volver arriba Ir abajo

Re: Ayuda con prioridades de imagen

Mensaje por Contenido patrocinado Hoy a las 04:38


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


 :: RPG Maker :: Ayuda RPG

Permisos de este foro:
No puedes responder a temas en este foro.