Project1

标题: 【VA】当我发现一个坑爹的脚本。。。。。 [打印本页]

作者: 阿尔西斯的马甲    时间: 2012-1-22 19:24
标题: 【VA】当我发现一个坑爹的脚本。。。。。
本帖最后由 阿尔西斯的马甲 于 2012-1-22 19:25 编辑

  1. # 将bitmap对象输出成bmp文件 By MOMOMO
  2. #话说明明是柳柳发布的喵。。。
  3. # 翻译:bbschat 来自:www.66rpg.com
  4. # 将Bitmap对象
  5. # 转换成位图文件(24bit)输出。
  6. #
  7. # Bmp_File.make_bmp_file(bitmap, name[, path])
  8. # bitmap:Bitmap对象
  9. # name:保存文件名
  10. # path:保存路径
  11. #
  12. # 或者,对Bitmap对象直接使用
  13. # bitmap_obj.make_bmp_file(name[, path])
  14. # 也可以达成同样的机能。


  15. module Bmp_File
  16. module_function
  17. # 生成BMP文件
  18. def make_bmp_file(bitmap, name, path="")
  19.   file_header = make_bmp_file_header(bitmap)
  20.   info_header = make_bmp_info_header(bitmap)
  21.   bitmap_data = make_bitmap_data(bitmap)
  22.   make_dir(path) if path != ""
  23.   file = File.open(path + name + ".bmp", "wb")
  24.   file.write(file_header)
  25.   file.write(info_header)
  26.   file.write(bitmap_data)
  27.   file.close
  28. end
  29. # 生成保存路径
  30. def make_dir(path)
  31.   dir = path.split("/")
  32.   for i in 0...dir.size
  33.     unless dir == "."
  34.       add_dir = dir[0..i].join("/")
  35.       begin
  36.         Dir.mkdir(add_dir)
  37.       rescue
  38.       end
  39.     end
  40.   end
  41. end
  42. # 从Bitmap对象中生成文件头
  43. def make_bmp_file_header(bitmap)
  44.   bf_type = ["BM"].pack("a2")
  45.   bf_size = [get_bf_size(bitmap)].pack("L")
  46.   bf_Reserved1 = [0].pack("S")
  47.   bf_Reserved2 = [0].pack("S")
  48.   bf_OffBits = [54].pack("L")
  49.   
  50.   file_header = bf_type + bf_size + bf_Reserved1 + bf_Reserved2 + bf_OffBits
  51.   return file_header
  52. end
  53. # 从Bitmap对象中生成情报头
  54. def make_bmp_info_header(bitmap)
  55.   bi_size = [40].pack("L")
  56.   bi_width = [get_bi_width(bitmap)].pack("L")
  57.   bi_height = [get_bi_height(bitmap)].pack("L")
  58.   bi_planes = [1].pack("S")
  59.   bi_bitcount = [24].pack("S")
  60.   bi_copmression = [0].pack("L")
  61.   bi_sizeimage = [0].pack("L")
  62.   bi_x_pixpermeter = [0].pack("L")
  63.   bi_y_pixpermeter = [0].pack("L")
  64.   bi_clrused = [0].pack("L")
  65.   bi_cirimportant = [0].pack("L")
  66.   
  67.   info_header = bi_size + bi_width + bi_height + bi_planes + bi_bitcount +
  68.                 bi_copmression + bi_sizeimage + bi_x_pixpermeter +
  69.                 bi_y_pixpermeter + bi_clrused + bi_cirimportant
  70.   
  71.   return info_header
  72. end
  73. # 从Bitmap对象中生成图像数据
  74. def make_bitmap_data(bitmap)
  75.   w = bitmap.width
  76.   h = bitmap.height
  77.   w = (w / 4 + 1) * 4 if w % 4 != 0
  78.   data = []
  79.   for y in 0...h
  80.     for x in 0...w
  81.       color = bitmap.get_pixel(x, (h - 1) - y)
  82.       data.push(color.blue)
  83.       data.push(color.green)
  84.       data.push(color.red)
  85.     end
  86.   end
  87.   return data.pack("C*")
  88. end
  89. def get_bf_size(bitmap)
  90.   w = bitmap.width
  91.   w = (w / 4 + 1) * 4 if w % 4 != 0
  92.   h = bitmap.height
  93.   return w * h * 3
  94. end
  95. def get_bi_width(bitmap)
  96.   return bitmap.width
  97. end
  98. def get_bi_height(bitmap)
  99.   return bitmap.height
  100. end
  101. end
  102. class Bitmap
  103. def make_bmp_file(name, path="")
  104.   Bmp_File.make_bmp_file(self, name, path)
  105. end
  106. end
  107. #==============================================================================
  108. #               本脚本出自www.66rpg.com,转载请注明。
  109. #==============================================================================
  110. =begin
  111. ==============================================================================
  112.                         Bitmap to PNG By 轮回者
  113. ==============================================================================

  114. 对Bitmap对象直接使用

  115. bitmap_obj.make_png(name[, path])

  116. name:保存文件名
  117. path:保存路径

  118. 感谢66、夏娜、金圭子的提醒和帮助!
  119.    
  120. ==============================================================================
  121. =end

  122. module Zlib
  123.   class Png_File < GzipWriter
  124.     #--------------------------------------------------------------------------
  125.     # ● 主处理
  126.     #--------------------------------------------------------------------------
  127.     def make_png(bitmap_Fx,mode)
  128.       @mode = mode
  129.       @bitmap_Fx = bitmap_Fx
  130.       self.write(make_header)
  131.       self.write(make_ihdr)
  132.       self.write(make_idat)
  133.       self.write(make_iend)
  134.     end
  135.     #--------------------------------------------------------------------------
  136.     # ● PNG文件头数据块
  137.     #--------------------------------------------------------------------------
  138.     def make_header
  139.       return [0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a].pack("C*")
  140.     end
  141.     #--------------------------------------------------------------------------
  142.     # ● PNG文件情报头数据块(IHDR)
  143.     #--------------------------------------------------------------------------
  144.     def make_ihdr
  145.       ih_size = [13].pack("N")
  146.       ih_sign = "IHDR"
  147.       ih_width = [@bitmap_Fx.width].pack("N")
  148.       ih_height = [@bitmap_Fx.height].pack("N")
  149.       ih_bit_depth = [8].pack("C")
  150.       ih_color_type = [6].pack("C")
  151.       ih_compression_method = [0].pack("C")
  152.       ih_filter_method = [0].pack("C")
  153.       ih_interlace_method = [0].pack("C")
  154.       string = ih_sign + ih_width + ih_height + ih_bit_depth + ih_color_type +
  155.                ih_compression_method + ih_filter_method + ih_interlace_method
  156.       ih_crc = [Zlib.crc32(string)].pack("N")
  157.       return ih_size + string + ih_crc
  158.     end
  159.     #--------------------------------------------------------------------------
  160.     # ● 生成图像数据(IDAT)
  161.     #--------------------------------------------------------------------------
  162.     def make_idat
  163.       header = "\x49\x44\x41\x54"
  164.       case @mode # 请54~
  165.       when 1
  166.         data = make_bitmap_data#1
  167.       else
  168.         data = make_bitmap_data
  169.       end
  170.       data = Zlib::Deflate.deflate(data, 8)
  171.       crc = [Zlib.crc32(header + data)].pack("N")
  172.       size = [data.length].pack("N")
  173.       return size + header + data + crc
  174.     end
  175.     #--------------------------------------------------------------------------
  176.     # ● 从Bitmap对象中生成图像数据 mode 1(请54~)
  177.     #--------------------------------------------------------------------------
  178.     def make_bitmap_data1
  179.       w = @bitmap_Fx.width
  180.       h = @bitmap_Fx.height
  181.       data = []
  182.       for y in 0...h
  183.         data.push(0)
  184.         for x in 0...w
  185.           color = @bitmap_Fx.get_pixel(x, y)
  186.           red = color.red
  187.           green = color.green
  188.           blue = color.blue
  189.           alpha = color.alpha
  190.           data.push(red)
  191.           data.push(green)
  192.           data.push(blue)
  193.           data.push(alpha)
  194.         end
  195.       end
  196.       return data.pack("C*")
  197.     end
  198.     #--------------------------------------------------------------------------
  199.     # ● 从Bitmap对象中生成图像数据 mode 0
  200.     #--------------------------------------------------------------------------
  201.     def make_bitmap_data
  202.       gz = Zlib::GzipWriter.open('hoge.gz')
  203.       t_Fx = 0
  204.       w = @bitmap_Fx.width
  205.       h = @bitmap_Fx.height
  206.       data = []
  207.       for y in 0...h
  208.         data.push(0)
  209.         for x in 0...w
  210.           t_Fx += 1
  211.           if t_Fx % 10000 == 0
  212.             Graphics.update
  213.           end
  214.           if t_Fx % 100000 == 0
  215.             s = data.pack("C*")
  216.             gz.write(s)
  217.             data.clear
  218.             #GC.start
  219.           end
  220.           color = @bitmap_Fx.get_pixel(x, y)
  221.           red = color.red
  222.           green = color.green
  223.           blue = color.blue
  224.           alpha = color.alpha
  225.           data.push(red)
  226.           data.push(green)
  227.           data.push(blue)
  228.           data.push(alpha)
  229.         end
  230.       end
  231.       s = data.pack("C*")
  232.       gz.write(s)
  233.       gz.close   
  234.       data.clear
  235.       gz = Zlib::GzipReader.open('hoge.gz')
  236.       data = gz.read
  237.       gz.close
  238.       File.delete('hoge.gz')
  239.       return data
  240.     end
  241.     #--------------------------------------------------------------------------
  242.     # ● PNG文件尾数据块(IEND)
  243.     #--------------------------------------------------------------------------
  244.     def make_iend
  245.       ie_size = [0].pack("N")
  246.       ie_sign = "IEND"
  247.       ie_crc = [Zlib.crc32(ie_sign)].pack("N")
  248.       return ie_size + ie_sign + ie_crc
  249.     end
  250.   end
  251. end
  252. #==============================================================================
  253. # ■ Bitmap
  254. #------------------------------------------------------------------------------
  255. #  关联到Bitmap。
  256. #==============================================================================
  257. class Bitmap
  258.   #--------------------------------------------------------------------------
  259.   # ● 关联
  260.   #--------------------------------------------------------------------------
  261.   def make_png(name="like", path="",mode=0)
  262.     make_dir(path) if path != ""
  263.     Zlib::Png_File.open("temp.gz") {|gz|
  264.       gz.make_png(self,mode)
  265.     }
  266.     Zlib::GzipReader.open("temp.gz") {|gz|
  267.       $read = gz.read
  268.     }
  269.     f = File.open(path + name + ".png","wb")
  270.     f.write($read)
  271.     f.close
  272.     File.delete('temp.gz')
  273.     end
  274.   #--------------------------------------------------------------------------
  275.   # ● 生成保存路径
  276.   #--------------------------------------------------------------------------
  277.   def make_dir(path)
  278.     dir = path.split("/")
  279.     for i in 0...dir.size
  280.       unless dir == "."
  281.         add_dir = dir[0..i].join("/")
  282.         begin
  283.           Dir.mkdir(add_dir)
  284.         rescue
  285.         end
  286.       end
  287.     end
  288.   end
  289. end
  290. #==============================================================================
  291. #               本脚本出自www.66rpg.com,转载请注明。
  292. #==============================================================================
  293. module RPG
  294.   class Animation2
  295.     def initialize
  296.       @id = 0
  297.       @name = ""
  298.       @animation1_name = ""
  299.       @animation1_hue = 0
  300.       @animation2_name = ""
  301.       @animation2_hue = 0
  302.       @position = 1
  303.       @frame_max = 1
  304.       @frames = [RPG::Animation::Frame.new]
  305.       @timings = []
  306.     end
  307.     attr_accessor :id
  308.     attr_accessor :name
  309.     attr_accessor :animation_name
  310.     attr_accessor :animation_hue
  311.     attr_accessor :position
  312.     attr_accessor :frame_max
  313.     attr_accessor :frames
  314.     attr_accessor :timings                 
  315.   end
  316. end

  317. module RPG
  318.   class Animation2
  319.     class Timing
  320.       def initialize
  321.         @frame = 0
  322.         @se = RPG::SE.new("", 80)
  323.         @se_name = ""
  324.         @se_volume = 80
  325.         @se_pitch = 100
  326.         @flash_scope = 0
  327.         @flash_color = Color.new(255,255,255,255)
  328.         @flash_duration = 5
  329.       end
  330.       attr_accessor :frame
  331.       attr_accessor :se
  332.       attr_accessor :se_name
  333.       attr_accessor :se_volume
  334.       attr_accessor :se_pitch
  335.       attr_accessor :flash_scope
  336.       attr_accessor :flash_color
  337.       attr_accessor :flash_duration
  338.     end
  339.   end
  340. end

  341. $data_animations    = load_data("Data/Animations.rvdata2")
  342. $vx_ani = []

  343. $sprite = Sprite.new
  344. $sprite.bitmap = Bitmap.new(500, 400)
  345. number = 1
  346. for ani in $data_animations
  347.   number += 1
  348.   next if ani==nil
  349.   $sprite.bitmap.clear
  350.   $sprite.bitmap.draw_text(0, 0, 500, 400, number.to_s + " / " + $data_animations.size.to_s, 1)
  351.   tani = RPG::Animation2.new
  352.   tani.id = ani.id
  353.   tani.name = ani.name
  354.   tani.animation_name = ani.animation1_name+"66RPG"+ani.animation2_name
  355.   tani.animation_hue = ani.animation1_hue
  356.   width = 960
  357.   bmp1 = Cache.animation(ani.animation1_name, ani.animation1_hue)
  358.   bmp2 = Cache.animation(ani.animation2_name, ani.animation2_hue)
  359.   height = bmp1.height + bmp2.height
  360.   bmp = Bitmap.new(width, height)
  361.   bmp.blt(0, 0, bmp1, bmp1.rect)
  362.   bmp.blt(0, bmp1.height, bmp2, bmp2.rect)
  363.   bmp.make_png(ani.animation1_name+"66RPG"+ani.animation2_name)
  364.   tani.position = ani.position
  365.   tani.frame_max = ani.frame_max
  366.   tani.frames = ani.frames
  367.   for i in 0..15
  368.     for fram in tani.frames
  369.       fram.cell_data[i, 0] -= (100 - bmp1.height * 5/ 192) if fram.cell_data[i, 0] != nil and fram.cell_data[i, 0] > 100
  370.     end
  371.   end
  372.   tani.timings = []
  373.   for timing in ani.timings
  374.     tm = RPG::Animation2::Timing.new
  375.     tm.frame = timing.frame
  376.     tm.se_name = timing.se.name
  377.     tm.se_volume = timing.se.volume
  378.     tm.se_pitch = timing.se.pitch
  379.     tm.flash_scope = timing.flash_scope
  380.     tm.flash_color = timing.flash_color
  381.     tm.flash_duration = timing.flash_duration
  382.     tani.timings.push(tm)
  383.   end
  384.   $vx_ani.push(tani)
  385. end

  386. save_data($vx_ani, "vx_ani.6R")
  387. p "done"
