Project1

标题: VA灯光脚本灯光一直在左上角 [打印本页]

作者: nbau7953    时间: 2016-7-29 21:31
标题: VA灯光脚本灯光一直在左上角
怎样让灯光与发光事件重合?
作者: nbau7953    时间: 2016-7-29 21:32
  1. =begin
  2.   HN_Light version 1.0.1.0 for VX Ace
  3.         by 半生
  4. http://www.tktkgame.com

  5.   要HN_RG_BITMAP(ver 0.1.2.1以降)

  6. 2012/01/08 ver 1.0.1.2
  7.  队列歩行の仲间に対応

  8. =end

  9. # ----- 在这里设定-----
  10. module HN_Light
  11.   # 简略化0:(精细)~2:(粗暴,负荷轻)
  12.   SIMPLIFY = 1
  13.   
  14.   # 家的烛光类型使用的变量号码
  15.   PLAYER_LIGHT_TYPE = 41

  16.   # 队友的烛光类型使用的变量号码
  17.   FOLLOWER_LIGHT_TYPE = 41
  18.   
  19.   # 黑暗判断上使用的开
  20.   DARK_SWITCH = 21
  21.   
  22.   # 烛光事件识别用的正规表达式
  23.   REGEX_LIGHT = /@LIGHT(\d+)/
  24.   
  25.   # 烛光图像的目录
  26.   LIGHT_IMG_DIR = "Graphics/Pictures/"
  27.   
  28.   # 烛光Bitmap设定
  29.   LIGHTS = [
  30.   # [FILENAME, CELLS, ZOOM, OFFSET_Y, HUE]
  31.     ["light5",     1,  1.5,        0,   0],
  32.     ["light2",     1,  1.0,        0,   0],
  33.     ["light3",     1,  0.8,        0,   0],
  34.     ["light4",     1,  1.0,        0,   0],
  35.     ["light5",     1,  2.0,        0,   0],
  36.     ["light6",     1,  1.0,        0,   0],
  37.     ["light7",     1,  3.0,        0,   0],
  38.     ["light1",     1,  0.5,        0,   0],
  39.     ["light6",     1,  2.0,        0,   0],
  40.     ["light8",     1,  4.0,        0,   0],
  41.     ["light7",     1,  0.5,      -32,   0],
  42.     ["light5",     1,  2.5,        0,   0],
  43.     ["light5",     1,  1.0,        0,   0],
  44.     ["light6",     1,  1.0,        0,   0],
  45.     ["light7",     1,  1.0,        0,   0],
  46.     ["light8",     1,  1.0,        0,   0],
  47.   ]
  48. end
  49. #  ----- 在这里设定 -----

  50. module HN_Light
  51.   # 事件mix-in用
  52.   module LightEvent
  53.     attr_reader :light_type
  54.     def initialize
  55.       super()
  56.       @light_type = 0
  57.     end
  58.    
  59.     def check_light
  60.       @light_type = 0
  61.       return if @list.nil?
  62.       @list.each do |command|
  63.         break if @light_type > 0
  64.         if command.code == 108 or command.code == 408
  65.           command.parameters.each do |line|
  66.             if line =~ REGEX_LIGHT
  67.               @light_type = $1.to_i
  68.               break
  69.             end
  70.           end
  71.         end
  72.       end # END @list.each
  73.     end
  74.    
  75.   end # END module LightEvent
  76.   
  77.   
  78.   class Light
  79.     attr_reader :bitmap
  80.     attr_reader :cells
  81.     attr_reader :width
  82.     attr_reader :height
  83.     attr_reader :ox
  84.     attr_reader :oy
  85.     def initialize(light_type, s_zoom = 1)
  86.       light = LIGHTS[light_type - 1]
  87.       if light.nil?
  88.         # 本来不应该来这里
  89.         @bitmap = Bitmap.new(32, 32)
  90.         @cels = 1
  91.         [url=home.php?mod=space&uid=98379]@zoom[/url] = 1.0
  92.         @oy = 16
  93.         @ox = 16
  94.         @width  = 32
  95.         [url=home.php?mod=space&uid=291977]@height[/url] = 32
  96.       else
  97.         @bitmap = Bitmap.new(LIGHT_IMG_DIR + light[0])
  98.         @bitmap.invert()
  99.         @cells = light[1].to_i
  100.         @cells = 1 if (@cells < 1 or @cells > @bitmap.width)
  101.         @zoom = light[2].to_f
  102.         @zoom = 1.0 if @zoom <= 0.0
  103.         @zoom /= s_zoom
  104.         @width  = @bitmap.width / @cells
  105.         @height = @bitmap.height

  106.         # 缩放处理
  107.         if @zoom != 1.0
  108.           new_width  = (@width * @zoom).round
  109.           new_height = (@height * @zoom).round
  110.           if new_width * new_height < 1
  111.             @zoom = 1.0
  112.           else
  113.             @width = new_width
  114.             @height = new_height
  115.             new_bitmap = Bitmap.new(@width * @cells, @height)
  116.             new_bitmap.stretch_blt(new_bitmap.rect,@bitmap, @bitmap.rect)
  117.             @bitmap.dispose
  118.             @bitmap = new_bitmap
  119.           end
  120.         end
  121.         @ox = @width / 2
  122.         @oy = @height / 2 - light[3].to_i / s_zoom

  123.         # 色相変换
  124.         if ( (hue = light[4].to_i) != 0)
  125.           @bitmap.hue_change(hue)
  126.         end
  127.       end
  128.     end # End def initialize

  129.     # 色调转换
  130.     def dispose
  131.       @bitmap.dispose
  132.       @bitmap = nil
  133.     end
  134.   end

  135. end

  136. class Game_Event
  137.   include HN_Light::LightEvent
  138.   alias :_hn_light__setup :setup_page unless method_defined?(:_hn_light__setup)
  139.   def setup_page(new_page)
  140.     _hn_light__setup(new_page)
  141.     check_light()
  142.   end
  143. end

  144. class Game_Player
  145.   def light_type
  146.     return $game_variables[HN_Light::PLAYER_LIGHT_TYPE]
  147.   end
  148. end

  149. class Game_Follower
  150.   def light_type
  151.     return 0 if !self.visible?
  152.     return $game_variables[HN_Light::FOLLOWER_LIGHT_TYPE]
  153.   end
  154. end

  155. class Game_Map
  156.   attr_reader :light_events
  157.   
  158.   # 更新烛光事件列表
  159.   def refresh_lights
  160.     @light_events = []
  161.     @events.values.each do |event|
  162.       if (event.light_type > 0)
  163.         @light_events.push(event)
  164.       end
  165.     end
  166.   end

  167.   alias :_hn_light__setup_events :setup_events unless method_defined?(:_hn_light__setup_events)
  168.   def setup_events
  169.     _hn_light__setup_events()
  170.     refresh_lights()
  171.   end
  172.   
  173.   alias :_hn_light__refresh :refresh unless method_defined?(:_hn_light__refresh)
  174.   def refresh
  175.     _hn_light__refresh()
  176.     refresh_lights()
  177.   end
  178. end

  179. class Sprite_Dark < Sprite
  180.   @@base_color = Color.new(255,255,255)

  181.   def initialize(viewport = nil)
  182.     super(viewport)
  183.     @width = Graphics.width
  184.     @height = Graphics.height
  185.    
  186.     case HN_Light::SIMPLIFY
  187.     when 1
  188.       @zoom = 2
  189.     when 2
  190.       @zoom = 4
  191.     else
  192.       @zoom = 1
  193.     end
  194.     @width /= @zoom
  195.     @height /= @zoom
  196.     self.zoom_x = @zoom.to_f
  197.     self.zoom_y = @zoom.to_f
  198.    
  199.     self.bitmap = Bitmap.new(@width, @height)
  200.     self.bitmap.fill_rect(self.bitmap.rect, @@base_color)
  201.     self.blend_type = 2 # 混合型(减算)
  202.     self.z = 500
  203.     self.visible = false
  204.     @light_cache = {}
  205.   end

  206.   # 追加烛光
  207.   def add_light(charactor)
  208.     return if charactor.nil?
  209.     light_type = charactor.light_type
  210.     return if (light_type < 1 or light_type > HN_Light::LIGHTS.size)
  211.     unless @light_cache.key?(light_type)
  212.       @light_cache[light_type] = HN_Light::Light.new(light_type, @zoom)
  213.     end
  214.     light = @light_cache[light_type]

  215.     # 画面外什麽都不做
  216.     if @zoom == 1
  217.       return if (charactor.screen_x < 0  - light.width + light.ox)
  218.       return if (charactor.screen_x > @width + light.ox)
  219.       return if (charactor.screen_y < 0 - light.height + light.oy)
  220.       return if (charactor.screen_y > @height + light.oy)
  221.     else
  222.       return if (charactor.screen_x < 0  - (light.width + light.ox) * @zoom)
  223.       return if (charactor.screen_x > (@width + light.ox)  * @zoom)
  224.       return if (charactor.screen_y < 0 - (light.height + light.oy) * @zoom)
  225.       return if (charactor.screen_y > (@height + light.oy) * @zoom)
  226.     end

  227.     # 动画判定
  228.     if light.cells > 1
  229.       index = (Graphics.frame_count / 4) % light.cells
  230.       rect = Rect.new(index * light.width , 0, light.width, light.height)
  231.     else
  232.       rect = light.bitmap.rect
  233.     end
  234.     if @zoom != 1
  235.       p_x = charactor.screen_x / @zoom - light.ox
  236.       p_y = (charactor.screen_y - 16) / @zoom - light.oy
  237.     else
  238.       p_x = charactor.screen_x - light.ox
  239.       p_y = charactor.screen_y - 16 - light.oy
  240.     end
  241.    
  242.     # 乗算合成(3)
  243.     self.bitmap.blend_blt(p_x, p_y, light.bitmap, rect, 3)
  244.   end

  245.   
  246.   def refresh
  247.     self.bitmap.fill_rect(self.bitmap.rect, @@base_color)
  248.     $game_map.light_events.each do |event|
  249.       next if HN_Light::LIGHTS[event.light_type - 1].nil?
  250.       add_light(event)
  251.     end
  252.     add_light($game_player)
  253.     $game_player.followers.each{|f| add_light(f)}
  254.   end
  255.   
  256.   # 更新
  257.   def update
  258.     super
  259.     refresh()
  260.   end
  261.   
  262.   #--------------------------------------------------------------------------
  263.   # ● 解放
  264.   #--------------------------------------------------------------------------
  265.   def dispose
  266.     self.bitmap.dispose
  267.     @light_cache.values.each do |light|
  268.       light.dispose
  269.     end
  270.     super
  271.   end
  272. end


  273. class Spriteset_Map  
  274.   # 动画判定
  275.   def create_dark
  276.     @dark_sprite = Sprite_Dark.new(@viewport1)
  277.   end

  278.   # 更新黑暗Sprite
  279.   def update_dark
  280.     if (@dark_sprite.visible = $game_switches[HN_Light::DARK_SWITCH])
  281.       @dark_sprite.update
  282.     end
  283.   end

  284.   # 破弃黑暗Sprite
  285.   def dispose_dark
  286.     @dark_sprite.dispose
  287.   end
  288.   
  289.   # 初期化
  290.   alias :_dark__initialize :initialize unless private_method_defined?(:_dark__initialize)
  291.   def initialize
  292.     _dark__initialize()
  293.     create_dark()
  294.     update_dark()
  295.   end
  296.   
  297.   # 更新
  298.   alias :_dark__update :update unless method_defined?(:_dark__update)
  299.   def update
  300.     _dark__update()
  301.     update_dark() if !@dark_sprite.nil? and !@dark_sprite.disposed?
  302.   end
  303.   
  304.   # 结束处理
  305.   alias :_dark__dispose :dispose unless method_defined?(:_dark__dispose)
  306.   def dispose
  307.     dispose_dark()
  308.     _dark__dispose()
  309.   end
  310. end
复制代码

这个是脚本




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