怨念产物 - 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]