Project1

标题: 影子脚本如何不卡 [打印本页]

作者: Coder7447    时间: 2015-7-11 15:48
标题: 影子脚本如何不卡
本帖最后由 Coder7447 于 2015-7-11 20:19 编辑

我用了影子生成脚本   
RUBY 代码复制
  1. #使用方法:不透明的物体在光源旁边会产生一个阴影。
  2.  
  3. #所以,在光源的事件里面(例如火),请在第一页加上一个注释“s”(请不要带引号)
  4.  
  5. #然后将此脚本命名为“人物阴影”插入到main上方即可。
  6.  
  7.  
  8. #==============================================================================
  9.  
  10. # ■ 阴影精灵 (渐变精灵 )
  11.  
  12. # 以 Genzai Kawakami的阴影脚本为基础,
  13. #  Rataime为其重写和更新,
  14. #  Boushy 为其添加附属功能
  15.  
  16. #  精灵使者汉化
  17.  
  18. #==============================================================================
  19.  
  20.  
  21. CATERPILLAR_COMPATIBLE = true
  22.  
  23.  
  24. class Game_Party
  25.  
  26. attr_reader :characters
  27.  
  28. end
  29.  
  30.  
  31. class Sprite_Shadow < RPG::Sprite
  32.  
  33.  
  34. attr_accessor :character
  35.  
  36.  
  37. def initialize(viewport, character = nil,source = nil,anglemin=0,anglemax=0,distancemax=0)
  38.  
  39.    super(viewport)
  40.  
  41.    @anglemin=anglemin.to_f
  42.  
  43.    @anglemax=anglemax.to_f
  44.  
  45.    @distancemax=distancemax.to_f
  46.  
  47.    @character = character
  48.  
  49.    @source = source
  50.  
  51.    update
  52.  
  53. end
  54.  
  55.  
  56. def update
  57.  
  58.    super
  59.  
  60.  
  61.    if (@tile_id != @character.tile_id or
  62.  
  63.       @character_name != @character.character_name or
  64.  
  65.       @character_hue != @character.character_hue)# and ( @character.screen_x >= 0 and  @character.screen_x <=640 and  @character.screen_y>=0 and  @character.screen_y <= 480)
  66.  
  67.      @tile_id = @character.tile_id
  68.  
  69.      @character_name = @character.character_name
  70.  
  71.      @character_hue = @character.character_hue
  72.      if   @character_name.include?("AC") and  not   @character_name.include?("=4")
  73.             if @character.direction == 4
  74.       self.mirror = false
  75.     else
  76.        self.mirror = true
  77.      end
  78.      else
  79.             if @character.direction == 4
  80.       self.mirror = true
  81.     else
  82.        self.mirror = false
  83.      end
  84.      end
  85.      if @tile_id >= 384
  86.  
  87.        self.bitmap = RPG::Cache.tile($game_map.tileset_name,
  88.  
  89.          @tile_id, @character.character_hue)
  90.  
  91.        self.src_rect.set(0, 0, 32, 32)
  92.  
  93.        self.ox = 16
  94.  
  95.        self.oy = 32
  96.  
  97.      else
  98.  
  99.        self.bitmap = RPG::Cache.character(@character.character_name,
  100.  
  101.          @character.character_hue)
  102.  
  103.        @cw = bitmap.width / 4
  104.  
  105.        @cw = bitmap.width / 4
  106.     if not   @character_name.include?("=4")
  107.        @ch = bitmap.height / 4
  108.      else
  109.        @ch = bitmap.height / 4
  110.        end
  111.  
  112.  
  113.        self.ox = @cw / 2
  114.  
  115.        self.oy = @ch
  116.  
  117.      end
  118.  
  119.    end
  120.  
  121.    self.visible = (not @character.transparent)
  122. #self.visible = [email protected] && @character.screen_x.between?(0, 640) && @character.screen_y.between?(0,480) # 大致坐标,并不精确
  123.  
  124.  
  125.     if @tile_id == 0
  126.       # 设置传送目标的矩形
  127.     if not   @character_name.include?("=4")
  128.       if @character.pattern >= 4
  129.       sx = (@character.pattern - 4) * @cw
  130.         else
  131.       sx = @character.pattern * @cw
  132.     end
  133.       if @character.pattern >= 4
  134.         sy = (4 - 2) / 2 * @ch  
  135.        else
  136.       sy = (2 - 2) / 2 * @ch
  137.       end
  138.       self.src_rect.set(sx, sy, @cw, @ch)
  139.     else
  140.             sx = @character.pattern * @cw
  141.       sy = (@character.direction - 2) / 2 * @ch
  142.       self.src_rect.set(sx, sy, @cw, @ch)
  143.       end
  144.     end
  145.  
  146.    self.x = @character.screen_x
  147.  
  148.    self.y = @character.screen_y-5
  149.  
  150.    self.z = @character.screen_z(@ch)-1
  151.  
  152.    self.opacity = @character.opacity
  153.  
  154.    self.blend_type = @character.blend_type
  155.  
  156.    self.bush_depth = @character.bush_depth
  157.  
  158.    #if @character.animation_id != 0
  159.  
  160.      #animation = $data_animations[@character.animation_id]
  161.  
  162.     # animation(animation, true)
  163.  
  164.     # @character.animation_id = 0
  165.  
  166.    #end
  167.  
  168.    @deltax=@source.x-self.x
  169.  
  170.    @deltay= @source.y-self.y
  171.  
  172.    self.angle = 57.3*Math.atan2(@deltax, @deltay )
  173.  
  174.    @angle_trigo=self.angle+90
  175.  
  176.    if @angle_trigo<0
  177.  
  178.      @angle_trigo=360+@angle_trigo
  179.  
  180.    end
  181.  
  182.    self.color = Color.new(0, 0, 0)
  183.  
  184.    @distance = ((@deltax ** 2) + (@deltay ** 2))
  185.  
  186.    if$game_map.shadows==-1
  187.  
  188.      self.opacity = 0
  189.    else
  190.  
  191.      self.opacity = 1200000/(@distance+6000)   
  192.    end
  193.  
  194.    if @character.screen_x >= 640 or @character.screen_x <= 0 or @character.screen_y >= 480 or @character.screen_y <= 0
  195.    self.opacity = 0
  196.      end   
  197.  
  198.    @distance = @distance ** 0.5
  199.  
  200.    if @distancemax !=0 and @distance>=@distancemax
  201.  
  202.      self.opacity=0
  203.  
  204.    end
  205.  
  206.    if @anglemin !=0 or @anglemax !=0
  207.  
  208.       if (@angle_trigo<@anglemin or @angle_trigo>@anglemax) and @anglemin<@anglemax
  209.  
  210.         self.opacity=0
  211.  
  212.       end
  213.  
  214.       if (@angle_trigo<@anglemin and @angle_trigo>@anglemax) and @anglemin>@anglemax
  215.  
  216.         self.opacity=0
  217.  
  218.       end     
  219.  
  220.    end
  221.  
  222. end
  223.  
  224. end
  225.  
  226.  
  227. #===================================================
  228.  
  229. # ■ 重定义 Sprite_Character
  230.  
  231. #===================================================
  232.  
  233.  
  234. class Sprite_Character < RPG::Sprite
  235.  
  236. alias shadow_initialize initialize
  237.  
  238.  
  239. def initialize(viewport, character = nil)
  240.  
  241.    @character = character
  242.   # @character = nil
  243.    super(viewport)
  244.  
  245.    @ombrelist=[]
  246.  
  247.    if (character.is_a?(Game_Event) and character.list!=nil and character.list[0].code == 108 and character.list[0].parameters == ["s"])
  248.  
  249.      if (character.list[1]!=nil and character.list[1].code == 108)
  250.  
  251.        @anglemin=character.list[1].parameters[0]
  252.  
  253.      end
  254.  
  255.      if (character.list[2]!=nil and character.list[2].code == 108)
  256.  
  257.        @anglemax=character.list[2].parameters[0]
  258.  
  259.      end
  260.  
  261.      if (character.list[3]!=nil and character.list[3].code == 108)
  262.  
  263.        @distancemax=character.list[3].parameters[0]
  264.  
  265.      end  
  266.  
  267.     for i in $game_map.events.keys.sort
  268.  
  269.      if $game_map.events[i].arpg_hp <=0 and ($game_map.events[i].is_a?(Game_Event) and not ($game_map.events[i].list[0].code == 108 && ($game_map.events[i].list[0].parameters == ["NotShadow"]) or $game_map.events[i].list[0].parameters == ["s"]) ) and (not $game_map.events[i].name.include?("NotShadow") ) #$game_map.events[i].list!=nil and $game_map.events[i].list[0].code == 108 and $game_map.events[i].list[0].parameters == ["o"])
  270.  
  271.        @ombrelist[i+1] = Sprite_Shadow.new(viewport, $game_map.events[i],self,@anglemin,@anglemax,@distancemax)
  272.  
  273.      end
  274.  
  275.     end
  276.  
  277.     @ombrelist[1] = Sprite_Shadow.new(viewport, $game_player,self,@anglemin,@anglemax,@distancemax)
  278.  
  279. #===================================================
  280.  
  281. # ● 原装人物跟随兼容脚本
  282.  
  283. #===================================================
  284.  
  285. if CATERPILLAR_COMPATIBLE and $game_party.characters!=nil
  286.  
  287.  
  288. for member in $game_party.characters
  289.  
  290.    @ombrelist.push(Sprite_Shadow.new(viewport, member,self,@anglemin,@anglemax,@distancemax))
  291.  
  292. end
  293.  
  294.  
  295. end
  296.  
  297. #===================================================
  298.  
  299. # ● 兼容脚本结束
  300.  
  301. #===================================================
  302.  
  303.    end
  304.  
  305.    shadow_initialize(viewport, @character)
  306.  
  307. end
  308.  
  309.  
  310. alias shadow_update update
  311.  
  312.  
  313. def update
  314.    shadow_update
  315.    if @ombrelist!=[]
  316.  
  317.      for i in [email]1..@ombrelist.size[/email]
  318.   # if @character.x >= 7 # character.x = @x -1
  319.        if @ombrelist[i]!=nil
  320.  
  321.          @ombrelist[i].update
  322.  
  323.        end
  324.   # end
  325.      end
  326.  
  327.    end
  328.  
  329. end  
  330.  
  331.  
  332. end
  333.  
  334.  
  335. #===================================================
  336.  
  337. # ■ 新定义类Scene_Save
  338.  
  339. #===================================================
  340.  
  341. class Scene_Save < Scene_File
  342.  
  343.  
  344. alias shadows_write_save_data write_save_data
  345.  
  346.  
  347. def write_save_data(file)
  348.  
  349.    $game_map.shadows = nil
  350.  
  351.    shadows_write_save_data(file)
  352.  
  353. end
  354.  
  355. end
  356.  
  357.  
  358. #===================================================
  359.  
  360. # ■ 新定义类 Game_Map
  361.  
  362. #===================================================
  363.  
  364. class Game_Map
  365.  
  366. attr_accessor :shadows
  367.  
  368. end


在地图上创建30个光源 ,之后即使主角离开光源 即使影子不存在 也会因为影子的刷新(虽然看不见 但仍然存在刷新)而使FPS下降,
请问如何解决

即 透明度==0的时候  把它释放,该如何写?   忘赐教  
作者: Coder7447    时间: 2015-7-11 21:28
那没有办法解决了吗
作者: 冷峻逸    时间: 2015-7-12 20:44
提示: 作者被禁止或删除 内容自动屏蔽




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