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

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

[XP] GIF Player + Icons GIF Script

 :: RPG Maker :: Scripts

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] GIF Player + Icons GIF Script

Mensaje por Wecoc el 2014-06-29, 05:02

Hola de nuevo, hoy os traigo un script un poco especial; el GIF Player.
Seguramente algunos ya sabréis de la existéncia de scripts que permiten gifs en RPG maker XP.
El problema es que éstos usan un módulo (GIF Player) que está hecho para Ruby en general, y tiene muchas cosas innecesarias para el maker y, además, algunas limitaciones.

Es por ello que lo he modificado de pies a cabeza creando una nueva base. Aquí la tenéis:

Código:
#==============================================================================
#  [XP] GIF Player
#------------------------------------------------------------------------------
#  Version: 1.0
#  Autor: Desconocido (Adaptación del GIF Player para Ruby hecho por 灼眼的夏娜)
#  No requiere créditos.
#==============================================================================

#==============================================================================
# ** System
#==============================================================================

module System
  module_function
  WinExec = Win32API.new("kernel32", "WinExec", 'pi', 'i')
  def attrib(filename, *args)
    if args.empty?
      astr = "attrib #{filename}" # Cambié ` por "
      attri_arr = Array.new
      astr = astr.split(/:/)[0]
      astr = astr[0,astr.size - 1]
      astr.gsub!(/ /,"")
      return astr.split(//)
    else
      cmdline = ""
      for cmdchar in args
        cmdchar.downcase!
        next if cmdline.include?(cmdchar)
        if ["+a", "-a", "+r", "-r", "+s", "-s", "+h", "-h"].include?(cmdchar)
          cmdline += " " + cmdchar
        end
      end
      cmdline += " "
      result = WinExec.call("attrib #{cmdline}#{filename}", 0)
      if result < 31
        return
      end
    end
  end
end

#==============================================================================
# ** GIF
#==============================================================================

module GIF
  SIZE_GIFH = 6
  SIZE_GIFS = 7
  SIZE_GIFI = 9
  SIZE_GIFC = 6
  SIZE_GIFP = 13
  SIZE_GIFA = 12
  CODE_MASK = [0x0000,
              0x0001, 0x0003, 0x0007, 0x000f,
              0x001f, 0x003f, 0x007f, 0x00ff,
              0x01ff, 0x03ff, 0x07ff, 0x0fff]
  INC_TABLE = [8, 8, 4, 2, 0]
  BGN_TABLE = [0, 4, 2, 1, 0]

  Dir.mkdir("GIF") unless Dir["*"].include?("GIF")
  module_function

  def analyze_gif
    @old_dir = Dir.pwd
    Dir.chdir("GIF")
    @total_gif = []
    for g in Dir["*"]
      suf = g.split(/\./)
      if suf[1].is_a?(String) and suf[1].downcase == "gif"
        @total_gif.push(g)
        Dir.mkdir(suf[0]) unless Dir["*"].include?(suf[0])
      end
    end
    @total_gif.each{|file| self.readdata(file)}
    Dir.chdir(@old_dir)
    # print("全部分解完毕,点击确定退出")
    exit
  end 

  def readdata(filename)
    tmp_filename = File.basename(filename, ".*")
    unless Dir["~TEMP/#{tmp_filename}_infos.fmd"].empty?
      begin
        giffr = open("~TEMP/#{tmp_filename}_infos.fmd", "rb")
        tmp_infos = Marshal.load(giffr)
        giffr.close
        if Dir["~TEMP/#{tmp_filename}_*.png"].size == tmp_infos.total_frames
          return tmp_infos
        end
      rescue
      end
    end
    self.initial_var(filename)
    begin
      @f = open(filename, "rb")
      self.read_gifh
      self.read_gifs
      @temp = @f.read(1)[0]
      while true
        if @temp == 0x2c
          self.read_gifi
        end
        if @temp == 0x21
          self.read_gife
        end
        if @temp == 0x3b
          break
        end
        @temp = @f.read(1)[0]
      end
      @gif_infos.total_frames = @frame_count
      giffw = open("~TEMP/#{@filename}_infos.fmd", "wb")
      Marshal.dump(@gif_infos,giffw)
      giffw.close
    rescue
      return nil
    ensure
      @f.close
    end
    return @gif_infos
  end 

  def initial_var(filename)
    @gif_infos = GIFSprite::Infos.new
    @frame_count = 0
    @f = nil
    @temp = nil
    @filename = File.basename(filename, ".*")
  end 

  def read_gifh
    @gifh = @f.read(SIZE_GIFH)
    if @gifh[0, 3] != "GIF"
      raise("The file type is not a GIF!")
    end
    if @gifh[3, 3] != "87a" and @gifh[3, 3] != "89a"
      raise("This version is unsupported!")
    end
  end 

  def read_gifs
    @gifs = @f.read(SIZE_GIFS).unpack("S2C3")
    @_pal_bits = (@gifs[2] & 7) + 1
    @gif_infos.width = @gifs[0]
    @gif_infos.height = @gifs[1]
    if @gifs[2] >> 7 == 1
      @g_pal_size = 3 * (1 << @_pal_bits)
      @g_pal = @f.read(@g_pal_size).unpack("C*")
    end
  end 

  def read_gifi
    @gifi = @f.read(SIZE_GIFI).unpack("S4C")
    @gif_fd = GIFSprite::Infos::FrameData.new if @gif_fd.nil?
    @gif_fd.offset_x = @gifi[0]
    @gif_fd.offset_y = @gifi[1]
    @_width = @gifi[2]
    @_height = @gifi[3]
    @l_pal = nil
    if @gifi[4] >> 7 == 1
      @_pal_bits = (@gifi[4] & 7) + 1
      @l_pal_size = 3 * (1 << @_pal_bits)
      @l_pal = @f.read(@l_pal_size).unpack("C*")
    end
    @_lace = (@gifi[4] >> 6) & 1
    @_pal_bits = @_pal_bits == 1 ? 1 : (@_pal_bits <= 4 ? 4 : 8)
    @_width_bytes = (((@_width * @_pal_bits) + 31) >> 5) << 2
    self.read_lzw_data
    @gif_infos.frame_data[@frame_count - 1] = @gif_fd
    @gif_fd = nil
  end 

  def read_lzw_data
    lzw_mincodelen = @f.read(1)[0]
    @frame_count += 1
    image_data = ""
    blocksize = @f.read(1)[0]
    while blocksize > 0
      image_data += @f.read(blocksize)
      blocksize = @f.read(1)[0]
    end
    self.dump_imgs(image_data, lzw_mincodelen)
  end

  def read_gife
    label = @f.read(1)[0]
    case label
    when 0xf9
      @gifc = @f.read(SIZE_GIFC).unpack("C2SC2")
      @gif_fd = GIFSprite::Infos::FrameData.new 
      @gif_fd.delay_time = @gifc[2]
      @gif_fd.disposal_method = (@gifc[1] & 28) >> 2
      @_trans_index = nil
      if @gifc[1] & 1 > 0
        @_trans_index = @gifc[3]
      end
    when 0x01
      @gifp = @f.read(SIZE_GIFP).unpack("CS4C4")
      blocksize = @f.read(1)[0]
      while blocksize > 0
        @f.read(blocksize)
        blocksize = @f.read(1)[0]
      end
    when 0xfe
      blocksize = @f.read(1)[0]
      while blocksize > 0
        @f.read(blocksize)
        blocksize = @f.read(1)[0]
      end
    when 0xff
      @gifa = @f.read(SIZE_GIFA).unpack("C*")
      blocksize = @f.read(1)[0]
      while blocksize > 0
        @f.read(blocksize)
        blocksize = @f.read(1)[0]
      end
    end
  end 

  def set_pal
    @_pal = []
    if @l_pal != nil
      @_pal = @l_pal
    elsif @g_pal != nil
      @_pal = @g_pal
    else
      for i in 0...1 << @_pal_bits
        @_pal.push i,i,i
      end
    end
  end 

  def dump_imgs(image_data,lze_len)
    @image_data = image_data.unpack("C*")
    self.set_pal
    @png_data = []
    @stack = []
    @images = []
    @prefix = []
    @suffix = []
    @bitcount = @_pal_bits
    @widthcount = 0   
    @left_bits = 0x00
    @current_bits = lze_len + 0x01
    @lzw_clear = 1 << lze_len
    @lzw_eoi = @lzw_clear + 1
    @nowtablendx = @lzw_clear + 2
    @toptablendx = 1 << @current_bits
    @wdata = 0
    @wcode = 0
    @oldcode = 0xffff
    @row_num = 0
    @tempchar = 0x00
    @pass = 0x00
    @firstchar = 0
    @tempndx = 0
    self.read_byte
    while @wcode != @lzw_eoi
      if @wcode == @lzw_clear
        for i in 0...@lzw_clear
          @prefix[i] = 0xffff
          @suffix[i] = i
        end
        for i in @nowtablendx...4096
          @prefix[i] = 0xffff
          @suffix[i] = 0x00
        end
        @current_bits = lze_len + 0x01
        @nowtablendx = @lzw_clear + 2
        @toptablendx = 1 << @current_bits
        @oldcode = 0xffff
        self.read_byte
        if @wcode != @lzw_eoi
          while @prefix[@wcode] != 0xffff
            @stack.push(@suffix[@wcode])
            @wcode = @prefix[@wcode]
          end
          @stack.push(@suffix[@wcode])
          @firstchar = @stack[-1]
          self.output_data
        end
      else
        if @wcode < @nowtablendx
          @tempndx = @wcode
        else
          @tempndx = @oldcode
          @stack.push(@firstchar)
        end
        while @prefix[@tempndx] != 0xffff
          @stack.push(@suffix[@tempndx])
          @tempndx = @prefix[@tempndx]
        end
        @stack.push(@suffix[@tempndx])
        @firstchar = @stack[-1]
        @prefix[@nowtablendx] = @oldcode
        @suffix[@nowtablendx] = @firstchar
        @nowtablendx += 1
        if @nowtablendx == @toptablendx and @current_bits < 12
          @current_bits += 1
          @toptablendx = 1 << @current_bits
        end
        self.output_data
      end
      @oldcode = @wcode
      self.read_byte
    end
    Graphics.update
    self.make_png
  end

  def read_byte
    while @left_bits < @current_bits
      @next_char = @image_data.shift
      @wdata |= (@next_char << @left_bits)
      @left_bits += 0x08
    end
    @wcode = @wdata & CODE_MASK[@current_bits]
    @wdata >>= @current_bits
    @left_bits -= @current_bits
  end 

  def output_data
    while !@stack.empty?
      @tempchar |= (@stack.pop << (8 - @bitcount))
      if @bitcount == 8
        @images.push(@tempchar)
        @tempchar = 0x00
        @bitcount = @_pal_bits
      else
        @bitcount += @_pal_bits
      end
      @widthcount += 1
      if @widthcount == @_width
        if @bitcount != @_pal_bits
          @images.push(@tempchar)
          @tempchar = 0x00
          @bitcount = @_pal_bits
        end
        @png_data[@row_num] = @images.clone
        @images.clear
        if @_lace > 0
          @row_num += INC_TABLE[@pass]
          if @row_num >= @_height
            @pass += 1
            @row_num = BGN_TABLE[@pass]
          end
        else
          @row_num += 1
        end
        @widthcount = 0
      end
    end
  end 

  def make_png
    fp = open("~TEMP/#@filename" + sprintf("_%02d",@frame_count)+".png", "wb")
    fp.write(self.make_png_header)
    fp.write(self.make_png_ihdr)
    fp.write(self.make_png_plte) if @_trans_index.nil?
    fp.write(self.make_png_idat)
    fp.write(self.make_png_iend)
    fp.close
  end   

  def make_png_header
    return [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a].pack("C*")
  end 

  def make_png_ihdr
    ih_size = [13].pack("N")
    ih_sign = "IHDR"
    ih_width = [@_width].pack("N")
    ih_height = [@_height].pack("N")
    if @_trans_index != nil
      ih_bit_depth = [@_pal_bits > 8 ? 16 : 8].pack("C")
      ih_color_type = [6].pack("C")
    else
      ih_bit_depth = [@_pal_bits].pack("C")
      ih_color_type = [3].pack("C")
    end
    ih_compression_method = [0].pack("C")
    ih_filter_method = [0].pack("C")
    ih_interlace_method = [0].pack("C")
    string = ih_sign + ih_width + ih_height + ih_bit_depth + ih_color_type +
            ih_compression_method + ih_filter_method + ih_interlace_method
    ih_crc = [Zlib.crc32(string)].pack("N")
    return ih_size + string + ih_crc
  end 

  def make_png_plte
    pl_size = [@_pal.size].pack("N")
    pl_sign = "PLTE"
    pl_data = @_pal.pack("C*")
    pl_crc = [Zlib.crc32(pl_sign + pl_data)].pack("N")
    return pl_size + pl_sign + pl_data + pl_crc
  end 

  def make_png_idat
    lz_data = []
    if @_trans_index != nil
      for i in 0...@png_data.size
        lz_data.push 0
        for j in @png_data[i]
          if j == @_trans_index
            lz_data.push(@_pal[j*3], @_pal[j*3+1], @_pal[j*3+2], 0)
          else
            lz_data.push(@_pal[j*3], @_pal[j*3+1], @_pal[j*3+2], 255)
          end
        end
      end
    else
      for i in 0...@png_data.size
        lz_data.push 0
        lz_data += @png_data[i]
      end
    end
    id_data = Zlib::Deflate.deflate(lz_data.pack("C*"),9)
    id_size = [id_data.size].pack("N")
    id_sign = "IDAT"
    id_crc = [Zlib.crc32(id_sign + id_data)].pack("N")
    return id_size + id_sign + id_data + id_crc
  end 

  def make_png_iend
    ie_size = [0].pack("N")
    ie_sign = "IEND"
    ie_crc = [Zlib.crc32(ie_sign)].pack("N")
    return ie_size + ie_sign + ie_crc
  end 
end

#==============================================================================
# ** Graphics
#==============================================================================

class << Graphics
  unless method_defined? :origin_update
    alias origin_update update
    def update_critical
      Thread.critical = true
      origin_update
      Thread.critical = false
    end
    Thread.new { loop { Graphics.update_critical;  sleep(9) } }
  end 

  attr_reader :gif_sprites
   
  @@gif_sprites = Array.new
 
  def add(gs)
    @@gif_sprites << gs
  end 

  def del(gs)
    @@gif_sprites.delete(gs)
  end

  def gif_sprites
    @@gif_sprites
  end
 
  def update
    update_critical
    @@gif_sprites.each { |gs| gs.update }
  end
end

#==============================================================================
# ** GIFSprite
#==============================================================================

class GIFSprite 
  #============================================================================
  # ** GIFSprite::Infos
  #============================================================================
  class Infos

    attr_accessor :total_frames
    attr_accessor :width
    attr_accessor :height
    attr_accessor :frame_data

    def initialize
      @total_frames = 0
      @width = 0
      @height = 0
      @frame_data = Array.new
    end   
    #==========================================================================
    # * GIFSprite::Infos::FrameData
    #==========================================================================
    class FrameData

      attr_accessor :offset_x
      attr_accessor :offset_y
      attr_accessor :delay_time
      attr_accessor :disposal_method

      def initialize
        @offset_x = 0
        @offset_y = 0
        @delay_time = 0
        @disposal_method = 0
      end
    end
  end

  unless Dir["*"].include?("~TEMP")
    Dir.mkdir("~TEMP")
    System.attrib("~TEMP", "+h", "+s")
  end 

  def self.TmpFileclear
    begin
      Dir["~TEMP/*"].each { |filename| File.delete(filename) }
    rescue
    end
  end 

  def self.pre_load(filename_arr)
    filename_arr.each { |fn| GIF.readdata(fn) }
  end 

  attr_accessor :x
  attr_accessor :y
  attr_reader  :z
  attr_accessor :loop_counts
  attr_accessor :viewport 

  def initialize(viewport=nil)
    self.viewport = viewport
    Graphics.add(self)
    @gif_visible = true
    @loop_counts = -1
    @sp_arr = []
  end
 
  def bitmap
    @gif_infos
  end 

  def bitmap=(filename)
    dispose
    if filename == nil
      return
    end
    Graphics.add(self)
    @gif_infos = GIF.readdata(filename)
    if @gif_infos != nil
      @sp_arr = Array.new
      basename = File.basename(filename,".*")
      for i in 0...@gif_infos.total_frames
        sp  = Sprite.new(@viewport)
        sp.bitmap = Bitmap.new(sprintf("~TEMP/#{basename}_%02d.png",i + 1))
        if @gif_visible
          sp.visible = i == 0
        else
          sp.visible = false
        end
        sp.x = @gif_infos.frame_data[i].offset_x
        sp.y = @gif_infos.frame_data[i].offset_y
        @sp_arr << sp
      end
      @update_frame_count = 0
      @current_show_frame = 0
      @next_frame_counts =
      (@gif_infos.frame_data[0].delay_time * Graphics.frame_rate / 100)
    end
  end 

  def sprite
    return @sp_arr[@current_show_frame]
  end
 
  def sprites
    return @sp_arr
  end
 
  def visible
    return @gif_visible
  end
 
  def visible=(value)
    @gif_visible = value
  end
 
  def x
    return sprite.x
  end
 
  def x=(x)
    @sp_arr.each { |sp| sp.x = x }
  end
 
  def y
    return sprite.x
  end
 
  def y=(y)
    @sp_arr.each { |sp| sp.y = y }
  end
 
  def z
    return sprite.z
  end
 
  def z=(z)
    @sp_arr.each { |sp| sp.z = z }
  end
 
  def width
    return sprite.width
  end

  def height
    return sprite.height
  end
 
  def ox
    return sprite.ox
  end
 
  def ox=(ox)
    @sp_arr.each { |sp| sp.ox = ox }
  end
 
  def oy
    return sprite.oy
  end
 
  def oy=(oy)
    @sp_arr.each { |sp| sp.oy = oy }
  end
 
  def zoom_x
    return sprite.zoom_x
  end
 
  def zoom_x=(zoom_x)
    @sp_arr.each { |sp| sp.zoom_x = zoom_x }
  end
 
  def zoom_y
    return sprite.zoom_x
  end
 
  def zoom_y=(zoom_y)
    @sp_arr.each { |sp| sp.zoom_y = zoom_y }
  end
 
  def angle
    return sprite.angle
  end
 
  def angle=(angle)
    @sp_arr.each { |sp| sp.angle = angle }
  end
 
  def mirror
    return sprite.mirror
  end
 
  def mirror=(mirror)
    @sp_arr.each { |sp| sp.mirror = mirror }
  end
 
  def bush_depth
    return sprite.bush_depth
  end
 
  def bush_depth=(depth)
    @sp_arr.each { |sp| sp.bush_depth = depth }
  end
 
  def opacity=(value)
    @sp_arr.each { |sp| sp.opacity = value }
  end
 
  def opacity
    return sprite.opacity
  end
 
  def set_rect(nx, ny, nw, nh)
    @sp_arr.each { |sp| sp.src_rect.set(nx, ny, nw, nh) }
  end
 
  def opacity=(value)
    @sp_arr.each { |sp| sp.opacity = value }
  end
 
  def blend_type
    return sprite.blend_type
  end
 
  def blend_type=(value)
    @sp_arr.each { |sp| sp.blend_type = value }
  end
 
  def color
    return sprite.color
  end
 
  def color=(value)
    @sp_arr.each { |sp| sp.color = value }
  end
 
  def tone
    return tone.color
  end
 
  def tone=(value)
    @sp_arr.each { |sp| sp.tone = value }
  end
 
  def dispose
    Graphics.del(self)
    @sp_arr.each { |sp| sp.bitmap.dispose;  sp.dispose }
    @sp_arr.clear
    @gif_infos = nil
  end

  def update
    if @gif_infos.nil?
      return
    end
    @update_frame_count += 1
    if @update_frame_count >= @next_frame_counts
      @current_show_frame = (@current_show_frame + 1) % @gif_infos.total_frames
      case @gif_infos.frame_data[@current_show_frame - 1].disposal_method
        when 0
        when 1
        when 2
          @sp_arr[@current_show_frame - 1].visible = false
        when 3
      end
      @sp_arr[@current_show_frame].visible = true
      if @current_show_frame == 0
        @loop_counts -= 1 if @loop_counts > 0
        if @loop_counts == 0
          self.dispose
          return
        end
        for i in 0...@sp_arr.size
          @sp_arr[i].visible = i == @current_show_frame
        end
      end
      @update_frame_count = 0
      @next_frame_counts = (@gif_infos.frame_data[@current_show_frame].\
      delay_time * Graphics.frame_rate / 100)
    end
  end
end


Edito: Nueva versión arreglada. He recuperado muchas cosas del original porque me di cuenta de un fallo inesperado al mostrar más de un gif a la vez, aún así muchas de éstas cosas se pueden quitar. Al final las dejaré todas para no dar con más bugs raros. He firmado como desconocido para asegurarme de que nadie me da créditos ahora que, más que antes, mi aportación al script es quizá el 1% del total. Cualquier bug que veáis me lo decís.

Cómo funciona:

Desde siempre, para crear un sprite inanimado haces Sprite.new
Para crearlo animado, tienes que hacer GIFSprite.new
A parte de eso, no hay ninguna diferencia; todo el control que teníais sobre Sprite lo tendréis sobre GIFSprite. Así de simple xDD

Ejemplo práctico A:

El script de soporte de gifs más conocido para RPG maker XP es el Icons GIF Script, que permite usar iconos animados. El script en sí no necesita prácticamente ninguna diferencia para funcionar con éste que he puesto, solo que tenía integrado el otro GIF Player y ya no lo necesita.

Aquí os lo paso tal y como debe ir, pegadlo encima de main y debajo del [XP] GIF Player
Los créditos van a Kyo Panda
Para saber cómo funciona leed las instrucciones.

Código:
#==============================================================================
# Icons GIF Script [XP]
#------------------------------------------------------------------------------
# Permite añadir iconos en formato GIF a su proyecto.
# Requiere el script GIF Player
#------------------------------------------------------------------------------
# Grupo : Street Coders
# Sitio : http://www.mundorpgmaker.com/
# Autor : Kyo Panda
# Versión : 1.1 (31 de Agosto de 2010)
#==============================================================================

#==============================================================================
# Agradecimentos:
#------------------------------------------------------------------------------
# * 灼眼的夏娜: Autor del script GIF Player
# * CoolChampZ: Idealización del script y localización de bugs
#------------------------------------------------------------------------------
# Traducción:
#------------------------------------------------------------------------------
# * Wecoc
#==============================================================================

#==============================================================================
# Cómo usar:
#------------------------------------------------------------------------------
#
# #--------------------------------------------------------------------------
# # Instalación
# #--------------------------------------------------------------------------
#
# * Coloque el script encima de "Main" y debajo de "GIF Player"
# * Configure la secuencia de comandos en la guía de configuración de
#  a continuación (module GIF_Config)
#
#==============================================================================

#==============================================================================
# GIF_Config
#------------------------------------------------------------------------------
# Módulo de configuración del script.
#==============================================================================

module GIF_Config

# Dado que no hay ningún modo de insertar iconos en formato gif de forma
# manual, haga lo siguiente para definirlos:
#
# id_objeto => "archivo_gif",
#
# id_objeto : ID del item, arma, armadura o habilidad
# "archivo_gif" : Nombre del archivo .gif, sin su extensión, y debe estar
# localizado en la carpeta Graphics/Icons
#
# Não se esqueça de colocar a vírgula (,) ap´so a definição de cada arquivo
# gif, se não colocado, o script pode retornar erros.
 
  ITEMS = {
  # 1 => "Warrior-03-june",
  1 => "potion",
  2 => "potionB"
  }
 
  WEAPONS = {
  }
 
  ARMORS = {
  }
 
  SKILLS = {
  }

end

#==============================================================================
# Scene_Title
#==============================================================================

class Scene_Title
  alias kpngifs0001_command_new_game command_new_game
  def command_new_game
    kpngifs0001_command_new_game
    GIF_Config::ITEMS.each do |id, name|
      $data_items[id].icon_name = name if !$data_items[id].nil?
    end
    GIF_Config::WEAPONS.each do |id, name|
      $data_weapons[id].icon_name = name if !$data_weapons[id].nil?
    end
    GIF_Config::ARMORS.each do |id, name|
      $data_armors[id].icon_name = name if !$data_armors[id].nil?
    end
    GIF_Config::SKILLS.each do |id, name|
      $data_skills[id].icon_name = name if !$data_skills[id].nil?
    end
    kpngifs0001_command_new_game
  end
end

#==============================================================================
# Window_Base
#==============================================================================

class Window_Base < Window
  alias kpngifs0001_initialize initialize
  def initialize(x, y, width, height)
    @gif_sprites = Array.new
    kpngifs0001_initialize(x, y, width, height)
  end

  alias kpngifs0001_dispose dispose
  def dispose
    @gif_sprites.each{|gif| gif[0].dispose}
    kpngifs0001_dispose
  end

  alias kpngifs0001_update update
  def update
    @gif_sprites.each do |array|
      if array[1] != self.x
        array[0].x = array[0].x + self.x - array[1]
      end
      if array[2] != self.y
        array[0].y = array[0].y + self.y - array[2]
      end
      if array[3] != self.z
        array[0].z = array[0].z + self.z - array[3]
      end
    end
    kpngifs0001_update
  end

  def visible=(visible)
    super(visible)
    @gif_sprites.each{|sprite| sprite[0].visible = visible}
  end

  alias kpngifs0001_draw_item_name draw_item_name
  def draw_item_name(item, x, y)
    if item == nil
      return
    end
    if File.exist?("./Graphics/Icons/" + item.icon_name + ".gif")
      sprite = GIFSprite.new
      sprite.bitmap = "./Graphics/Icons/" + item.icon_name + ".gif"
      sprite.x = self.x + x + 16
      sprite.y = self.y + y + 16
      sprite.z = self.z + 2
      sprite.opacity = self.opacity
      @gif_sprites << [sprite, self.x, self.y, self.z]
      self.contents.font.color = normal_color
      self.contents.draw_text(x + 28, y, 212, 32, item.name)
    else
      kpngifs0001_draw_item_name(item, x, y)
    end
  end
end

#==============================================================================
# Window_Item
#==============================================================================

class Window_Item < Window_Selectable
  alias kpngifs0001_refresh refresh
  def refresh
    @gif_sprites.each{|sprite| sprite[0].dispose}
    kpngifs0001_refresh
  end

  def draw_item(index)
    item = @data[index]
    case item
    when RPG::Item
      number = $game_party.item_number(item.id)
    when RPG::Weapon
      number = $game_party.weapon_number(item.id)
    when RPG::Armor
      number = $game_party.armor_number(item.id)
    end
    if item.is_a?(RPG::Item) and $game_party.item_can_use?(item.id)
      self.contents.font.color = normal_color
    else
      self.contents.font.color = disabled_color
    end
    x = 4 + index % 2 * (288 + 32)
    y = index / 2 * 32
    rect = Rect.new(x, y, self.width / @column_max - 32, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    opacity = self.contents.font.color == normal_color ? 255 : 128
    if File.exist?("./Graphics/Icons/" + item.icon_name + ".gif")
      sprite = GIFSprite.new
      sprite.bitmap = "./Graphics/Icons/" + item.icon_name + ".gif"
      sprite.x = self.x + x + 16
      sprite.y = self.y + y + 16 + 4
      sprite.z = self.z + 2
      sprite.opacity = opacity
      @gif_sprites << [sprite, self.x, self.y, self.z]
    else
      bitmap = RPG::Cache.icon(item.icon_name)
      self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    end
    self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
    self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
    self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)
  end
end

#==============================================================================
# Window_Skill
#==============================================================================

class Window_Skill < Window_Selectable
  alias kpngifs0001_refresh refresh
  def refresh
    @gif_sprites.each{|sprite| sprite[0].dispose}
    kpngifs0001_refresh
  end

  def draw_item(index)
    skill = @data[index]
    if @actor.skill_can_use?(skill.id)
      self.contents.font.color = normal_color
    else
      self.contents.font.color = disabled_color
    end
    x = 4 + index % 2 * (288 + 32)
    y = index / 2 * 32
    rect = Rect.new(x, y, self.width / @column_max - 32, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    opacity = self.contents.font.color == normal_color ? 255 : 128
    if File.exist?("./Graphics/Icons/" + skill.icon_name + ".gif")
      sprite = GIFSprite.new
      sprite.bitmap = "./Graphics/Icons/" + skill.icon_name + ".gif"
      sprite.x = self.x + x + 16
      sprite.y = self.y + y + 16 + 4
      sprite.z = self.z + 2
      sprite.opacity = opacity
      @gif_sprites << [sprite, self.x, self.y, self.z]
    else
      bitmap = RPG::Cache.icon(skill.icon_name)
      self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    end
    self.contents.draw_text(x + 28, y, 204, 32, skill.name, 0)
    self.contents.draw_text(x + 232, y, 48, 32, skill.sp_cost.to_s, 2)
  end
end

#==============================================================================
# Window_EquipItem
#==============================================================================

class Window_EquipItem < Window_Selectable
  alias kpngifs0001_refresh refresh
  def refresh
    @gif_sprites.each{|sprite| sprite[0].dispose}
    kpngifs0001_refresh
  end

  def draw_item(index)
    item = @data[index]
    x = 4 + index % 2 * (288 + 32)
    y = index / 2 * 32
    case item
    when RPG::Weapon
      number = $game_party.weapon_number(item.id)
    when RPG::Armor
      number = $game_party.armor_number(item.id)
    end
    if File.exist?("./Graphics/Icons/" + item.icon_name + ".gif")
      sprite = GIFSprite.new
      sprite.bitmap = "./Graphics/Icons/" + item.icon_name + ".gif"
      sprite.x = self.x + x + 16
      sprite.y = self.y + y + 16 + 4
      sprite.z = self.z + 2
      sprite.opacity = self.opacity
      @gif_sprites << [sprite, self.x, self.y, self.z]
    else
      bitmap = RPG::Cache.icon(item.icon_name)
      self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24))
    end
    self.contents.font.color = normal_color
    self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
    self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
    self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)
  end
