Jump to content
Rpg²S Forum

-GIF Player


fanton95
 Share

Recommended Posts

GIF Player

Descrizione

Permette di riprodurre delle GIF nel proprio gioco. Di un utilità estrema O.O



Autore

Sconosciuto

Traduzione dal portoghese by Fanton95

Supporto scripting e creazione della demo by kingartur2



Allegati



Istruzioni per l'uso

All'interno della demo



#==============================================================================# Gif Player V 1.00# Autore: Sconosciuto# Traduzione info.e istruzioni dal portoghese all'italiano da Fanton95 # Supporto scripting e creazione della demo by kingartur2# Per http://www.rpg2s.net/# 17/02/2010#============================================================================== #==============================================================================# ■ System#==============================================================================module System   module_function   #--------------------------------------------------------------------------  # ● API  #--------------------------------------------------------------------------  WinExec = Win32API.new("kernel32","WinExec",'pi','i')   def attrib(filename,*args)    if args.empty?      astr = `attrib #{filename}`      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)    p '全部分解完毕,点击确定退出'    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 "不是GIF文件!"    end    if @gifh[3,3] != "87a" and @gifh[3,3] != "89a"      raise "不支持的版本!"    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   @@gif_sprites = Array.new   def add(gs)    @@gif_sprites  gs  end   def del(gs)    @@gif_sprites.delete gs  end   def update    update_critical    @@gif_sprites.each{|gs| gs.update}  end   def gif    return @@gif_sprites  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 self.new(viewport = nil,x = 0,y = 0,loop_counts = -1)    obj = super()    obj.viewport = viewport    obj.x = x    obj.y = y    obj.loop_counts = loop_counts    Graphics.add(obj)    obj  end   def bitmap    @gif_infos  end   def bitmap=(filename)    @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))        sp.visible = i == 0        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 x=(x)    if @gif_infos.nil?      @x = 0      return    end    @x = x    for i in 0...@gif_infos.total_frames      @sp_arr[i].x = @gif_infos.frame_data[i].offset_x + @x    end  end   def y=(y)    if @gif_infos.nil?      @y = 0      return    end    @y = y    for i in 0...@gif_infos.total_frames      @sp_arr[i].y = @gif_infos.frame_data[i].offset_y + @y    end  end   def z=(z)    if @gif_infos.nil?      @z = 0      return    end    @z = z    for i in 0...@gif_infos.total_frames      @sp_arr[i].z = @z    end  end   def width    return @gif_infos.nil? ? 0 : @gif_infos.width  end   def height    return @gif_infos.nil? ? 0 : @gif_infos.height  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



Bugs e Conflitti Noti

N/A


"Oh perché dobbiamo essere così, noi? – ci domandiamo talvolta allo specchio - con questa faccia, con questo corpo? – alziamo una mano, nell'incoscienza; e il gesto ci resta sospeso. Ci pare strano che l'abbiamo fatto noi. Ci vediamo vivere. […] In certi momenti di silenzio interiore, in cui l'anima nostra si spoglia di tutte le funzioni abituali, e gli occhi nostri diventano più acuti e più penetranti, noi vediamo noi stessi nella vita, e in se stessa la vita, quasi in una modalità arida, inquietante; ci sentiamo assaltare da una strana impressione, come se, in un baleno, ci si chiarisse una realtà diversa da quella che normalmente percepiamo, una realtà vivente oltre la vista umana, fuori delle forme dell'umana ragione." [L.P.]

 

http://img43.imageshack.us/img43/4231/vgmiud3f.png

 

 

http://rpg2s.net/gif/SCContest1Oct.gif http://www.rpg2s.net/img/fablecontest3rd.png http://rpg2s.net/gif/SCContest1Oct.gif

 

RPG by forum

 

 

 

 

 

 

 

 

 

 

http://img59.imageshack.us/img59/6/av2w.png

Nome: Erech (In elfico "lancia solitaria", da er (ereb) = "solitario" e ech = "lancia")

 

Età: 19

 

Razza: Umani

 

Descrizione: Erech è un ragazzo alto e slanciato, dalla corporatura tonica e scattante. Ha capelli lunghi e violacei come gli occhi che però sono spesso coperti in parte da un elegante cappello nero. Veste con uno stile classico, una camicetta bianca sotto una giacca nera e un fiocco al collo ornato con un'immancabile piuma azzurra. Gli piace leggere e scrivere e ama tradurre testi in lingue antiche.

 

Carattere: Il ragazzo ha un carattere chiuso e introverso, è di poche parole e preferisce i fatti alle parole. Non si relaziona spesso con i coetanei o se lo fa significa che si fida cecamente della persona che ha davanti; è diffidente e tende a non raccontare fatti del suo passato, belli o brutti che siano.

 

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...