Project1

标题: Marshal拓展系列(文件dump/load)【3】 [打印本页]

作者: 一箭烂YiJL    时间: 2011-5-7 14:50
标题: Marshal拓展系列(文件dump/load)【3】
本帖最后由 一箭烂YiJL 于 2011-5-22 10:15 编辑


又是一堆不大众化的脚本,当我们用类似Marshal(Bitmap.new, file_name)的时候,
会发现无法dump。其实Bitmap来说61已经做了,但是不能连里面的font类都保存,所以这里提供一些Marshal。
同时欢迎有兴趣的同学也来写写吧...
目前没有XP版本的原因是我不知道XP的那些类的属性= =,有人想要才弄...


目录
(目前收录量:3)


Font的Marshal

  1. #==============================================================================
  2. # ■ Font的Marshal by 一箭烂
  3. #==============================================================================
  4. class Font
  5.   #--------------------------------------------------------------------------
  6.   # ● 存放
  7.   #--------------------------------------------------------------------------
  8.   def marshal_dump
  9.     [self.name, self.size, self.bold, self.italic, self.shadow, self.color]
  10.   end
  11.   #--------------------------------------------------------------------------
  12.   # ● 读取
  13.   #--------------------------------------------------------------------------
  14.   def marshal_load(obj)
  15.     initialize
  16.     self.name, self.size, self.bold, self.italic, self.shadow, self.color = obj
  17.   end
  18. end
复制代码
对应的测试脚本:
  1. a = Font.new
  2. a.size = 33

  3. b = File.open("b.txt", "wb")
  4. Marshal.dump(a, b)
  5. b.close

  6. b = File.open("b.txt", "rb")
  7. p Marshal.load(b).size
  8. b.close
复制代码

作者: 一箭烂YiJL    时间: 2011-5-7 14:55
良性连帖,请勿扣分
Bitmap的Marshal(包括里面的Font)


特色只是可以连Bitmap的font都可以一起Marshal。
  1. #==============================================================================
  2. # ■ Bitmap的Marshal by 柳之一(原创) + 一箭烂(添加 dump Font类)
  3. #==============================================================================
  4. class Bitmap
  5.   #--------------------------------------------------------------------------
  6.   # ● 传送到内存的API函数
  7.   #--------------------------------------------------------------------------
  8.   RtlMoveMemory_pi = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
  9.   RtlMoveMemory_ip = Win32API.new('kernel32', 'RtlMoveMemory', 'ipi', 'i')
  10.   #--------------------------------------------------------------------------
  11.   # ● 存放
  12.   #--------------------------------------------------------------------------
  13.   def _dump(limit)
  14.     data = "rgba" * width * height
  15.     RtlMoveMemory_pi.call(data, address, data.length)
  16.     font = Marshal.dump(self.font)
  17.     data = Zlib::Deflate.deflate(data)
  18.     [data.size, width, height, data, font].pack("LLLa#{data.size}a*")
  19.   end
  20.   #--------------------------------------------------------------------------
  21.   # ● 读取
  22.   #--------------------------------------------------------------------------
  23.   def self._load(obj)
  24.     size, w, h, zdata, font = obj.unpack("LLLa#{obj.unpack("L")}a*")
  25.     b = self.new(w, h)
  26.     RtlMoveMemory_ip.call(b.address, Zlib::Inflate.inflate(zdata), w * h * 4)
  27.     b.font = Marshal.load(font)
  28.     return b
  29.   end
  30.   #--------------------------------------------------------------------------
  31.   # ● Bitmap地址
  32.   #--------------------------------------------------------------------------
  33. # [[[bitmap.object_id * 2 + 16] + 8] + 16] == 数据的开头
  34.   def address
  35.     buffer, ad = "rgba", object_id * 2 + 16
  36.     RtlMoveMemory_pi.call(buffer, ad, 4)
  37.     ad = buffer.unpack("L")[0] + 8
  38.     RtlMoveMemory_pi.call(buffer, ad, 4)
  39.     ad = buffer.unpack("L")[0] + 16
  40.     RtlMoveMemory_pi.call(buffer, ad, 4)
  41.     return buffer.unpack("L")[0]
  42.   end
  43. end
复制代码

作者: wwqrw    时间: 2011-5-7 15:01
进来顶一下楼主的~
作者: 一箭烂YiJL    时间: 2011-5-7 15:06
本帖最后由 一箭烂YiJL 于 2011-5-7 15:08 编辑

有连帖垫,可以安心连帖咯= =
Viewport的Marshal

有关flash(color, duration)这个函数的参数就应该无法储存,其实他们有变量名字么?
  1. #==============================================================================
  2. # ■ Viewport的Marshal   by 一箭烂
  3. #==============================================================================
  4. class Viewport
  5.   #--------------------------------------------------------------------------
  6.   # ● 存放
  7.   #--------------------------------------------------------------------------
  8.   def marshal_dump
  9.     [self.rect, self.visible, self.z, self.ox, self.oy, self.color, self.tone]
  10.   end
  11.   #--------------------------------------------------------------------------
  12.   # ● 读取
  13.   #--------------------------------------------------------------------------
  14.   def marshal_load(obj)
  15.     rect = obj[0]
  16.     initialize(rect)
  17.     self.rect, self.visible, self.z, self.ox, self.oy, self.color, self.tone = obj
  18.   end
  19. end
复制代码

作者: summer92    时间: 2011-5-7 21:52
Font能Marshal也就是说,不用安装字体了? 很多繁体游戏很悲剧
作者: 一箭烂YiJL    时间: 2011-5-7 23:11
我想这些东西都没什么人用的了,
于是决定其余的不写了,稍微有脚本常识的人就会知道怎么改来用的了。
作者: 灼眼的夏娜    时间: 2011-5-25 13:50
不错.. 推荐一个具体的应用:http://rpg.blue/thread-118882-1-1.html (被PIA走~
作者: 一箭烂YiJL    时间: 2011-5-25 16:54
灼眼的夏娜 发表于 2011-5-25 13:50
不错.. 推荐一个具体的应用:http://rpg.blue/thread-118882-1-1.html (被PIA走~

惊见夏娜大人...
发现那个帖子里面已经有这个讲解了...
但是类一旦继承后就可能储存成员不足,甚至是初始化错误。(当然想偷懒不重定义函数啦~~~)
可以拿到全部成员变量 instance_variables ? 但是 initialize 的参数就不知怎办了...
作者: 一瞬间的幻觉    时间: 2011-6-6 05:32
我猜我三年之内都用不到这些脚本的

谢谢剑兰童鞋分享!希望能写出更多更好的作品
作者: 574656549    时间: 2012-3-13 12:33
提示: 作者被禁止或删除 内容自动屏蔽
作者: hanying1703    时间: 2013-3-2 17:59
求问如何利用这个,把变量角色信息储存到文件中 @一箭烂YiJL  




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