end

#==============================================================================
# Window_EquipRight
#==============================================================================

class Window_EquipRight < Window_Selectable
  alias kpngifs0001_refresh refresh
  def refresh
    @gif_sprites.each{|sprite| sprite[0].dispose}
    kpngifs0001_refresh
  end
end

#==============================================================================
# Window_ShopBuy
#==============================================================================

class Window_ShopBuy < Window_Selectable
  alias kpngifs0001_refresh refresh
  def refresh
    @gif_sprites.each{|sprite| sprite[0].dispose}
    kpngifs0001_refresh
  end

  def draw_item(index)
    item = @data[index]
    case item
    when RPG::Item
      number = $game_party.item_number(item.id)
    when RPG::Weapon
      number = $game_party.weapon_number(item.id)
    when RPG::Armor
      number = $game_party.armor_number(item.id)
    end
 
    if item.price <= $game_party.gold and number < 99
      self.contents.font.color = normal_color
    else
      self.contents.font.color = disabled_color
    end
    x = 4
    y = index * 32
    rect = Rect.new(x, y, self.width - 32, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    opacity = self.contents.font.color == normal_color ? 255 : 128
    if File.exist?("./Graphics/Icons/" + item.icon_name + ".gif")
      sprite = GIFSprite.new
      sprite.bitmap = "./Graphics/Icons/" + item.icon_name + ".gif"
      sprite.x = self.x + x + 16
      sprite.y = self.y + y + 16 + 4
      sprite.z = self.z + 2
      sprite.opacity = opacity
      @gif_sprites << [sprite, self.x, self.y, self.z]
    else
      bitmap = RPG::Cache.icon(item.icon_name)
      self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    end
    self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
    self.contents.draw_text(x + 240, y, 88, 32, item.price.to_s, 2)
  end
end

#==============================================================================
# Window_ShopStatus
#==============================================================================

class Window_ShopStatus < Window_Base
  def refresh
    self.contents.clear
    @gif_sprites.each{|sprite| sprite[0].dispose}
    if @item == nil
      return
    end
    case @item
    when RPG::Item
      number = $game_party.item_number(@item.id)
    when RPG::Weapon
      number = $game_party.weapon_number(@item.id)
    when RPG::Armor
      number = $game_party.armor_number(@item.id)
    end
    self.contents.font.color = system_color
    self.contents.draw_text(4, 0, 200, 32, "Tienes:")
    self.contents.font.color = normal_color
    self.contents.draw_text(204, 0, 32, 32, number.to_s, 2)
    if @item.is_a?(RPG::Item)
      return
    end
    for i in 0...$game_party.actors.size
      actor = $game_party.actors[i]
      if actor.equippable?(@item)
        self.contents.font.color = normal_color
      else
        self.contents.font.color = disabled_color
      end
      self.contents.draw_text(4, 64 + 64 * i, 120, 32, actor.name)
      if @item.is_a?(RPG::Weapon)
        item1 = $data_weapons[actor.weapon_id]
      elsif @item.kind == 0
        item1 = $data_armors[actor.armor1_id]
      elsif @item.kind == 1
        item1 = $data_armors[actor.armor2_id]
      elsif @item.kind == 2
        item1 = $data_armors[actor.armor3_id]
      else
        item1 = $data_armors[actor.armor4_id]
      end
      if actor.equippable?(@item)
        if @item.is_a?(RPG::Weapon)
          atk1 = item1 != nil ? item1.atk : 0
          atk2 = @item != nil ? @item.atk : 0
          change = atk2 - atk1
        end
        if @item.is_a?(RPG::Armor)
          pdef1 = item1 != nil ? item1.pdef : 0
          mdef1 = item1 != nil ? item1.mdef : 0
          pdef2 = @item != nil ? @item.pdef : 0
          mdef2 = @item != nil ? @item.mdef : 0
          change = pdef2 - pdef1 + mdef2 - mdef1
        end
        self.contents.draw_text(124, 64 + 64 * i, 112, 32,
        sprintf("%+d", change), 2)
      end
      if item1 != nil
        x = 4
        y = 64 + 64 * i + 32
        opacity = self.contents.font.color == normal_color ? 255 : 128
        if File.exist?("./Graphics/Icons/" + item1.icon_name + ".gif")
          sprite = GIFSprite.new
          sprite.bitmap = "./Graphics/Icons/" + item1.icon_name + ".gif"
          sprite.x = self.x + x + 16
          sprite.y = self.y + y + 16 + 4
          sprite.z = self.z + 2
          sprite.opacity = opacity
          @gif_sprites << [sprite, self.x, self.y, self.z]
        else
          bitmap = RPG::Cache.icon(item1.icon_name)
          self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
        end
        self.contents.draw_text(x + 28, y, 212, 32, item1.name)
      end
    end
  end
end

#==============================================================================
# Scene_Equip
#==============================================================================

class Scene_Equip
  alias kpngifs0001_update update
  def update
    @item_window1.update
    @item_window2.update
    @item_window3.update
    @item_window4.update
    @item_window5.update
    kpngifs0001_update
  end
end


Ejemplo práctico B:

Hacer que los charas vayan por gifs animados es un poco más complicado. Intentaré hacerlo posible pronto, a ver si me sale xD


Última edición por Wecoc el 2014-06-29, 17:40, editado 5 veces

Wecoc
Administrador
Administrador



Créditos 8272

Gracias : 372

Volver arriba Ir abajo

RPG Maker XP Re: [XP] GIF Player + Icons GIF Script

Mensaje por Usuario Oculto el 2014-06-29, 06:15

Ah!!! Que buena pinta tiene el script, Wecoc, ¿es posible adaptarlo para el ACE? Imagino cuan Util me serIa tal script en mi proyecto, ya que esto de los GIF me va como anillo al dedo.

Usuario Oculto
Soñador
Soñador

0/3

Créditos 631

Gracias : 14

Volver arriba Ir abajo

RPG Maker XP Re: [XP] GIF Player + Icons GIF Script

Mensaje por Wecoc el 2014-06-29, 17:59

He editado muchas veces el primer post en lo que llevo de tarde pero no os preocupéis por ello, fue por minúcias. Creé el script de gif en characters, pero hay tres problemas.

El primero es que al cargar el nuevo gif al character y reproducirlo por primera vez, se está unos frames sin verse, supongo que porque el programa tarda en cargar el gif. La verdad, no lo sé, de bien seguro que hay que pelearse un buen rato con el script para ver por qué pasa eso.

El segundo, es que me basé en GIFSprite, y eso implica que tiene (prácticamente) todo lo de Sprite pero no lo de RPG::Sprite, como lo de mostar animaciones y todo eso. Para hacerlo del todo bien habría que hacer un RPG::GIFSprite

El tercero, que funciona en mapa pero no con draw_character.

Creo que los tres tienen solución, pero no estoy capacitado como para hacerlo como es debido. Últimamente me estoy dejando demasiado la piel con eso de los scripts complicados, a éste paso al final necesitaré que un scripter como es debido me los arregle todos xD

Código:
#==============================================================================
# Character GIF Script [XP] (beta)
#------------------------------------------------------------------------------
# Autor: Wecoc
#==============================================================================

class Game_Character
 
  attr_accessor :gif_stop
  attr_accessor :gif_move
 
  alias gif_support_ini initialize unless $@
  def initialize
    gif_support_ini
    @gif_stop = ""
    @gif_move = ""
  end
 
  def running?
    @stop_count == 0
  end
end

class Spriteset_Map
  def initialize
    @viewport1 = Viewport.new(0, 0, 640, 480)
    @viewport2 = Viewport.new(0, 0, 640, 480)
    @viewport3 = Viewport.new(0, 0, 640, 480)
    @viewport2.z = 200
    @viewport3.z = 5000
    @tilemap = Tilemap.new(@viewport1)
    @tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name)
    for i in 0..6
      autotile_name = $game_map.autotile_names[i]
      @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name)
    end
    @tilemap.map_data = $game_map.data
    @tilemap.priorities = $game_map.priorities
    @panorama = Plane.new(@viewport1)
    @panorama.z = -1000
    @fog = Plane.new(@viewport1)
    @fog.z = 3000
   
    ##############################################
   
    @character_sprites = []
    for i in $game_map.events.keys.sort
      sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
      @character_sprites.push(sprite)
      gif_sprite = Sprite_Character_GIF.new(@viewport1, $game_map.events[i])
      @character_sprites.push(gif_sprite)
    end
    @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
    @character_sprites.push(Sprite_Character_GIF.new(@viewport1, $game_player))

    ##############################################
   
    @weather = RPG::Weather.new(@viewport1)
    @picture_sprites = []
    for i in 1..50
      @picture_sprites.push(Sprite_Picture.new(@viewport2,
        $game_screen.pictures[i]))
    end
    @timer_sprite = Sprite_Timer.new
    update
  end
