赞 | 0 |
VIP | 0 |
好人卡 | 0 |
积分 | 1 |
经验 | 7049 |
最后登录 | 2013-2-16 |
在线时间 | 2 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 2 小时
- 注册时间
- 2008-12-11
- 帖子
- 126
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
一、这个flash脚本是游戏开始之前播放的,可是他会无限循环。
1.怎么弄成播放完就自动跳转标题界面?
2.怎么实现在游戏中播放?
谢谢...........................
flash脚本:- class String
-
- CP_ACP = 0
- CP_UTF8 = 65001
-
- def u2s
- m2w = Win32API.new("kernel32", "MultiByteToWideChar", "ilpipi", "i")
- w2m = Win32API.new("kernel32", "WideCharToMultiByte", "ilpipipp", "i")
-
- len = m2w.call(CP_UTF8, 0, self, -1, nil, 0)
- buf = "\0" * (len*2)
- m2w.call(CP_UTF8, 0, self, -1, buf, buf.size/2)
-
- len = w2m.call(CP_ACP, 0, buf, -1, nil, 0, nil, nil)
- ret = "\0" * len
- w2m.call(CP_ACP, 0, buf, -1, ret, ret.size, nil, nil)
-
- return ret
- end
-
- def s2u
- m2w = Win32API.new("kernel32", "MultiByteToWideChar", "ilpipi", "i")
- w2m = Win32API.new("kernel32", "WideCharToMultiByte", "ilpipipp", "i")
-
- len = m2w.call(CP_ACP, 0, self, -1, nil, 0);
- buf = "\0" * (len*2)
- m2w.call(CP_ACP, 0, self, -1, buf, buf.size/2);
-
- len = w2m.call(CP_UTF8, 0, buf, -1, nil, 0, nil, nil);
- ret = "\0" * len
- w2m.call(CP_UTF8, 0, buf, -1, ret, ret.size, nil, nil);
-
- return ret
- end
- def s2u!
- self[0, length] = s2u
- end
-
- def u2s!
- self[0, length] = u2s
- end
-
- end
- class Bitmap
-
- RtlMoveMemory_pi = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
- RtlMoveMemory_ip = Win32API.new('kernel32', 'RtlMoveMemory', 'ipi', 'i')
- def address
- buffer, ad = "xxxx", object_id * 2 + 16
- RtlMoveMemory_pi.call(buffer, ad, 4); ad = buffer.unpack("L")[0] + 8
- RtlMoveMemory_pi.call(buffer, ad, 4); ad = buffer.unpack("L")[0] + 16
- RtlMoveMemory_pi.call(buffer, ad, 4); return buffer.unpack("L")[0]
- end
-
- end
- class RMFlash
- API_NEW = Win32API.new("RMFlash", "_new", "piil", "l")
- API_UPDATE = Win32API.new("RMFlash", "_update", "l", "v")
- API_FREE = Win32API.new("RMFlash", "_free", "l", "v")
- API_PLAYING = Win32API.new("RMFlash", "_is_playing", "l", "i")
- API_PAUSE = Win32API.new("RMFlash", "_pause", "l", "v")
- API_RESUME = Win32API.new("RMFlash", "_resume", "l", "v")
- API_BACK = Win32API.new("RMFlash", "_back", "l", "v")
- API_REWIND = Win32API.new("RMFlash", "_rewind", "l", "v")
- API_FORWARD = Win32API.new("RMFlash", "_forward", "l", "v")
- API_CURFRAME = Win32API.new("RMFlash", "_cur_frame", "l", "i")
- API_TOTALFRAME = Win32API.new("RMFlash", "_total_frames", "l", "i")
- API_GOTOFRAME = Win32API.new("RMFlash", "_goto_frame", "li", "v")
- API_GETLOOP = Win32API.new("RMFlash", "_get_loop", "l", "i")
- API_SETLOOP = Win32API.new("RMFlash", "_set_loop", "li", "v")
- API_CLEARALL = Win32API.new("RMFlash", "_clear_all", "v", "v")
- API_VALID = Win32API.new("RMFlash", "_valid", "l", "i")
- API_SENDMSG = Win32API.new("RMFlash", "_send_message", "liii", "l")
-
- CUR_PATH = Dir.pwd
-
- def self.get_version
- end
- def self.clear_all
- API_CLEARALL.call
- end
-
- def self.load(name, width, height, v = nil)
- new("#{CUR_PATH}/#{name}".u2s, width, height, v)
- end
-
- attr_reader :valid
- def initialize(flash_name, flash_width, flash_height, viewport = nil)
- @sprite = Sprite.new(viewport)
- @sprite.bitmap = Bitmap.new(flash_width, flash_height)
- @value = API_NEW.call(flash_name, flash_width, flash_height, @sprite.bitmap.address)
- @loop = API_GETLOOP.call(@value) > 0
- @valid = API_VALID.call(@value) > 0
- end
- def viewport
- @sprite.viewport
- end
- def update
- API_UPDATE.call(@value)
- end
- def dispose
- API_FREE.call(@sprite.bitmap.address)
- end
- def playing?
- API_PLAYING.call(@value) > 0
- end
- def pause
- API_PAUSE.call(@value)
- end
- def resume
- API_RESUME.call(@value)
- end
- def back
- API_BACK.call(@value)
- end
- def rewind
- API_REWIND.call(@value)
- end
- def forward
- API_FORWARD.call(@value)
- end
- def current_frame
- API_CURFRAME.call(@value)
- end
- def total_frames
- API_TOTALFRAME.call(@value)
- end
- def goto_frame(goal_frame)
- API_GOTOFRAME.call(@value, goal_frame)
- end
- def x
- @sprite.x
- end
- def x=(v)
- @sprite.x = v
- end
- def y
- @sprite.y
- end
- def y=(v)
- @sprite.y = v
- end
- def z
- @sprite.z
- end
- def z=(v)
- @sprite.z = v
- end
- def width
- @sprite.bitmap.width
- end
- def height
- @sprite.bitmap.height
- end
- def loop?
- @loop
- end
- def loop=(v)
- if @loop != v
- @loop = v
- API_SETLOOP.call(@value, v)
- end
- end
-
- def msg_to_flash(msg, wParam, lParam)
- return API_SENDMSG.call(@value, msg, wParam, lParam)
- end
-
- # 例
- WM_MOUSEMOVE = 0x0200
-
- def make_long(a, b)
- return (a & 0xffff ) | (b & 0xffff) << 16
- end
-
- def on_mouse_move(x, y)
- return msg_to_flash(WM_MOUSEMOVE, 0, make_long(x, y))
- end
- end
- module Kernel
- alias origin_exit exit unless method_defined? :exit
-
- def exit(*args)
- RMFlash.clear_all
- origin_exit(*args)
- end
-
- end
- fls = RMFlash.load("71a7257935680(1).swf", 640, 480)
- while true
- Graphics.update
- Input.update
- fls.update
- break if Input.trigger?(13)
- end
- fls.dispose
- =begin
- class RMFlash
- API_NEW = Win32API.new("RMFlash", "_new", "piil", "l")
- API_UPDATE = Win32API.new("RMFlash", "_update", "l", "v")
- API_FREE = Win32API.new("RMFlash", "_free", "l", "v")
- #def self.new(*args)
- # obj = super(*args)
- # obj.send :initialize, *args
- # obj
- #end
-
- def initialize(flashname, fw, fh)
- end
- end
- RMFlash.new
- exit
- =end
-
复制代码
二、这个是播放gif图片脚本
1.怎么调整图片播放时间啊?
gif脚本:- =begin
- 脚本:【怨念产物 - GIF图片播放】
-
- 功能:在游戏中播放GIF图片 ※ 表情优先。
-
- 说明: 使用步骤:
-
- 1、使用 @gs = GIFSprite.new([viewport,[x,[,y,[loop_counts]]]])
- 创建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(/:/)[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
- #------------------------------------------------------------------------------
- # 分析处理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
-
- #--------------------------------------------------------------------------
- # ● 分解gif图片
- #--------------------------------------------------------------------------
- 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
-
- #--------------------------------------------------------------------------
- # ● 读取文件数据:成功返回@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)[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帧数据
- @gif_infos.frame_data[@frame_count - 1] = @gif_fd
- # ※ 清除帧数据
- @gif_fd = nil
- end
-
- #--------------------------------------------------------------------------
- # ● 读取图象压缩数据
- #--------------------------------------------------------------------------
- def read_lzw_data
- # 解码用
- lzw_mincodelen = @f.read(1)[0]
- # 帧数加 1
- @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
- # 不是@lzw_eoi则循环
- while @wcode != @lzw_eoi
- # @lzw_clear码
- 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
- # 生成png图
- 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 [email protected]?
- @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
-
- #--------------------------------------------------------------------------
- # ● 生成png图片
- #--------------------------------------------------------------------------
- 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
-
- #--------------------------------------------------------------------------
- # ● png头文件
- #--------------------------------------------------------------------------
- def make_png_header
- return [0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a].pack("C*")
- end
-
- #--------------------------------------------------------------------------
- # ● png信息头块
- #--------------------------------------------------------------------------
- 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
-
- #--------------------------------------------------------------------------
- # ● png调色板块
- #--------------------------------------------------------------------------
- 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
-
- #--------------------------------------------------------------------------
- # ● png数据块
- #--------------------------------------------------------------------------
- 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
-
- #--------------------------------------------------------------------------
- # ● png 结尾块
- #--------------------------------------------------------------------------
- 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
-
- #--------------------------------------------------------------------------
- # ● 添加GIF图片精灵
- #--------------------------------------------------------------------------
- def add(gs)
- @@gif_sprites << gs
- end
-
- #--------------------------------------------------------------------------
- # ● 删除GIF图片精灵
- #--------------------------------------------------------------------------
- def del(gs)
- @@gif_sprites.delete gs
- end
- #--------------------------------------------------------------------------
- # ● 更新画面
- #--------------------------------------------------------------------------
- def update
- update_critical
- @@gif_sprites.each{|gs| gs.update}
- end
-
- end
- #==============================================================================
- # ■ GIFSprite
- #------------------------------------------------------------------------------
- # GIF精灵的核心类 。
- #==============================================================================
- class GIFSprite
-
- #============================================================================
- # ● GIFSprite::Infos
- #----------------------------------------------------------------------------
- # GIF图片信息类 。
- #============================================================================
- 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
- #--------------------------------------------------------------------------
- # GIF图片每帧信息类 。
- #==========================================================================
- 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
-
- #--------------------------------------------------------------------------
- # ● 定义x=
- #--------------------------------------------------------------------------
- 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
-
- #--------------------------------------------------------------------------
- # ● 定义y=
- #--------------------------------------------------------------------------
- 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
-
- #--------------------------------------------------------------------------
- # ● 定义z=
- #--------------------------------------------------------------------------
- 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
复制代码
谢谢......... 此贴于 2009-1-1 18:13:09 被版主darkten提醒,请楼主看到后对本贴做出回应。 |
|