Project1

标题: XP仿真VA的窗口样式 [打印本页]

作者: SailCat    时间: 2016-2-23 00:38
标题: XP仿真VA的窗口样式
本帖最后由 SailCat 于 2016-2-23 01:09 编辑

烦死XP的蓝色窗口,想改个和别人不一样的,找不到窗口素材?
好容易找到一个窗口素材,对背景色调不满意?
用这个脚本吧,颜色随便调,美不死你!{:2_275:}

脚本用法看注释,效果图及相关附件在下面:
RUBY 代码复制
  1. #==============================================================================
  2. # ■ VX Ace窗口样式 by SailCat
  3. #------------------------------------------------------------------------------
  4. #  本脚本令XP拥有和VA完全一样的窗口外观。
  5. #   功能:
  6. #    1. 支持VA的窗口式样,包括边框(通过皮肤实现)、底色、扫描水印
  7. #    2. 支持RGSS3的窗口色调改变功能
  8. #    3. 支持RGSS3的窗口开闭效果
  9. #    4. 保留XP特有的窗口皮肤平铺功能(VA只能拉伸)
  10. #    5. 窗口色调支持不同窗口个别调整和灰度变化(RGSS3不支持)
  11. #    6. 扫描水印不喜欢可以关掉(RGSS3关不掉,只能改皮肤)
  12. #   使用方法:
  13. #    1. 插入本脚本到Main前面
  14. #    2. 下载002-VXAce.png并放到Windowskins文件夹
  15. #       你当然也可以用你自己喜欢的XP皮肤或默认皮肤
  16. #    3. (可选)如果要替换VA默认的扫描线效果,制作一个水印放到Pictures文件夹,
  17. #       更改相应设置即可,窗口水印的大小没要求,附件的Scanline为VA默认效果
  18. #    4. 调整窗口的色调:
  19. #       全局调整:使用$game_system.window_tone = Tone.new(r, g, b, gray)
  20. #       个别调整:使用window.tone = Tone.new(r, g, b, gray)
  21. #                 或者window.tone.set(r, g, b, gray)
  22. #    5. 窗口的开闭效果:
  23. #       window.openness = x (x为0-255) 设置打开度,0为完全关,255为完全开
  24. #       window.open或window.close,在相应的Scene的update里调用
  25. #    6. 其他设定见下面的参数表
  26. #==============================================================================
  27. class Window_Base < Window
  28.  
  29.   # 如果你更改了分辨率请更改下面的两个值
  30.   SCREEN_W = 640
  31.   SCREEN_H = 480
  32.   # 如果不要扫描线把下面改为false
  33.   SCANLINE_EFFECT = true
  34.   # 如果更改VA默认的扫描线效果,把下面改为扫描线的文件名(放在Pictures文件夹)
  35.   SCANLINE_FILENAME = ""
  36.   # 窗口垂直打开为false,水平打开为true
  37.   OPEN_HORZ = false
  38.   # 窗口垂直关闭为false, 水平关闭为true
  39.   CLOSE_HORZ = false
  40.   # 窗口的默认色调
  41.   DEFAULT_TONE = Tone.new(-34, 0, 68, 0)
  42.  
  43. #==============================================================================
  44.   alias sailcat_dispose dispose unless method_defined?(:sailcat_dispose)
  45.   alias sailcat_back_opacity= back_opacity= unless method_defined?(:sailcat_back_opacity=)
  46.   alias sailcat_update update unless method_defined?(:sailcat_update)
  47.   #--------------------------------------------------------------------------
  48.   # ● 定义实例变量
  49.   #--------------------------------------------------------------------------
  50.   attr_reader   :tone                     # 窗口的色调
  51.   attr_reader   :openness                 # 窗口的开启程度
  52.   #--------------------------------------------------------------------------
  53.   # ● 初始化对像
  54.   #     x      : 窗口的 X 坐标
  55.   #     y      : 窗口的 Y 坐标
  56.   #     width  : 窗口的宽
  57.   #     height : 窗口的宽
  58.   #--------------------------------------------------------------------------
  59.   def initialize(x, y, width, height)
  60.     super()
  61.     @windowskin_name = $game_system.windowskin_name
  62.     self.windowskin = RPG::Cache.windowskin(@windowskin_name)
  63.     @back_sprite = Sprite.new
  64.     @back_sprite.ox = 0
  65.     @back_sprite.oy = 0
  66.     @scan_sprite = Sprite.new
  67.     @scan_sprite.ox = 0
  68.     @scan_sprite.oy = 0
  69.     @scan_sprite.visible = true
  70.     @opening = false
  71.     @closing = false
  72.     @real_x = x
  73.     @real_y = y
  74.     @real_width = width
  75.     @real_height = height
  76.     self.x = x
  77.     self.y = y
  78.     self.width = width
  79.     self.height = height
  80.     self.z = 100
  81.     self.sailcat_back_opacity = 0
  82.     self.back_opacity = 192
  83.     self.tone = $game_system.window_tone.clone
  84.     draw_background
  85.     self.scanline = SCANLINE_EFFECT
  86.   end
  87.  
  88.   def tone=(tone)
  89.     @tone = tone
  90.     @back_sprite.tone = tone
  91.     @scan_sprite.tone = tone
  92.   end
  93.  
  94.   def update_open
  95.     self.openness += 24
  96.     @opening = false if open?
  97.   end
  98.  
  99.   def open?
  100.     @openness == 255
  101.   end
  102.  
  103.   def open
  104.     @opening = true unless open?
  105.     @closing = false
  106.   end
  107.  
  108.   def update_close
  109.     self.openness -= 24
  110.     @closing = false if close?
  111.   end
  112.  
  113.   def close?
  114.     @openness == 0
  115.   end
  116.  
  117.   def close
  118.     @closing = true unless close?
  119.     @opening = false
  120.   end
  121.  
  122.   def draw_background
  123.     if stretch
  124.       @back_sprite.bitmap = self.windowskin
  125.       @back_sprite.src_rect = Rect.new(0, 0, 128, 128)
  126.       @back_sprite.zoom_x = (width - 4) / 128.0
  127.       @back_sprite.zoom_y = (height - 4) / 128.0
  128.     else
  129.       @back_sprite.bitmap = @tiled_bitmap
  130.       @back_sprite.src_rect = Rect.new(0, 0, width - 4, height - 4)
  131.       @back_sprite.zoom_x = 1.0
  132.       @back_sprite.zoom_y = 1.0
  133.     end
  134.   end
  135.  
  136.   def draw_scanline
  137.     return if self.scanline == false or @scan_bitmap != nil
  138.     if SCANLINE_FILENAME == ""
  139.       @scan_bitmap = Bitmap.new(SCREEN_W - 4, SCREEN_H - 4)
  140.       for i in 0..((SCREEN_H - 5) / 2)
  141.         @scan_bitmap.fill_rect(0, i * 2 + 1, SCREEN_W - 4, 1, Color.new(5, 5, 5, 40))
  142.       end
  143.     else
  144.       bmp = RPG::Cache.picture(SCANLINE_FILENAME)
  145.       @scan_bitmap = Bitmap.new(SCREEN_W - 4, SCREEN_H - 4)
  146.       for i in 0..((SCREEN_W - 5) / bmp.width)
  147.         for j in 0..((SCREEN_H - 5) / bmp.height)
  148.           @scan_bitmap.blt(i * bmp.width, j * bmp.height, bmp, Rect.new(0, 0, bmp.width, bmp.height))
  149.         end
  150.       end
  151.     end
  152.     @scan_sprite.bitmap = @scan_bitmap
  153.     @scan_sprite.src_rect = Rect.new(0, 0, width - 4, height - 4)
  154.     @scan_sprite.zoom_x = 1.0
  155.     @scan_sprite.zoom_y = 1.0
  156.   end
  157.  
  158.   def dispose
  159.     sailcat_dispose
  160.     @back_sprite.dispose
  161.     @tiled_bitmap.dispose
  162.     @scan_sprite.dispose
  163.     @scan_bitmap.dispose
  164.   end
  165.  
  166.   def back_opacity
  167.     return @back_sprite.opacity
  168.   end
  169.  
  170.   def back_opacity=(value)
  171.     @back_sprite.opacity = value
  172.     @scan_sprite.opacity = value
  173.   end
  174.  
  175.   def x=(x)
  176.     @real_x = x
  177.     super
  178.     @back_sprite.x = x + 2
  179.     @scan_sprite.x = x + 2
  180.   end
  181.  
  182.   def y=(y)
  183.     @real_y = y
  184.     super
  185.     @back_sprite.y = y + 2
  186.     @scan_sprite.y = y + 2
  187.   end
  188.  
  189.   def z=(z)
  190.     super
  191.     @back_sprite.z = z - 2
  192.     @scan_sprite.z = z - 1
  193.   end
  194.  
  195.   def width=(width)
  196.     @real_width = width
  197.     super
  198.     if stretch
  199.       @back_sprite.zoom_x = (width - 4) / 128.0
  200.     else
  201.       @back_sprite.src_rect = Rect.new(0, 0, width - 4, height - 4)
  202.     end
  203.     @scan_sprite.src_rect = Rect.new(0, 0, width - 4, height - 4)
  204.   end
  205.  
  206.   def height=(height)
  207.     @real_height = height
  208.     super
  209.     if stretch
  210.       @back_sprite.zoom_y = (height - 4) / 128.0
  211.     else
  212.       @back_sprite.src_rect = Rect.new(0, 0, width - 4, height - 4)
  213.     end
  214.     @scan_sprite.src_rect = Rect.new(0, 0, width - 4, height - 4)
  215.   end
  216.  
  217.   def visible=(visible)
  218.     super
  219.     @back_sprite.visible = visible
  220.     @scan_sprite.visible = visible
  221.   end
  222.  
  223.   def stretch=(stretch)
  224.     if stretch != self.stretch
  225.       super
  226.       @back_sprite.bitmap.dispose if stretch
  227.       draw_background
  228.     end
  229.   end
  230.  
  231.   def scanline
  232.     @scan_sprite.visible
  233.   end
  234.  
  235.   def scanline=(scanline)
  236.     @scan_sprite.visible = scanline
  237.     draw_scanline
  238.   end
  239.  
  240.   def windowskin=(windowskin)
  241.     super
  242.     unless @tiled_bitmap.nil? or @tiled_bitmap.disposed?
  243.       @tiled_bitmap.dispose
  244.     end
  245.     @tiled_bitmap = Bitmap.new(SCREEN_W - 4, SCREEN_H - 4)
  246.     for i in 0..4
  247.       for j in 0..4
  248.         @tiled_bitmap.blt(i * 128, j * 128, self.windowskin,
  249.           Rect.new(0, 0, 128, 128))
  250.       end
  251.     end
  252.     draw_background unless @back_sprite.nil?
  253.   end
  254.  
  255.   def update
  256.     sailcat_update
  257.     update_open if @opening
  258.     update_close if @closing
  259.   end
  260.  
  261.   def openness=(openness)
  262.     last_x = @real_x
  263.     last_y = @real_y
  264.     last_w = @real_width
  265.     last_h = @real_height
  266.     @openness = [[openness, 255].min, 0].max
  267.     if OPEN_HORZ
  268.       self.x = last_x + (last_w / 2) * (255 - @openness) / 255
  269.       self.width = last_w * @openness / 255
  270.       self.ox = self.x - last_x
  271.       @real_x = last_x
  272.       @real_width = last_w
  273.     else
  274.       self.y = last_y + (last_h / 2) * (255 - @openness) / 255
  275.       self.height = last_h * @openness / 255
  276.       self.oy = self.y - last_y
  277.       @real_y = last_y
  278.       @real_height = last_h
  279.     end
  280.     self.contents_opacity = @openness
  281.   end
  282. end
  283.  
  284. class Game_System
  285.  
  286.   #--------------------------------------------------------------------------
  287.   # ● 取得窗口的色调
  288.   #--------------------------------------------------------------------------
  289.   def window_tone
  290.     # 返回窗口的色调,未设置返回默认值
  291.     @window_tone.nil? ? (@window_tone = Window_Base::DEFAULT_TONE) : @window_tone
  292.   end
  293.  
  294.   #--------------------------------------------------------------------------
  295.   # ● 设置窗口的色调
  296.   #     value : 色调值,传入错误的参数不会更改色调
  297.   #--------------------------------------------------------------------------
  298.   def window_tone=(value)
  299.     @window_tone = value if value.is_a?(Tone)
  300.   end
  301. end


搭配的附件:
1. VA的默认皮肤(已转为XP能用的格式)

2. VA的扫描线效果文件(可以不要,能自动画出来)

3. 范例工程
Window_VA.zip (207.93 KB, 下载次数: 68, 售价: 1 星屑)

效果图:
这是所有设定全仿真VA的效果

这是每个窗口随机设定一个色调的效果







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