end

class Sprite_Character < RPG::Sprite

  attr_accessor :character
  def initialize(viewport, character = nil)
    super(viewport)
    @character = character
    update
  end

  def update
    super
    if @tile_id != @character.tile_id or
      @character_name != @character.character_name or
      @character_hue != @character.character_hue
      @tile_id = @character.tile_id
      @character_name = @character.character_name
      @character_hue = @character.character_hue
      if @tile_id >= 384
        self.bitmap = RPG::Cache.tile($game_map.tileset_name,
          @tile_id, @character.character_hue)
        self.src_rect.set(0, 0, 32, 32)
        self.ox = 16
        self.oy = 32
      else
        self.bitmap = RPG::Cache.character(@character.character_name,
          @character.character_hue)
        @cw = bitmap.width / 4
        @ch = bitmap.height / 4
        self.ox = @cw / 2
        self.oy = @ch
      end
    end
    self.visible = (not @character.transparent)
    if @gif_move != @character.gif_move or @gif_stop != @character.gif_stop
      if @character.running?
        unless @character.gif_move == ""
          self.visible = false
        end
      else # jumping? // stop
        unless @character.gif_stop == ""
          self.visible = false
        end
      end
    end
    if @tile_id == 0
      sx = @character.pattern * @cw
      sy = (@character.direction - 2) / 2 * @ch
      self.src_rect.set(sx, sy, @cw, @ch)
    end
    self.x = @character.screen_x
    self.y = @character.screen_y
    self.z = @character.screen_z(@ch)
    self.opacity = @character.opacity
    self.blend_type = @character.blend_type
    self.bush_depth = @character.bush_depth
    if @character.animation_id != 0
      animation = $data_animations[@character.animation_id]
      animation(animation, true)
      @character.animation_id = 0
    end
  end
