Project1

标题: 半生的Bitmap脚本第231行报错 [打印本页]

作者: alicediary    时间: 2015-12-27 16:35
标题: 半生的Bitmap脚本第231行报错
本帖最后由 alicediary 于 2015-12-27 16:35 编辑

RUBY 代码复制
  1. # coding: utf-8
  2. =begin
  3. = Bitmap类拡张 (DLL版)
  4. RPGツクールXP/VX/VA共用
  5. 添加功能 Bitmap 类。
  6. - Marshaldump 启用
  7. - 保存为PNG文件
  8. -色调变化
  9. -马赛克效果
  10. -反相颜色
  11. -模糊效果
  12. -使用遮罩-切除
  13. -混合
  14.  
  15. ■ 注意
  16.  这个脚本需要"tktk_bitmap.dll"(ver0.1.2.6以上)。
  17.  
  18. Author::    半生
  19. Date::      2010/12/13
  20. Version::   0.1.2.6
  21. URL::       [url]http://www.tktkgame.com/[/url]
  22.  
  23. ################更新########################
  24.  2010/12/13 ver 0.1.2.6
  25.  dll名称从"hn_rg_bitmap.dll"变更为"tktk_bitmap.dll"
  26.  LARGE_BITMAP机能でメモリを确保できなかった场合の処理を追加
  27.  2010/10/12 ver 0.1.2.5(デンジャラスベータ版)
  28.  大きいサイズのBitmapオブジェクトを机能を试験的に実装(危険)
  29.  2010/03/24 ver 0.1.2.2
  30.  ブレンディング机能関连の軽量化。
  31.  画像连结系メソッドの分离。
  32.  2010/03/24 ver 0.1.2.1
  33.  ブレンディング机能関连のバグフィックス
  34.  2010/03/22 ver 0.1.2.0
  35.  加算合成等のブレンディング机能の追加
  36. 2010/02/07 ver 0.1.1.0
  37.  マーシャル化の処理の一部をDLLに移动
  38. 2010/01/17 ver 0.1.0.0
  39.  dllの名称を"hn_rx_bitmap.dll"から"hn_rg_bitmap.dll"に変更
  40.  モザイク効果・色反転・ぼかし効果の追加
  41. ############################################
  42. =end
  43.  
  44. module TKTK_Bitmap
  45.   LARGE_BITMAP = true # 是否使用大型点阵图的功能
  46.   DLL_NAME = 'tktk_bitmap'
  47.  
  48.   ERROR_ALLOCATE_FAILED = -110002
  49.  
  50.   @@png_save = Win32API.new(DLL_NAME, 'PngSaveA', 'p n i i', 'i')
  51.   @@blur = Win32API.new(DLL_NAME, 'Blur', 'n i', 'i')
  52.   @@change_tone = Win32API.new(DLL_NAME, 'ChangeTone', 'n i i i i', 'i')
  53.   @@clip_mask = Win32API.new(DLL_NAME, 'ClipMask', 'n n i i i', 'i')
  54.   @@invert = Win32API.new(DLL_NAME, 'InvertColor', 'n', 'i')
  55.   @@mosaic = Win32API.new(DLL_NAME, 'Mosaic', 'n i i i i i i', 'i')
  56.   @@address = Win32API.new(DLL_NAME, 'GetAddress', 'n', 'n')
  57.   @@get_pixel_data = Win32API.new(DLL_NAME, 'GetPixelData', 'n p i', 'i')
  58.   @@set_pixel_data = Win32API.new(DLL_NAME, 'SetPixelData', 'n p i', 'i')
  59.   @@blend_blt = Win32API.new(DLL_NAME, 'BlendBlt', 'n i i n i i i i i i', 'i')
  60.   #@@get_hwnd = Win32API.new(DLL_NAME, 'GetGameHWND', 'v', 'l')
  61.   @@change_size = Win32API.new(DLL_NAME, 'ChangeSize', 'n i i', 'i')
  62.   module_function
  63.  
  64.   # PNG形式储存
  65.   def png_save(bitmap,file_name,compression_level,filter)
  66.     return @@png_save.call(file_name, bitmap.object_id, compression_level, filter)
  67.   end
  68.  
  69.   # 模糊效果
  70.   def blur(bitmap, r = 1)
  71.     return @@blur.call(bitmap.object_id, r)
  72.   end
  73.  
  74.   # 更改颜色平衡?
  75.   def change_tone(bitmap, red = 0, green = 0, blue = 0, simplify = 1)
  76.     return @@change_tone.call(bitmap.object_id, red, green, blue, simplify)
  77.   end
  78. # 剪贴蒙版图像(α乘法)
  79.   def clip_mask(g_bitmap, m_bitmap, x=0, y=0, outer=0)
  80.     return @@clip_mask.call(g_bitmap.object_id, m_bitmap.object_id, x, y, outer)
  81.   end
  82.  
  83.   # 色的反转
  84.   def invert(bitmap)
  85.     return @@invert.call(bitmap.object_id)
  86.   end
  87.  
  88.   # 马赛克效果
  89.   def mosaic(bitmap, msw=5, msh=5)
  90.     return self.mosaic_rect(bitmap, bitmap.rect, msw, msh)
  91.   end
  92.  
  93.   # 马赛克效果(范围指定)
  94.   def mosaic_rect(bitmap, rect, msw=5, msh=5)
  95.     return @@mosaic.call(bitmap.object_id,
  96.     rect.x, rect.y, rect.width, rect.height, msw, msh)
  97.   end
  98.  
  99.   # 获取Bitmap资料位址
  100.   def address(bitmap)
  101.     return @@address.call(bitmap.object_id)
  102.   end
  103.  
  104.   # 二进位资料获取点Bitmap阵图
  105.   def get_pixel_data(bitmap)
  106.     buffer = "bgra" * bitmap.width * bitmap.height
  107.     @@get_pixel_data.call(bitmap.object_id, buffer, buffer.size)
  108.     return buffer
  109.   end
  110.  
  111.   #替换为Bitmap中的二进位资料
  112.   def set_pixel_data(bitmap, data)
  113.     return @@set_pixel_data.call(bitmap.object_id, data, data.size)
  114.   end
  115.  
  116.   def blend_blt(dest_bmp, x, y, src_bmp, rect, blend_type=0, opacity=255)
  117.     @@blend_blt.call(dest_bmp.object_id, x, y, src_bmp.object_id,
  118.                 rect.x, rect.y, rect.width, rect.height,
  119.                 blend_type, opacity)
  120.   end
  121.  
  122.   # 改变Bitmap的大小(风险)
  123.   def change_size(bitmap, new_width, new_height)
  124.     return -1 if (new_width <=0 or new_height <= 0)
  125.     result = @@change_size.call(bitmap.object_id, new_width, new_height)
  126.     if result == ERROR_ALLOCATE_FAILED
  127.       raise("tktk_bitmap:ERROR ALLOCATE FAILED")
  128.     end
  129.     return result
  130.   end
  131.  
  132. end
  133.  
  134. class Font
  135.   def marshal_dump;end
  136.   def marshal_load(obj);end
  137. end
  138. class Bitmap
  139.   # PNG 压缩筛检程式
  140.   PNG_NO_FILTERS   = 0x00
  141.   PNG_FILTER_NONE  = 0x08
  142.   PNG_FILTER_SUB   = 0x10
  143.   PNG_FILTER_UP    = 0x20
  144.   PNG_FILTER_AVG   = 0x40
  145.   PNG_FILTER_PAETH = 0x80
  146.   PNG_ALL_FILTERS  = (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP |
  147.                       PNG_FILTER_AVG | PNG_FILTER_PAETH)
  148.  
  149.   # Marshal_dump
  150.   def _dump(limit)
  151.     return "" if self.disposed?
  152.     data = TKTK_Bitmap.get_pixel_data(self)
  153.     [width, height, Zlib::Deflate.deflate(data)].pack("LLa*") # ついでに圧缩
  154.   end
  155.  
  156.   # Marshal_load
  157.   def self._load(str)
  158.     if str == ""
  159.       b = Bitmap.new(1,1)
  160.       b.dispose
  161.       return b
  162.     end
  163.     w, h, zdata = str.unpack("LLa*"); b = new(w, h)
  164.     TKTK_Bitmap.set_pixel_data(b, Zlib::Inflate.inflate(zdata))
  165.     return b
  166.   end  
  167.  
  168.   def address
  169.     TKTK_Bitmap.address(self)
  170.   end
  171.  
  172.   #     模糊效果
  173.   def blur2(r=1)
  174.     TKTK_Bitmap.blur(self, r)
  175.   end
  176.  
  177.   # 色调变化
  178.   def change_tone(red, green, blue, simplify = 1)
  179.     TKTK_Bitmap.change_tone(self, red, green, blue, simplify)
  180.   end
  181.  
  182.   # 剪切
  183.   def clip_mask(bitmap, x=0, y=0, outer=0)
  184.     TKTK_Bitmap.clip_mask(self, bitmap, x, y, outer)
  185.   end
  186.  
  187.   # 反相颜色
  188.   def invert
  189.     TKTK_Bitmap.invert(self)
  190.   end
  191.  
  192.   # 马赛克效果
  193.   def mosaic(msw=5, msh=5)
  194.     TKTK_Bitmap.mosaic(self, msw, msh)
  195.   end
  196.  
  197.   # 马赛克效果 (指定区域)
  198.   def mosaic_rect(rect=self.rect, msw=5, msh=5)
  199.     TKTK_Bitmap.mosaic_rect(self, rect, msw, msh)
  200.   end
  201.  
  202.   # 混合
  203.   def blend_blt(x, y, src_bmp, rect, blend_type=0, opacity=255)
  204.     return if opacity <= 0
  205.     TKTK_Bitmap.blend_blt(self, x, y, src_bmp, rect, blend_type, opacity)
  206.   end
  207.  
  208.   #Png 格式保存
  209.   def png_save(outp, level = 9, filter = PNG_NO_FILTERS)
  210.     if (TKTK_Bitmap.png_save(self, outp, level, filter) != 0)
  211.       raise("Bitmap\#png_save failed")
  212.     end
  213.   end
  214.  
  215.   # 允许更大的 bitmap.new (危険)
  216.   # 宽度 * 高度大约是1073741823
  217.   if TKTK_Bitmap::LARGE_BITMAP
  218.     class << self
  219.       unless method_defined?(:_hn_large_bm__new)
  220.         alias :_hn_large_bm__new :new
  221.       end
  222.       def new(*args)
  223.         if args.size == 2 && args[0] * args[1] >= 4194304
  224.           new_width = args[0]
  225.           new_height = args[1]
  226.           # 暂时以小尺寸作成
  227.           bitmap = _hn_large_bm__new(16, 16)
  228.           TKTK_Bitmap.change_size(bitmap, new_width, new_height)
  229.           return bitmap
  230.         else
  231.            _hn_large_bm__new(*args)
  232.         end
  233.       end
  234.     end # Bitmap.new
  235.   end
  236. end # CLASS Bitmap


