设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3194|回复: 10
打印 上一主题 下一主题

[已经解决] VA如何插入GIF动画?

[复制链接]

Lv1.梦旅人

梦石
0
星屑
905
在线时间
2 小时
注册时间
2013-9-19
帖子
4
跳转到指定楼层
1
发表于 2015-8-20 18:59:56 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
我想在游戏中插入一个标题过场以及LOGO之类的,格式是GIF,就算改成PNG也插入不进去,该怎么办?(´・ω・`)

Lv1.梦旅人

梦石
0
星屑
905
在线时间
2 小时
注册时间
2013-9-19
帖子
4
2
 楼主| 发表于 2015-8-20 19:26:19 | 只看该作者
而且我用Theora Converter.NET转码时根本找不到GIF在哪= =不知道是我失误还是什么&总之请教下各位大神|д` )

360截图20150820192440484.jpg (69.22 KB, 下载次数: 41)

360截图20150820192440484.jpg

360截图20150820192340296.jpg (42.13 KB, 下载次数: 44)

360截图20150820192340296.jpg
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
30885
在线时间
608 小时
注册时间
2014-7-18
帖子
729

开拓者

3
发表于 2015-8-20 19:29:27 | 只看该作者
本帖最后由 xjzsq 于 2015-8-20 20:48 编辑

同志!!!
你这GIF是图片的格式,只是动态图片,和视频不一样!!!


你转成png,可以通过淡入淡出配合显示图片功能实现!
动态图片是否能显示我没试过,把文件发上来看看。

点评

默认是不能显示的。推荐分成多张 png  发表于 2015-8-20 21:17

评分

参与人数 1星屑 +200 收起 理由
taroxd + 200 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
102 小时
注册时间
2011-7-13
帖子
39
4
发表于 2015-8-21 01:21:29 | 只看该作者
如果LZ需要把GIF动图弄成视频格式(例如AVI)可以试试GIF MOVIE GEAR
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
48
在线时间
784 小时
注册时间
2013-1-4
帖子
1102
5
发表于 2015-8-21 04:59:38 | 只看该作者
最好的办法 GIF分解成序列图
然后序列图播放【参考RM里的人物行走图,就是序列图播放
RM-GUI延期。。。最近被黑心老板压迫T_T
二次元少女的shitake,长着长脸,身高165,蓝色卷双马尾,FCUP,瞳色黑色,病气和御宅属性,是天才少女。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
905
在线时间
2 小时
注册时间
2013-9-19
帖子
4
6
 楼主| 发表于 2015-8-21 10:54:37 | 只看该作者
xjzsq 发表于 2015-8-20 19:29
同志!!!
你这GIF是图片的格式,只是动态图片,和视频不一样!!!

GIF插不进去的,我试过了。关键是以前我试过分解成png格式,可是只要图片一多游戏测试时就会变卡,其他人测试游戏倒是没问题,可是我这边会变卡【心塞
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
350
在线时间
301 小时
注册时间
2012-1-3
帖子
22
7
发表于 2015-8-21 11:43:58 | 只看该作者
分解成PNG之后,再弄成战斗动画,然后再设事件
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
905
在线时间
2 小时
注册时间
2013-9-19
帖子
4
8
 楼主| 发表于 2015-8-21 12:53:55 | 只看该作者
也只能分成png格式了……已解决,谢谢各位大神m(_ _)m
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