end

begin
  GIFSprite.TmpFileclear
end

class Sprite_Character_GIF < GIFSprite
  attr_accessor :character
  def initialize(viewport, character = nil)
    super(viewport)
    @character = character
    update
  end
 
  def update
    super
    if @character.tile_id > 0
      return
    end
    if @running != @character.running? or @gif_stop != @character.gif_stop or
        @gif_move != @character.gif_move
      @running = @character.running?
      @gif_stop = @character.gif_stop
      @gif_move = @character.gif_move
      if @running
        if @gif_move != ""
          self.bitmap = "./Graphics/Characters/" + @gif_move + ".gif"
        else
          self.bitmap = nil
        end
      else
        if @gif_stop != ""
          self.bitmap = "./Graphics/Characters/" + @gif_stop + ".gif"
        else
          self.bitmap = nil
        end
      end
    end
    if self.bitmap.nil?
      return
    end
    @cw = bitmap.width
    @ch = bitmap.height / 4
    self.ox = @cw / 2
    self.oy = @ch
    sx = 0
    sy = (@character.direction - 2) / 2 * @ch
    self.set_rect(sx, sy, @cw, @ch)
    self.visible = (not @character.transparent)
    self.x = @character.screen_x
    self.y = @character.screen_y
    self.z = @character.screen_z(@ch)
    self.opacity = @character.opacity
    self.blend_type = @character.blend_type
    self.bush_depth = @character.bush_depth
  #  if @character.animation_id != 0
  #    animation = $data_animations[@character.animation_id]
  #    animation(animation, true)
  #    @character.animation_id = 0
  #  end
  end