复制代码
你妹的rvdata2,你妹的格式!
作者: 忧雪の伤    时间: 2012-1-22 19:25
看不懂您在说啥。
作者: 阿尔西斯的马甲    时间: 2012-1-22 19:38
本帖最后由 阿尔西斯的马甲 于 2012-1-22 19:43 编辑

研究:。。。(研究?!!)。。。水区我记得没有自顶限吧。。。
柳柳这啃爹的脚本大概是把animation转成数据库(转个你妹的数据库要你妹的这么多时间?我终于明白RGE的产生原因了)。
另外用不断变动的数字显示,不断updategraphics解掉10秒限(话说这主意。。根本没法实际应用。主线程如果都卡了,你创建再多的分线程还能不都卡住没法update么)
这脚本被稍微改了一下才能用在VA上。
不断仿VA的计划又迈进了OHyeAH!
Autotiles.7z (326.8 KB, 下载次数: 0) 顺便附上我做好的一点自动元件




@aaalbx骂66?为何这样说?我这是在骂EB涅


──阿尔西斯的马甲于2012-1-22 19:42补充以上内容’
作者: 怕鼠的猫    时间: 2012-1-22 19:53
"BM",这么底层的开头都有了………… 用解释性语言逐字节写入bmp文件,那还不是个悲剧吗?




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1