9
发表于 2015-8-21 14:24:12 | 只看该作者
貌似我来晚了,夏娜的GIF播放脚本,不知VA能否使用
RUBY 代码复制
  1. =begin
  2.  
  3.   脚本:【怨念产物 - GIF图片播放】
  4.  
  5.   功能:在游戏中播放GIF图片 ※ 表情优先。
  6.  
  7.   说明: 使用步骤:
  8.  
  9.         1、使用 @gs = GIFSprite.new([viewport,[x,[,y,[loop_counts]]]])
  10.            创建GIF图片对象;
  11.           
  12.         2、然后使用 @gs.bitmap = "gif_filename" ※ 包含文件夹路径;
  13.        
  14.         3、可以 @gs.loop_counts = n   
  15.           
  16.            设置循环次数,-1表示无限循环(默认的),0就释放图片。
  17.           
  18.         4、@gs.x = x,@gs.y = y,@gs.z = z 等设置各种坐标值。
  19.  
  20.   补充:1、由于考虑的效率问题,提供了生成临时文件技术,即第一运行之后以后每次运
  21.  
  22.         行会直接读取临时文件生成对象,可以使用 GIFSprite.TmpFileclear 清空临时
  23.        
  24.         文件。
  25.        
  26.         2、可以使用 GIFSprite.pre_load(filename_arr) 数组预加载一组图片。        
  27.        
  28.   版本:v1.0
  29.        
  30.   作者:灼眼的夏娜
  31.  
  32. =end
  33.  
  34.  
  35. #==============================================================================
  36. # ■ System
  37. #------------------------------------------------------------------------------
  38. #  处理系统相关的模块 。
  39. #==============================================================================
  40. module System
  41.  
  42.   #--------------------------------------------------------------------------
  43.   # ● 模块函数
  44.   #--------------------------------------------------------------------------
  45.   module_function
  46.  
  47.   #--------------------------------------------------------------------------
  48.   # ● API函数声明
  49.   #--------------------------------------------------------------------------
  50.   WinExec = Win32API.new("kernel32","WinExec",'pi','i')
  51.  
  52.   #--------------------------------------------------------------------------
  53.   # ● 查看或修改文件及文件夹属性
  54.   #  filename :文件或文件夹名字
  55.   #
  56.   #  +a -a    :添加、删除 存档 属性
  57.   #  +r -r    :添加、删除 只读 属性
  58.   #  +s -s    :添加、删除 系统 属性
  59.   #  +h -h    :添加、删除 隐藏 属性
  60.   #--------------------------------------------------------------------------
  61.   def attrib(filename,*args)
  62.     if args.empty?
  63.       astr = `attrib #{filename}`
  64.       attri_arr = Array.new
  65.       astr = astr.split(/:/)[0]
  66.       astr = astr[0,astr.size - 1]
  67.       astr.gsub!(/ /,"")
  68.       return astr.split(//)
  69.     else
  70.       cmdline = ""
  71.       for cmdchar in args
  72.         cmdchar.downcase!
  73.         next if cmdline.include? cmdchar
  74.         if ["+a","-a","+r","-r","+s","-s","+h","-h"].include? cmdchar
  75.           cmdline += " " + cmdchar
  76.         end
  77.       end
  78.       cmdline += " "
  79.       result = WinExec.call("attrib #{cmdline}#{filename}",0)
  80.       if result < 31
  81.         return
  82.       end
  83.     end
  84.   end
  85.  
  86. end
  87.  
  88. #==============================================================================
  89. # ■ GIF
  90. #------------------------------------------------------------------------------
  91. #  分析处理GIF图片的核心模块 。
  92. #==============================================================================
  93. module GIF
  94.  
  95.   # 定义常量
  96.   SIZE_GIFH = 6
  97.  
  98.   SIZE_GIFS = 7
  99.  
  100.   SIZE_GIFI = 9
  101.  
  102.   SIZE_GIFC = 6
  103.  
  104.   SIZE_GIFP = 13
  105.  
  106.   SIZE_GIFA = 12
  107.  
  108.   CODE_MASK = [0x0000,
  109.                0x0001,0x0003,0x0007,0x000f,
  110.                0x001f,0x003f,0x007f,0x00ff,
  111.                0x01ff,0x03ff,0x07ff,0x0fff]
  112.  
  113.   INC_TABLE = [8,8,4,2,0]
  114.  
  115.   BGN_TABLE = [0,4,2,1,0]
  116.  
  117.   # 建立文件夹
  118.   Dir.mkdir("GIF") unless Dir["*"].include?("GIF")
  119.  
  120.   # 函数定义
  121.   module_function
  122.  
  123.   #--------------------------------------------------------------------------
  124.   # ● 分解gif图片
  125.   #--------------------------------------------------------------------------
  126.   def analyze_gif
  127.     @old_dir = Dir.pwd
  128.     Dir.chdir("GIF")
  129.     @total_gif = []
  130.     for g in Dir["*"]
  131.       suf = g.split(/\./)
  132.       if suf[1].is_a?(String) and suf[1].downcase == "gif"
  133.         @total_gif.push(g)
  134.         Dir.mkdir(suf[0]) unless Dir["*"].include? suf[0]
  135.       end
  136.     end
  137.     @total_gif.each{|file| self.readdata(file)}
  138.     Dir.chdir(@old_dir)
  139.     p '全部分解完毕,点击确定退出'
  140.     exit
  141.   end
  142.  
  143.   #--------------------------------------------------------------------------
  144.   # ● 读取文件数据:成功返回@gif_infos,失败返回nil
  145.   #--------------------------------------------------------------------------
  146.   def readdata(filename)
  147.     # 检查是否有临时记忆文件
  148.     tmp_filename = File.basename(filename,".*")
  149.     unless Dir["~TEMP/#{tmp_filename}_infos.fmd"].empty?
  150.       begin
  151.         giffr = open("~TEMP/#{tmp_filename}_infos.fmd","rb")
  152.         tmp_infos = Marshal.load(giffr)
  153.         giffr.close
  154.         if Dir["~TEMP/#{tmp_filename}_*.png"].size == tmp_infos.total_frames
  155.           return tmp_infos
  156.         end
  157.       rescue
  158.       end
  159.     end
  160.     # 初始化数据
  161.     self.initial_var(filename)
  162.     # 打开文件
  163.     begin
  164.       @f = open(filename,"rb")
  165.       # 读取文件头
  166.       self.read_gifh
  167.       # 读取逻辑屏幕描述块
  168.       self.read_gifs
  169.       # 读取下一个字节
  170.       @temp = @f.read(1)[0]
  171.       # 循环读取每个图象描述块
  172.       while true
  173.         if @temp == 0x2c
  174.           # 读取图象描述块
  175.           self.read_gifi
  176.         end
  177.         if @temp == 0x21
  178.           # 读取图象扩展块
  179.           self.read_gife
  180.         end
  181.         if @temp == 0x3b
  182.           break
  183.         end
  184.         # 读取下一个字节
  185.         @temp = @f.read(1)[0]
  186.       end
  187.       # ※ 设置图象帧数
  188.       @gif_infos.total_frames = @frame_count
  189.       # ※ 写入图象分解数据
  190.       giffw = open("~TEMP/#{@filename}_infos.fmd","wb")
  191.       Marshal.dump(@gif_infos,giffw)
  192.       giffw.close
  193.     rescue
  194.       return nil
  195.     ensure
  196.       @f.close
  197.     end
  198.     return @gif_infos
  199.   end
  200.  
  201.   #--------------------------------------------------------------------------
  202.   # ● 初始化变量
  203.   #--------------------------------------------------------------------------
  204.   def initial_var(filename)
  205.     # ※ 生成图象数据对象
  206.     @gif_infos = GIFSprite::Infos.new
  207.     # 帧数计数
  208.     @frame_count = 0
  209.     @f = nil
  210.     @temp = nil
  211.     # 获取文件名
  212.     @filename = File.basename(filename,".*")
  213.   end
  214.  
  215.   #--------------------------------------------------------------------------
  216.   # ● 读取文件头
  217.   #--------------------------------------------------------------------------
  218.   def read_gifh
  219.     @gifh = @f.read(SIZE_GIFH)
  220.     if @gifh[0,3] != "GIF"
  221.       raise "不是GIF文件!"
  222.     end
  223.     if @gifh[3,3] != "87a" and @gifh[3,3] != "89a"
  224.       raise "不支持的版本!"
  225.     end
  226.   end
  227.  
  228.   #--------------------------------------------------------------------------
  229.   # ● 读取逻辑屏幕描述块
  230.   #--------------------------------------------------------------------------
  231.   def read_gifs
  232.     @gifs = @f.read(SIZE_GIFS).unpack("S2C3")
  233.     # 获取调色板位数
  234.     @_pal_bits = (@gifs[2] & 7) + 1
  235.     # ※ 获取图象宽度
  236.     @gif_infos.width = @gifs[0]
  237.     # ※ 获取图象高度
  238.     @gif_infos.height = @gifs[1]
  239.     # 是否有全局调色板
  240.     if @gifs[2] >> 7 == 1
  241.       # 全局调色板大小
  242.       @g_pal_size = 3 * (1 << @_pal_bits)
  243.       # 读取全局调色板数据
  244.       @g_pal = @f.read(@g_pal_size).unpack("C*")
  245.     end
  246.   end
  247.  
  248.   #--------------------------------------------------------------------------
  249.   # ● 读取图象描述块
  250.   #--------------------------------------------------------------------------
  251.   def read_gifi
  252.     # 读取图象描述块
  253.     @gifi = @f.read(SIZE_GIFI).unpack("S4C")
  254.     # ※ 生成临时帧数据对象
  255.     @gif_fd = GIFSprite::Infos::FrameData.new if @gif_fd.nil?
  256.     # ※ 获取帧偏移
  257.     @gif_fd.offset_x = @gifi[0]
  258.     @gif_fd.offset_y = @gifi[1]
  259.     # 获取宽度和高度
  260.     @_width = @gifi[2]
  261.     @_height = @gifi[3]
  262.     # 清空局部调色板
  263.     @l_pal = nil
  264.     # 是否有局部调色板
  265.     if @gifi[4] >> 7 == 1
  266.       # 获取调色板位数
  267.       @_pal_bits = (@gifi[4] & 7) + 1
  268.       # 局部调色板大小
  269.       @l_pal_size = 3 * (1 << @_pal_bits)
  270.       # 读取局部调色板数据
  271.       @l_pal = @f.read(@l_pal_size).unpack("C*")
  272.     end
  273.     # 获取交错标记
  274.     @_lace = (@gifi[4] >> 6) & 1
  275.     # 修正调色板位数
  276.     @_pal_bits = @_pal_bits == 1 ? 1 : (@_pal_bits <= 4 ? 4 : 8)
  277.     # 获取行字节数
  278.     @_width_bytes = (((@_width * @_pal_bits) + 31) >> 5) << 2
  279.     # 读取图象压缩数据
  280.     self.read_lzw_data
  281.     # ※ 设置GIF帧数据
  282.     @gif_infos.frame_data[@frame_count - 1] = @gif_fd
  283.     # ※ 清除帧数据
  284.     @gif_fd = nil
  285.   end
  286.  
  287.   #--------------------------------------------------------------------------
  288.   # ● 读取图象压缩数据
  289.   #--------------------------------------------------------------------------
  290.   def read_lzw_data
  291.     # 解码用
  292.     lzw_mincodelen = @f.read(1)[0]
  293.     # 帧数加 1
  294.     @frame_count += 1
  295.     # 图象块数据
  296.     image_data = ""
  297.     # 块大小
  298.     blocksize = @f.read(1)[0]
  299.     while blocksize > 0
  300.       image_data += @f.read(blocksize)
  301.       blocksize = @f.read(1)[0]
  302.     end
  303.     # 导出图象
  304.     self.dump_imgs(image_data,lzw_mincodelen)
  305.   end
  306.  
  307.   #--------------------------------------------------------------------------
  308.   # ● 读取扩充块
  309.   #--------------------------------------------------------------------------
  310.   def read_gife
  311.     label = @f.read(1)[0]
  312.     case label
  313.     when 0xf9 # 图形控制扩展块
  314.       @gifc = @f.read(SIZE_GIFC).unpack("C2SC2")
  315.       # ※ 生成帧数据对象
  316.       @gif_fd = GIFSprite::Infos::FrameData.new   
  317.       # ※ 获取帧数据 延迟时间
  318.       @gif_fd.delay_time = @gifc[2]
  319.       # ※ 获取下一帧的处理方法
  320.       @gif_fd.disposal_method = (@gifc[1] & 28) >> 2
  321.       # 获取透明颜色
  322.       @_trans_index = nil
  323.       if @gifc[1] & 1 > 0
  324.         @_trans_index = @gifc[3]
  325.       end
  326.     when 0x01 # 图形说明扩展块
  327.       @gifp = @f.read(SIZE_GIFP).unpack("CS4C4")
  328.       blocksize = @f.read(1)[0]
  329.       while blocksize > 0
  330.         @f.read(blocksize)
  331.         blocksize = @f.read(1)[0]
  332.       end
  333.     when 0xfe # 注解说明扩展块
  334.       blocksize = @f.read(1)[0]
  335.       while blocksize > 0
  336.         @f.read(blocksize)
  337.         blocksize = @f.read(1)[0]
  338.       end
  339.     when 0xff # 应用程序扩展块
  340.       @gifa = @f.read(SIZE_GIFA).unpack("C*")
  341.       blocksize = @f.read(1)[0]
  342.       while blocksize > 0
  343.         @f.read(blocksize)
  344.         blocksize = @f.read(1)[0]
  345.       end
  346.     end
  347.   end
  348.  
  349.   #--------------------------------------------------------------------------
  350.   # ● 设置调色板
  351.   #--------------------------------------------------------------------------
  352.   def set_pal
  353.     @_pal = []
  354.     if @l_pal != nil
  355.       @_pal = @l_pal
  356.     elsif @g_pal != nil
  357.       @_pal = @g_pal
  358.     else
  359.       for i in 0...1 << @_pal_bits
  360.         @_pal.push i,i,i
  361.       end
  362.     end
  363.   end
  364.  
  365.   #--------------------------------------------------------------------------
  366.   # ● 解码图形数据
  367.   #--------------------------------------------------------------------------
  368.   def dump_imgs(image_data,lze_len)
  369.     @image_data = image_data.unpack("C*")
  370.  
  371.     self.set_pal
  372.  
  373.     @png_data = []
  374.  
  375.     @stack = []
  376.     @images = []
  377.  
  378.     @prefix = []
  379.     @suffix = []
  380.  
  381.     @bitcount = @_pal_bits
  382.     @widthcount = 0
  383.  
  384.     @left_bits = 0x00
  385.     @current_bits = lze_len + 0x01
  386.  
  387.     @lzw_clear = 1 << lze_len
  388.     @lzw_eoi = @lzw_clear + 1
  389.     @nowtablendx = @lzw_clear + 2
  390.     @toptablendx = 1 << @current_bits
  391.  
  392.     @wdata = 0
  393.     @wcode = 0
  394.     @oldcode = 0xffff
  395.     @row_num = 0
  396.     @tempchar = 0x00
  397.     @pass = 0x00
  398.     @firstchar = 0
  399.     @tempndx = 0
  400.     # 读取编码字符
  401.     self.read_byte
  402.     # 不是@lzw_eoi则循环
  403.     while @wcode != @lzw_eoi
  404.       # @lzw_clear码
  405.       if @wcode == @lzw_clear
  406.         for i in 0...@lzw_clear
  407.           @prefix[i] = 0xffff
  408.           @suffix[i] = i
  409.         end
  410.         for i in @nowtablendx...4096
  411.           @prefix[i] = 0xffff
  412.           @suffix[i] = 0x00
  413.         end
  414.         @current_bits = lze_len + 0x01
  415.         @nowtablendx = @lzw_clear + 2
  416.         @toptablendx = 1 << @current_bits
  417.         @oldcode = 0xffff
  418.         # 读取编码字符
  419.         self.read_byte
  420.         if @wcode != @lzw_eoi
  421.           while @prefix[@wcode] != 0xffff
  422.             @stack.push(@suffix[@wcode])
  423.             @wcode = @prefix[@wcode]
  424.           end
  425.           @stack.push(@suffix[@wcode])
  426.           @firstchar = @stack[-1]
  427.           # 输出解码数据
  428.           self.output_data
  429.         end
  430.       else
  431.         if @wcode < @nowtablendx
  432.           @tempndx = @wcode
  433.         else
  434.           @tempndx = @oldcode
  435.           @stack.push(@firstchar)
  436.         end
  437.         while @prefix[@tempndx] != 0xffff
  438.           @stack.push(@suffix[@tempndx])
  439.           @tempndx = @prefix[@tempndx]
  440.         end
  441.         @stack.push(@suffix[@tempndx])
  442.         @firstchar = @stack[-1]
  443.         @prefix[@nowtablendx] = @oldcode
  444.         @suffix[@nowtablendx] = @firstchar
  445.         @nowtablendx += 1
  446.         if @nowtablendx == @toptablendx and @current_bits < 12
  447.           @current_bits += 1
  448.           @toptablendx = 1 << @current_bits
  449.         end
  450.         # 输出解码数据
  451.         self.output_data
  452.       end
  453.       @oldcode = @wcode
  454.       # 读取编码字符
  455.       self.read_byte
  456.     end
  457.     Graphics.update
  458.     # 生成png图
  459.     self.make_png
  460.   end
  461.  
  462.   #--------------------------------------------------------------------------
  463.   # ● 读取下一个字节
  464.   #--------------------------------------------------------------------------
  465.   def read_byte
  466.     while @left_bits < @current_bits
  467.       @next_char = @image_data.shift
  468.       @wdata |= (@next_char << @left_bits)
  469.       @left_bits += 0x08
  470.     end
  471.     @wcode = @wdata & CODE_MASK[@current_bits]
  472.     @wdata >>= @current_bits
  473.     @left_bits -= @current_bits
  474.   end
  475.  
  476.   #--------------------------------------------------------------------------
  477.   # ● 输出解码数据
  478.   #--------------------------------------------------------------------------
  479.   def output_data
  480.     while !@stack.empty?
  481.       @tempchar |= (@stack.pop << (8 - @bitcount))
  482.       if @bitcount == 8
  483.         @images.push(@tempchar)
  484.         @tempchar = 0x00
  485.         @bitcount = @_pal_bits
  486.       else
  487.         @bitcount += @_pal_bits
  488.       end
  489.       @widthcount += 1
  490.       if @widthcount == @_width
  491.         if @bitcount != @_pal_bits
  492.           @images.push(@tempchar)
  493.           @tempchar = 0x00
  494.           @bitcount = @_pal_bits
  495.         end
  496.         @png_data[@row_num] = @images.clone
  497.         @images.clear
  498.         if @_lace > 0
  499.           @row_num += INC_TABLE[@pass]
  500.           if @row_num >= @_height
  501.             @pass += 1
  502.             @row_num = BGN_TABLE[@pass]
  503.           end
  504.         else
  505.           @row_num += 1
  506.         end
  507.         @widthcount = 0
  508.       end
  509.     end
  510.   end
  511.  
  512.   #--------------------------------------------------------------------------
  513.   # ● 生成png图片
  514.   #--------------------------------------------------------------------------
  515.   def make_png
  516.     fp = open("~TEMP/#@filename" + sprintf("_%02d",@frame_count)+".png","wb")
  517.     fp.write(self.make_png_header)
  518.     fp.write(self.make_png_ihdr)
  519.     fp.write(self.make_png_plte) if @_trans_index.nil?
  520.     fp.write(self.make_png_idat)
  521.     fp.write(self.make_png_iend)
  522.     fp.close
  523.   end
  524.  
  525.   #--------------------------------------------------------------------------
  526.   # ● png头文件
  527.   #--------------------------------------------------------------------------
  528.   def make_png_header
  529.     return [0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a].pack("C*")
  530.   end
  531.  
  532.   #--------------------------------------------------------------------------
  533.   # ● png信息头块
  534.   #--------------------------------------------------------------------------
  535.   def make_png_ihdr
  536.     ih_size = [13].pack("N")
  537.     ih_sign = "IHDR"
  538.     ih_width = [@_width].pack("N")
  539.     ih_height = [@_height].pack("N")
  540.     if @_trans_index != nil
  541.       ih_bit_depth = [@_pal_bits > 8 ? 16 : 8].pack("C")
  542.       ih_color_type = [6].pack("C")
  543.     else
  544.       ih_bit_depth = [@_pal_bits].pack("C")
  545.       ih_color_type = [3].pack("C")
  546.     end
  547.     ih_compression_method = [0].pack("C")
  548.     ih_filter_method = [0].pack("C")
  549.     ih_interlace_method = [0].pack("C")
  550.     string = ih_sign + ih_width + ih_height + ih_bit_depth + ih_color_type +
  551.              ih_compression_method + ih_filter_method + ih_interlace_method
  552.     ih_crc = [Zlib.crc32(string)].pack("N")
  553.     return ih_size + string + ih_crc
  554.   end
  555.  
  556.   #--------------------------------------------------------------------------
  557.   # ● png调色板块
  558.   #--------------------------------------------------------------------------
  559.   def make_png_plte
  560.     pl_size = [@_pal.size].pack("N")
  561.     pl_sign = "PLTE"
  562.     pl_data = @_pal.pack("C*")
  563.     pl_crc = [Zlib.crc32(pl_sign + pl_data)].pack("N")
  564.     return pl_size + pl_sign + pl_data + pl_crc
  565.   end
  566.  
  567.   #--------------------------------------------------------------------------
  568.   # ● png数据块
  569.   #--------------------------------------------------------------------------
  570.   def make_png_idat
  571.     lz_data = []
  572.     if @_trans_index != nil
  573.       for i in [email]0...@png_data.size[/email]
  574.         lz_data.push 0
  575.         for j in @png_data[i]
  576.           if j == @_trans_index
  577.             lz_data.push @_pal[j*3],@_pal[j*3+1],@_pal[j*3+2],0
  578.           else
  579.             lz_data.push @_pal[j*3],@_pal[j*3+1],@_pal[j*3+2],255
  580.           end
  581.         end
  582.       end
  583.     else
  584.       for i in [email]0...@png_data.size[/email]
  585.         lz_data.push 0
  586.         lz_data += @png_data[i]
  587.       end
  588.     end
  589.     id_data = Zlib::Deflate.deflate(lz_data.pack("C*"),9)
  590.     id_size = [id_data.size].pack("N")
  591.     id_sign = "IDAT"
  592.     id_crc = [Zlib.crc32(id_sign + id_data)].pack("N")
  593.     return id_size + id_sign + id_data + id_crc
  594.   end
  595.  
  596.   #--------------------------------------------------------------------------
  597.   # ● png 结尾块
  598.   #--------------------------------------------------------------------------
  599.   def make_png_iend
  600.     ie_size = [0].pack("N")
  601.     ie_sign = "IEND"
  602.     ie_crc = [Zlib.crc32(ie_sign)].pack("N")
  603.     return ie_size + ie_sign + ie_crc
  604.   end
  605.  
  606. end
  607.  
  608. #==============================================================================
  609. # ■ Graphics
  610. #------------------------------------------------------------------------------
  611. #  处理画面的模块 。
  612. #==============================================================================
  613. class << Graphics
  614.  
  615.   #--------------------------------------------------------------------------
  616.   # ● 添加别名、线程、临界区
  617.   #--------------------------------------------------------------------------
  618.   unless method_defined? :origin_update
  619.     alias origin_update update
  620.     def update_critical
  621.       Thread.critical = true
  622.       origin_update
  623.       Thread.critical = false
  624.     end
  625.     Thread.new{loop{Graphics.update_critical;sleep(9)}}
  626.   end
  627.  
  628.   #--------------------------------------------------------------------------
  629.   # ● 定义类变量
  630.   #--------------------------------------------------------------------------
  631.   @@gif_sprites = Array.new
  632.  
  633.   #--------------------------------------------------------------------------
  634.   # ● 添加GIF图片精灵
  635.   #--------------------------------------------------------------------------
  636.   def add(gs)
  637.     @@gif_sprites << gs
  638.   end
  639.  
  640.   #--------------------------------------------------------------------------
  641.   # ● 删除GIF图片精灵
  642.   #--------------------------------------------------------------------------
  643.   def del(gs)
  644.     @@gif_sprites.delete gs
  645.   end
  646.  
  647.   #--------------------------------------------------------------------------
  648.   # ● 更新画面
  649.   #--------------------------------------------------------------------------
  650.   def update
  651.     update_critical
  652.     @@gif_sprites.each{|gs| gs.update}
  653.   end
  654.  
  655. end
  656.  
  657. #==============================================================================
  658. # ■ GIFSprite
  659. #------------------------------------------------------------------------------
  660. #  GIF精灵的核心类 。
  661. #==============================================================================
  662. class GIFSprite
  663.  
  664.   #============================================================================
  665.   # ● GIFSprite::Infos
  666.   #----------------------------------------------------------------------------
  667.   #  GIF图片信息类 。
  668.   #============================================================================
  669.   class Infos
  670.  
  671.     #------------------------------------------------------------------------
  672.     # ● 定义实例变量
  673.     #------------------------------------------------------------------------
  674.     attr_accessor :total_frames
  675.     attr_accessor :width
  676.     attr_accessor :height
  677.     attr_accessor :frame_data
  678.  
  679.     #------------------------------------------------------------------------
  680.     # ● 初始化
  681.     #------------------------------------------------------------------------
  682.     def initialize
  683.       @total_frames = 0
  684.       @width = 0
  685.       @height = 0
  686.       @frame_data = Array.new
  687.     end
  688.  
  689.     #==========================================================================
  690.     # ● GIFSprite::Infos::FrameData
  691.     #--------------------------------------------------------------------------
  692.     #  GIF图片每帧信息类 。
  693.     #==========================================================================
  694.     class FrameData
  695.  
  696.       #----------------------------------------------------------------------
  697.       # ● 定义实例变量
  698.       #----------------------------------------------------------------------
  699.       attr_accessor :offset_x
  700.       attr_accessor :offset_y
  701.       attr_accessor :delay_time
  702.       attr_accessor :disposal_method
  703.  
  704.       #----------------------------------------------------------------------
  705.       # ● 初始化
  706.       #----------------------------------------------------------------------
  707.       def initialize
  708.         @offset_x = 0
  709.         @offset_y = 0
  710.         @delay_time = 0
  711.         @disposal_method = 0
  712.       end
  713.  
  714.     end
  715.  
  716.   end
  717.  
  718.   #--------------------------------------------------------------------------
  719.   # ● 预处理:建立临时文件夹
  720.   #--------------------------------------------------------------------------
  721.   unless Dir["*"].include?("~TEMP")
  722.     Dir.mkdir("~TEMP")
  723.     System.attrib("~TEMP","+h","+s")
  724.   end
  725.  
  726.   #--------------------------------------------------------------------------
  727.   # ● 清空硬缓存
  728.   #--------------------------------------------------------------------------
  729.   def self.TmpFileclear
  730.     begin
  731.       Dir["~TEMP/*"].each{|filename| File.delete filename}
  732.     rescue
  733.     end
  734.   end
  735.  
  736.   #--------------------------------------------------------------------------
  737.   # ● 预加载图片
  738.   #--------------------------------------------------------------------------
  739.   def self.pre_load(filename_arr)
  740.     filename_arr.each{|fn| GIF.readdata(fn)}
  741.   end
  742.  
  743.   #--------------------------------------------------------------------------
  744.   # ● 定义实例变量
  745.   #--------------------------------------------------------------------------
  746.   attr_accessor :x
  747.   attr_accessor :y
  748.   attr_reader   :z
  749.   attr_accessor :loop_counts
  750.   attr_accessor :viewport
  751.  
  752.   #--------------------------------------------------------------------------
  753.   # ● 创建对象
  754.   #--------------------------------------------------------------------------
  755.   def self.new(viewport = nil,x = 0,y = 0,loop_counts = -1)
  756.     obj = super()
  757.     obj.viewport = viewport
  758.     obj.x = x
  759.     obj.y = y
  760.     obj.loop_counts = loop_counts
  761.     Graphics.add(obj)
  762.     obj
  763.   end
  764.  
  765.   #--------------------------------------------------------------------------
  766.   # ● 获取图片信息
  767.   #--------------------------------------------------------------------------
  768.   def bitmap
  769.     @gif_infos
  770.   end
  771.  
  772.   #--------------------------------------------------------------------------
  773.   # ● 设置图片文件名
  774.   #--------------------------------------------------------------------------
  775.   def bitmap=(filename)
  776.     @gif_infos = GIF.readdata(filename)
  777.     if @gif_infos != nil
  778.       @sp_arr = Array.new
  779.       basename = File.basename(filename,".*")
  780.       for i in [email]0...@gif_infos.total_frames[/email]
  781.         sp   = Sprite.new(@viewport)
  782.         sp.bitmap = Bitmap.new(sprintf("~TEMP/#{basename}_%02d.png",i + 1))
  783.         sp.visible = i == 0
  784.         sp.x = @gif_infos.frame_data[i].offset_x
  785.         sp.y = @gif_infos.frame_data[i].offset_y
  786.         @sp_arr << sp
  787.       end
  788.       @update_frame_count = 0
  789.       @current_show_frame = 0
  790.       @next_frame_counts =
  791.       (@gif_infos.frame_data[0].delay_time * Graphics.frame_rate / 100)
  792.     end
  793.   end
  794.  
  795.   #--------------------------------------------------------------------------
  796.   # ● 定义x=
  797.   #--------------------------------------------------------------------------
  798.   def x=(x)
  799.     if @gif_infos.nil?
  800.       @x = 0
  801.       return
  802.     end
  803.     @x = x
  804.     for i in [email]0...@gif_infos.total_frames[/email]
  805.       @sp_arr[i].x = @gif_infos.frame_data[i].offset_x + @x
  806.     end
  807.   end
  808.  
  809.   #--------------------------------------------------------------------------
  810.   # ● 定义y=
  811.   #--------------------------------------------------------------------------
  812.   def y=(y)
  813.     if @gif_infos.nil?
  814.       @y = 0
  815.       return
  816.     end
  817.     @y = y
  818.     for i in [email]0...@gif_infos.total_frames[/email]
  819.       @sp_arr[i].y = @gif_infos.frame_data[i].offset_y + @y
  820.     end
  821.   end
  822.  
  823.   #--------------------------------------------------------------------------
  824.   # ● 定义z=
  825.   #--------------------------------------------------------------------------
  826.   def z=(z)
  827.     if @gif_infos.nil?
  828.       @z = 0
  829.       return
  830.     end
  831.     @z = z
  832.     for i in [email]0...@gif_infos.total_frames[/email]
  833.       @sp_arr[i].z = @z
  834.     end
  835.   end
  836.  
  837.   #--------------------------------------------------------------------------
  838.   # ● 获取宽度
  839.   #--------------------------------------------------------------------------
  840.   def width
  841.     return @gif_infos.nil? ? 0 : @gif_infos.width
  842.   end
  843.  
  844.   #--------------------------------------------------------------------------
  845.   # ● 获取高度
  846.   #--------------------------------------------------------------------------
  847.   def height
  848.     return @gif_infos.nil? ? 0 : @gif_infos.height
  849.   end
  850.  
  851.   #--------------------------------------------------------------------------
  852.   # ● 释放精灵
  853.   #--------------------------------------------------------------------------
  854.   def dispose
  855.     Graphics.del(self)
  856.     @sp_arr.each{|sp|
  857.       sp.bitmap.dispose
  858.       sp.dispose
  859.     }
  860.     @sp_arr.clear
  861.     @gif_infos = nil
  862.   end
  863.  
  864.   #--------------------------------------------------------------------------
  865.   # ● 更新精灵
  866.   #--------------------------------------------------------------------------
  867.   def update
  868.     if @gif_infos.nil?
  869.       return
  870.     end
  871.     @update_frame_count += 1
  872.     if @update_frame_count >= @next_frame_counts
  873.       @current_show_frame = (@current_show_frame + 1) % @gif_infos.total_frames
  874.       case @gif_infos.frame_data[@current_show_frame - 1].disposal_method
  875.       when 0 # 不处理
  876.  
  877.       when 1 # 图象保留在原处
  878.  
  879.       when 2 # 当前图象消失
  880.         @sp_arr[@current_show_frame - 1].visible = false
  881.       when 3 # 尚不明 = =
  882.  
  883.       end
  884.       @sp_arr[@current_show_frame].visible = true
  885.       if @current_show_frame == 0
  886.         @loop_counts -= 1 if @loop_counts > 0
  887.         if @loop_counts == 0
  888.           self.dispose
  889.           return
  890.         end
  891.         for i in [email]0...@sp_arr.size[/email]
  892.           @sp_arr[i].visible = i == @current_show_frame
  893.         end
  894.       end
  895.       @update_frame_count = 0
  896.       @next_frame_counts = (@gif_infos.frame_data[@current_show_frame].\
  897.       delay_time * Graphics.frame_rate / 100)
  898.     end
  899.   end
  900.  
  901. end

点评

剛实测过后,表示VA不能用,会報错.不知经过了那么多年,国內外有木有大神寫出了能像这,能无限循环的.https://rpg.blue/forum.php?mod=viewthread&tid=351129不会循环..   发表于 2020-4-25 15:46
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-16 13:05

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表