end



Cómo funciona:

Hay dos gif, uno de stop y uno de move (no me dió la gana hacer uno de jump y cuando saltas va el de stop, aunque se podría añadir, supongo)

$game_player.gif_stop = "(nombre)"
$game_map.events[1].gif_stop = "(nombre)"

$game_player.gif_move = "(nombre)"
$game_map.events[1].gif_move = "(nombre)"


Dónde (nombre) es el nombre del archivo gif (sin la extensión .gif)

Los gif tienen la misma estructura que los charas normales pero de sólo una columna y con los frames que queráis. Tampoco hay tamaño fijado ni nada de eso, no soy tan cruel xD.

Ejemplo:


Siento no haber podido hacer más.

Usuario Oculto escribió:Ah!!! Que buena pinta tiene el script, Wecoc, ¿es posible adaptarlo para el ACE? Imagino cuan Util me serIa tal script en mi proyecto, ya que esto de los GIF me va como anillo al dedo.


No daré soporte para otros makers hasta que funcione todo correctamente con XP. El primer script, que es el troncal, funcionaría bien en VX y Ace pero habría que añadirle algunas particularidades ya que los Sprite de ñestos tienen cosas que los de XP no (como todo eso del wave_amp y no sé qué más).

El resto de scripts posteados habría que modificarlos bastante más para acomodarlos a otros RPG maker.