没有使用计时器前还可以正常运行,但使用计时器后脚本就报错显示为这个样子
求大神能告诉我是哪里出错了,谢谢

百度截图201512271632.jpg (26.01 KB, 下载次数: 28)

百度截图201512271632.jpg

作者: cinderelmini    时间: 2015-12-27 20:48
据说把【LARGE_BITMAP = true】改成false可以解决……
作者: alicediary    时间: 2015-12-28 17:52
cinderelmini 发表于 2015-12-27 20:48
据说把【LARGE_BITMAP = true】改成false可以解决……

不行诶,将【LARGE_BITMAP = true】改为false后Cache第106行又报错了
作者: alicediary    时间: 2015-12-28 19:51
http://pan.baidu.com/s/1jHj6z9G←范例(网盘链接添加不了只能这样了)
作者: cinderelmini    时间: 2015-12-28 21:27
hhhhh……原来是这样……
是文件格式的问题,把行走图文件夹里面的【$imgbb4fc157b2b5773.sai】转成换成png就好了。
提个小小的建议吧,
就是说psd或者sai什么的,要么别跟要使用的png或者jpg之类格式的文件同名,要么在名字后面格式名前面加上标志,
比如【$imgbb4fc157b2b5773-sai.sai】这样,避免读到同名的rm无法识别的格式,
或者另建一个文件夹把psd、sai什么的塞进去…………
作者: alicediary    时间: 2015-12-29 19:02
真的可以了,万分感谢(。◕∀◕。)




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