じ☆ve冰风 发表于 2024-4-19 15:56:45

怨念产物 - GIF图片播放

点击下载范例工程


=begin脚本:【怨念产物 - GIF图片播放】    功能:在游戏中播放GIF图片 ※ 表情优先。    说明: 使用步骤:          1、使用 @gs = GIFSprite.new(]]])         创建GIF图片对象;                   2、然后使用 @gs.bitmap = "gif_filename" ※ 包含文件夹路径;                3、可以 @gs.loop_counts = n                         设置循环次数,-1表示无限循环(默认的),0就释放图片。                   4、@gs.x = x,@gs.y = y,@gs.z = z 等设置各种坐标值。    补充:1、由于考虑的效率问题,提供了生成临时文件技术,即第一运行之后以后每次运          行会直接读取临时文件生成对象,可以使用 GIFSprite.TmpFileclear 清空临时                文件。                2、可以褂?GIFSprite.pre_load(filename_arr) 数组预加载一组图片。                  版本:v1.0          作者:灼眼的夏娜=end#==============================================================================# ■ System#------------------------------------------------------------------------------#  处理系统相关的模块 。#==============================================================================module System    #--------------------------------------------------------------------------# ● 模块函数#--------------------------------------------------------------------------module_function    #--------------------------------------------------------------------------# ● API函数声明#--------------------------------------------------------------------------WinExec = Win32API.new("kernel32","WinExec",'pi','i')#--------------------------------------------------------------------------# ● 查看或修改文件及文件夹属性#filename :文件或文件夹名字##+a -a    :添加、删除 存档 属性#+r -r    :添加、删除 只读 属性#+s -s    :添加、删除 系统 属性#+h -h    :添加、删除 隐藏 属性#--------------------------------------------------------------------------def attrib(filename,*args)    if args.empty?      astr = `attrib #{filename}`      attri_arr = Array.new      astr = astr.split(/:/)      astr = astr      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    endendend#==============================================================================# ■ GIF#------------------------------------------------------------------------------#  分析处理GIF图片的核心模块 。#==============================================================================module GIF    # 定义常量SIZE_GIFH = 6    SIZE_GIFS = 7    SIZE_GIFI = 9    SIZE_GIFC = 6    SIZE_GIFP = 13    SIZE_GIFA = 12    CODE_MASK =     INC_TABLE =     BGN_TABLE =     # 建立文件夹Dir.mkdir("GIF") unless Dir["*"].include?("GIF")    # 函数定义module_function    #--------------------------------------------------------------------------# ● 分解gif图片#--------------------------------------------------------------------------def analyze_gif    @old_dir = Dir.pwd    Dir.chdir("GIF")    @total_gif = []    for g in Dir["*"]      suf = g.split(/\./)      if suf.is_a?(String) and suf.downcase == "gif"      @total_gif.push(g)      Dir.mkdir(suf) unless Dir["*"].include? suf      end    end    @total_gif.each{|file| self.readdata(file)}    Dir.chdir(@old_dir)    p '全部分解完毕,点击确定退出'    exitend    #--------------------------------------------------------------------------# ● 读取文件数据:成功返回@gif_infos,失败返回nil#--------------------------------------------------------------------------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)      # 循环读取每个图象描述块      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)      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_infosend    #--------------------------------------------------------------------------# ● 初始化变量#--------------------------------------------------------------------------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 != "GIF"      raise "不是GIF文件!"    end    if @gifh != "87a" and @gifh != "89a"      raise "不支持的版本!"    endend    #--------------------------------------------------------------------------# ● 读取逻辑屏幕描述块#--------------------------------------------------------------------------def read_gifs    @gifs = @f.read(SIZE_GIFS).unpack("S2C3")    # 获取调色板位数    @_pal_bits = (@gifs & 7) + 1    # ※ 获取图象宽度    @gif_infos.width = @gifs    # ※ 获取图象高度    @gif_infos.height = @gifs    # 是否有全局调色板    if @gifs >> 7 == 1      # 全局调色板大小      @g_pal_size = 3 * (1 > 7 == 1      # 获取调色板位数      @_pal_bits = (@gifi & 7) + 1      # 局部调色板大小      @l_pal_size = 3 * (1 > 6) & 1    # 修正调色板位数    @_pal_bits = @_pal_bits == 1 ? 1 : (@_pal_bits > 5)0      image_data += @f.read(blocksize)      blocksize = @f.read(1)    end    # 导出图象    self.dump_imgs(image_data,lzw_mincodelen)end#--------------------------------------------------------------------------# ● 读取扩充块#--------------------------------------------------------------------------def read_gife    label = @f.read(1)    case label    when 0xf9 # 图形控制扩展块      @gifc = @f.read(SIZE_GIFC).unpack("C2SC2")      # ※ 生成帧数据对象      @gif_fd = GIFSprite::Infos::FrameData.new         # ※ 获取帧数据 延迟时间      @gif_fd.delay_time = @gifc      # ※ 获取下一帧的处理方法      @gif_fd.disposal_method = (@gifc & 28) >> 2      # 获取透明颜色      @_trans_index = nil      if @gifc & 1 > 0      @_trans_index = @gifc      end    when 0x01 # 图形说明扩展块      @gifp = @f.read(SIZE_GIFP).unpack("CS4C4")      blocksize = @f.read(1)      while blocksize > 0      @f.read(blocksize)      blocksize = @f.read(1)      end   when 0xfe # 注解说明扩展块      blocksize = @f.read(1)      while blocksize > 0      @f.read(blocksize)      blocksize = @f.read(1)      end    when 0xff # 应用程序扩展块      @gifa = @f.read(SIZE_GIFA).unpack("C*")      blocksize = @f.read(1)      while blocksize > 0      @f.read(blocksize)      blocksize = @f.read(1)      end    endend    #--------------------------------------------------------------------------# ● 设置调色板#--------------------------------------------------------------------------def set_pal    @_pal = []    if @l_pal != nil      @_pal = @l_pal    elsif @g_pal != nil      @_pal = @g_pal    else      for i in 0...1
页: [1]
查看完整版本: 怨念产物 - GIF图片播放