Wecoc
Administrador
Administrador



Créditos 8272

Gracias : 372

Volver arriba Ir abajo

RPG Maker XP Re: [XP] GIF Player + Icons GIF Script

Mensaje por Mukadelheid el 2014-06-29, 18:59

Usuario Oculto escribió:Ah!!! Que buena pinta tiene el script, Wecoc, ¿es posible adaptarlo para el ACE? Imagino cuan Util me serIa tal script en mi proyecto, ya que esto de los GIF me va como anillo al dedo.


Prueba este :

http://www.rpgmakervxace.net/topic/281-gif-animation-sequences/

Aun que yo no lo usaría a no ser que supieras tanto de rgss3 como yo (unos meses de experiencia).
Esta clase de scripts son muy poco compatibles y no son amigables.

Mukadelheid
Principiante
Principiante

0/3

Créditos 331

Gracias : 28

Volver arriba Ir abajo

RPG Maker XP Re: [XP] GIF Player + Icons GIF Script

Mensaje por Usuario Oculto el 2014-06-29, 20:29

@Wecoc: Gracias, esperaré a que este listo y puedas dar soporte a otros maker.

@Mukadelheid: Ok, lo probaré, tengo algo de conocimientos de script, no mucho, pero me defiendo.

Usuario Oculto
Soñador
Soñador

0/3

Créditos 631

Gracias : 14

Volver arriba Ir abajo

RPG Maker XP Re: [XP] GIF Player + Icons GIF Script

Mensaje por Contenido patrocinado Hoy a las 00:13


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


 :: RPG Maker :: Scripts

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