设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1614|回复: 8
打印 上一主题 下一主题

[已经过期] \\ 求大神帮助 影子脚本和局部刷新地图起了冲突

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
70 小时
注册时间
2014-10-11
帖子
50
跳转到指定楼层
1
发表于 2015-2-10 20:54:44 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 风晴生 于 2015-2-10 21:11 编辑

如题 我用了 局部刷新事件脚本 和  太阳精灵影子脚本 可是当角色走出一个屏幕(640*480)时 就会出现影子残留的情况

如图:
         
求大神帮忙解决 ,
   



附上脚本

局部刷新事件  :
RUBY 代码复制
  1. #======================================
  2. # ■ Anti Event Lag Script
  3. #======================================
  4. #  By: Near Fantastica
  5. #   Date: 12.06.05
  6. #   Version: 3
  7. #======================================
  8. #======================================
  9. # ■ Game_Map
  10. #======================================
  11. class Game_Map
  12.   #--------------------------------------------------------------------------
  13.   def in_range?(object)
  14.     screne_x = $game_map.display_x
  15.     screne_x -= 256
  16.     screne_y = $game_map.display_y
  17.     screne_y -= 256
  18.     screne_width = $game_map.display_x
  19.     screne_width += 2816  
  20.     screne_height = $game_map.display_y
  21.     screne_height += 2176 #- 400
  22.     return false if object.real_x <= screne_x  #- 128
  23.     return false if object.real_x >= screne_width# - 128
  24.     return false if object.real_y <= screne_y #- 16000# + 140
  25.     return false if object.real_y >= screne_height
  26.     return true
  27.   end
  28.   #--------------------------------------------------------------------------
  29.   def update
  30.     if $game_map.need_refresh
  31.       refresh
  32.     end
  33.     if @scroll_rest > 0
  34.       distance = 2 ** @scroll_speed
  35.       case @scroll_direction
  36.       when 2
  37.         scroll_down(distance)
  38.       when 4
  39.         scroll_left(distance)
  40.       when 6   
  41.         scroll_right(distance)
  42.       when 8   
  43.         scroll_up(distance)
  44.       end
  45.       @scroll_rest -= distance
  46.     end
  47.     for event in @events.values
  48.       if in_range?(event) or event.trigger == 3 or (event.trigger == 4 and @arpg_id == 0)
  49.         event.update
  50.       end
  51.     end
  52.     for common_event in @common_events.values
  53.       common_event.update
  54.     end
  55.     @fog_ox -= @fog_sx / 8.0
  56.     @fog_oy -= @fog_sy / 8.0
  57.     if @fog_tone_duration >= 1
  58.       d = @fog_tone_duration
  59.       target = @fog_tone_target
  60.       @fog_tone.red = (@fog_tone.red * (d - 1) + target.red) / d
  61.       @fog_tone.green = (@fog_tone.green * (d - 1) + target.green) / d
  62.       @fog_tone.blue = (@fog_tone.blue * (d - 1) + target.blue) / d
  63.       @fog_tone.gray = (@fog_tone.gray * (d - 1) + target.gray) / d
  64.       @fog_tone_duration -= 1
  65.     end
  66.     if @fog_opacity_duration >= 1
  67.       d = @fog_opacity_duration
  68.       @fog_opacity = (@fog_opacity * (d - 1) + @fog_opacity_target) / d
  69.       @fog_opacity_duration -= 1
  70.     end
  71.   end
  72. end
  73. #======================================
  74. # ■ Spriteset_Map
  75. #======================================
  76. class Spriteset_Map
  77.   #--------------------------------------------------------------------------
  78.   def in_range?(object)
  79.     screne_x = $game_map.display_x
  80.     screne_x -= 256
  81.     screne_y = $game_map.display_y
  82.     screne_y -= 256
  83.     screne_width = $game_map.display_x
  84.     screne_width += 2816
  85.     screne_height = $game_map.display_y
  86.     screne_height += 2176
  87.     return false if object.real_x <= screne_x
  88.     return false if object.real_x >= screne_width
  89.     return false if object.real_y <= screne_y
  90.     return false if object.real_y >= screne_height
  91.     return true
  92.   end
  93.   #--------------------------------------------------------------------------
  94.   def update
  95.     if @panorama_name != $game_map.panorama_name or
  96.         @panorama_hue != $game_map.panorama_hue
  97.       @panorama_name = $game_map.panorama_name
  98.       @panorama_hue = $game_map.panorama_hue
  99.       if @panorama.bitmap != nil
  100.         @panorama.bitmap.dispose
  101.         @panorama.bitmap = nil
  102.       end
  103.       if @panorama_name != ""
  104.         @panorama.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
  105.       end
  106.       Graphics.frame_reset
  107.     end
  108.     if @fog_name != $game_map.fog_name or @fog_hue != $game_map.fog_hue
  109.       @fog_name = $game_map.fog_name
  110.       @fog_hue = $game_map.fog_hue
  111.       if @fog.bitmap != nil
  112.         @fog.bitmap.dispose
  113.         @fog.bitmap = nil
  114.       end
  115.       if @fog_name != ""
  116.         @fog.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
  117.       end
  118.       Graphics.frame_reset
  119.     end
  120.     @tilemap.ox = $game_map.display_x / 4
  121.     @tilemap.oy = $game_map.display_y / 4
  122.     @tilemap.update
  123.     @panorama.ox = $game_map.display_x / 8
  124.     @panorama.oy = $game_map.display_y / 8
  125.     @fog.zoom_x = $game_map.fog_zoom / 100.0
  126.     @fog.zoom_y = $game_map.fog_zoom / 100.0
  127.     @fog.opacity = $game_map.fog_opacity
  128.     @fog.blend_type = $game_map.fog_blend_type
  129.     @fog.ox = $game_map.display_x / 4 + $game_map.fog_ox
  130.     @fog.oy = $game_map.display_y / 4 + $game_map.fog_oy
  131.     @fog.tone = $game_map.fog_tone
  132.     i=0
  133.     for sprite in @character_sprites
  134.       if sprite.character.is_a?(Game_Event)
  135.         if in_range?(sprite.character) or sprite.character.trigger == 3 or sprite.character.trigger == 4
  136.           sprite.update
  137.           i+=1
  138.         end
  139.       else
  140.         sprite.update
  141.         i+=1
  142.       end
  143.     end
  144.     #p i
  145.     @weather.type = $game_screen.weather_type
  146.     @weather.max = $game_screen.weather_max
  147.     @weather.ox = $game_map.display_x / 4
  148.     @weather.oy = $game_map.display_y / 4
  149.     @weather.update
  150.     for sprite in @picture_sprites
  151.       sprite.update
  152.     end
  153.     @timer_sprite.update
  154.     @viewport1.tone = $game_screen.tone
  155.     @viewport1.ox = $game_screen.shake
  156.     @viewport3.color = $game_screen.flash_color
  157.     @viewport1.update
  158.     @viewport3.update
  159.   end
  160. end


太阳精灵影子脚本

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.  
  123.     if @tile_id == 0
  124.       # 设置传送目标的矩形
  125.     if not   @character_name.include?("=4")
  126.       if @character.pattern >= 4
  127.       sx = (@character.pattern - 4) * @cw
  128.         else
  129.       sx = @character.pattern * @cw
  130.     end
  131.       if @character.pattern >= 4
  132.         sy = (4 - 2) / 2 * @ch  
  133.        else
  134.       sy = (2 - 2) / 2 * @ch
  135.       end
  136.       self.src_rect.set(sx, sy, @cw, @ch)
  137.     else
  138.             sx = @character.pattern * @cw
  139.       sy = (@character.direction - 2) / 2 * @ch
  140.       self.src_rect.set(sx, sy, @cw, @ch)
  141.       end
  142.     end
  143.  
  144.    self.x = @character.screen_x
  145.  
  146.    self.y = @character.screen_y-5
  147.  
  148.    self.z = @character.screen_z(@ch)-1
  149.  
  150.    self.opacity = @character.opacity
  151.  
  152.    self.blend_type = @character.blend_type
  153.  
  154.    self.bush_depth = @character.bush_depth
  155.  
  156.    #if @character.animation_id != 0
  157.  
  158.      #animation = $data_animations[@character.animation_id]
  159.  
  160.     # animation(animation, true)
  161.  
  162.     # @character.animation_id = 0
  163.  
  164.    #end
  165.  
  166.    @deltax=@source.x-self.x
  167.  
  168.    @deltay= @source.y-self.y
  169.  
  170.    self.angle = 57.3*Math.atan2(@deltax, @deltay )
  171.  
  172.    @angle_trigo=self.angle+90
  173.  
  174.    if @angle_trigo<0
  175.  
  176.      @angle_trigo=360+@angle_trigo
  177.  
  178.    end
  179.  
  180.    self.color = Color.new(0, 0, 0)
  181.  
  182.    @distance = ((@deltax ** 2) + (@deltay ** 2))
  183.  
  184.    if$game_map.shadows==-1
  185.  
  186.      self.opacity = 0
  187.    else
  188.  
  189.      self.opacity = 1200000/(@distance+6000)   
  190.    end
  191.  
  192.    if @character.screen_x >= 640 or @character.screen_x <= 0 or @character.screen_y >= 480 or @character.screen_y <= 0
  193.    self.opacity = 0
  194.      end   
  195.  
  196.    @distance = @distance ** 0.5
  197.  
  198.    if @distancemax !=0 and @distance>=@distancemax
  199.  
  200.      self.opacity=0
  201.  
  202.    end
  203.  
  204.    if @anglemin !=0 or @anglemax !=0
  205.  
  206.       if (@angle_trigo<@anglemin or @angle_trigo>@anglemax) and @anglemin<@anglemax
  207.  
  208.         self.opacity=0
  209.  
  210.       end
  211.  
  212.       if (@angle_trigo<@anglemin and @angle_trigo>@anglemax) and @anglemin>@anglemax
  213.  
  214.         self.opacity=0
  215.  
  216.       end     
  217.  
  218.    end
  219.  
  220. end
  221.  
  222. end
  223.  
  224.  
  225. #===================================================
  226.  
  227. # ■ 重定义 Sprite_Character
  228.  
  229. #===================================================
  230.  
  231.  
  232. class Sprite_Character < RPG::Sprite
  233.  
  234. alias shadow_initialize initialize
  235.  
  236.  
  237. def initialize(viewport, character = nil)
  238.  
  239.    @character = character
  240.   # @character = nil
  241.    super(viewport)
  242.  
  243.    @ombrelist=[]
  244.  
  245.    if (character.is_a?(Game_Event) and character.list!=nil and character.list[0].code == 108 and character.list[0].parameters == ["s"])
  246.  
  247.      if (character.list[1]!=nil and character.list[1].code == 108)
  248.  
  249.        @anglemin=character.list[1].parameters[0]
  250.  
  251.      end
  252.  
  253.      if (character.list[2]!=nil and character.list[2].code == 108)
  254.  
  255.        @anglemax=character.list[2].parameters[0]
  256.  
  257.      end
  258.  
  259.      if (character.list[3]!=nil and character.list[3].code == 108)
  260.  
  261.        @distancemax=character.list[3].parameters[0]
  262.  
  263.      end  
  264.  
  265.     for i in $game_map.events.keys.sort
  266.  
  267.      if ($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"]) ) #$game_map.events[i].list!=nil and $game_map.events[i].list[0].code == 108 and $game_map.events[i].list[0].parameters == ["o"])
  268.  
  269.        @ombrelist[i+1] = Sprite_Shadow.new(viewport, $game_map.events[i],self,@anglemin,@anglemax,@distancemax)
  270.  
  271.      end
  272.  
  273.     end
  274.  
  275.     @ombrelist[1] = Sprite_Shadow.new(viewport, $game_player,self,@anglemin,@anglemax,@distancemax)
  276.  
  277. #===================================================
  278.  
  279. # ● 原装人物跟随兼容脚本
  280.  
  281. #===================================================
  282.  
  283. if CATERPILLAR_COMPATIBLE and $game_party.characters!=nil
  284.  
  285.  
  286. for member in $game_party.characters
  287.  
  288.    @ombrelist.push(Sprite_Shadow.new(viewport, member,self,@anglemin,@anglemax,@distancemax))
  289.  
  290. end
  291.  
  292.  
  293. end
  294.  
  295. #===================================================
  296.  
  297. # ● 兼容脚本结束
  298.  
  299. #===================================================
  300.  
  301.    end
  302.  
  303.    shadow_initialize(viewport, @character)
  304.  
  305. end
  306.  
  307.  
  308. alias shadow_update update
  309.  
  310.  
  311. def update
  312.    shadow_update
  313.    if @ombrelist!=[]
  314.  
  315.      for i in [email]1..@ombrelist.size[/email]
  316.   # if @character.x >= 7 # character.x = @x -1
  317.        if @ombrelist[i]!=nil
  318.  
  319.          @ombrelist[i].update
  320.  
  321.        end
  322.   # end
  323.      end
  324.  
  325.    end
  326.  
  327. end  
  328.  
  329.  
  330. end
  331.  
  332.  
  333. #===================================================
  334.  
  335. # ■ 新定义类Scene_Save
  336.  
  337. #===================================================
  338.  
  339. class Scene_Save < Scene_File
  340.  
  341.  
  342. alias shadows_write_save_data write_save_data
  343.  
  344.  
  345. def write_save_data(file)
  346.  
  347.    $game_map.shadows = nil
  348.  
  349.    shadows_write_save_data(file)
  350.  
  351. end
  352.  
  353. end
  354.  
  355.  
  356. #===================================================
  357.  
  358. # ■ 新定义类 Game_Map
  359.  
  360. #===================================================
  361.  
  362. class Game_Map
  363.  
  364. attr_accessor :shadows
  365.  
  366. end
  

补充截图

Lv1.梦旅人

梦石
0
星屑
50
在线时间
70 小时
注册时间
2014-10-11
帖子
50
9
 楼主| 发表于 2015-2-11 01:29:07 | 只看该作者
本帖最后由 风晴生 于 2015-2-11 01:31 编辑
taroxd 发表于 2015-2-10 21:00
虽然我没看出图片中问题在哪儿,但是看你的问题描述,你可以试试看把影子脚本的121行改成:
self.visible = ...


大大 问一下 这个self.visible  可视化 如果不可视了 就代表不刷新了吗   我刚测试一下 发现直接把 self.visible = false 然后用影子脚本 即使没有影子也会造成消耗FPS的情况 请问大大该如何解决呢

点评

无解  发表于 2015-2-11 07:36
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
70 小时
注册时间
2014-10-11
帖子
50
8
 楼主| 发表于 2015-2-11 01:23:25 | 只看该作者
taroxd 发表于 2015-2-10 21:46
那么把这段改成这样呢?(对于超出范围的事件,把影子消去)

    i=0

这个修改的 影子的刷新 也是只刷新屏幕的吗  为什么FPS掉的这么多呢
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
70 小时
注册时间
2014-10-11
帖子
50
7
 楼主| 发表于 2015-2-10 21:57:46 | 只看该作者
本帖最后由 风晴生 于 2015-2-10 22:32 编辑
taroxd 发表于 2015-2-10 21:46
那么把这段改成这样呢?(对于超出范围的事件,把影子消去)

    i=0


问题解决了 多谢
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

6
发表于 2015-2-10 21:46:44 | 只看该作者
本帖最后由 taroxd 于 2015-2-10 21:54 编辑
风晴生 发表于 2015-2-10 21:41
报告大大 虽然没有残影了 但是防卡效果失效了


那么把这段改成这样呢?(对于超出范围的事件,把影子消去)

RUBY 代码复制
  1. i=0
  2.     for sprite in @character_sprites
  3.       if sprite.character.is_a?(Game_Event)
  4.         if in_range?(sprite.character) or sprite.character.trigger == 3 or sprite.character.trigger == 4
  5.           sprite.update
  6.           i+=1
  7.         else
  8.           sprite.instance_eval do
  9.             if @ombrelist!=[]
  10.               for i in 1..@ombrelist.size
  11.                 # if @character.x >= 7 # character.x = @x -1
  12.                 if @ombrelist[i]!=nil
  13.                     @ombrelist[i].visible = false
  14.                 end
  15.                 # end
  16.               end
  17.             end
  18.           end
  19.         end
  20.       else
  21.         sprite.update
  22.         i+=1
  23.       end
  24.     end


如果这样还是不能解决,那么就建议——
  不要把这两个脚本一起用了……

评分

参与人数 1星屑 +100 梦石 +1 收起 理由
hys111111 + 100 + 1 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
70 小时
注册时间
2014-10-11
帖子
50
5
 楼主| 发表于 2015-2-10 21:41:55 | 只看该作者
taroxd 发表于 2015-2-10 21:29
重新看了一遍,感觉问题可能出在超出范围的事件没有刷新。可能是因为事件超出范围之后没有调用刷新。我建 ...

报告大大 虽然没有残影了 但是防卡效果失效了

点评

6L有编辑。再不行我就真没辙了  发表于 2015-2-10 21:55
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

4
发表于 2015-2-10 21:29:16 | 只看该作者
风晴生 发表于 2015-2-10 21:10
谢谢大大的回复  原理好像是加入了判断影子生成的条件 虽然判定范围有效了 但还是没有解决问题 影子还是 ...

重新看了一遍,感觉问题可能出在超出范围的事件没有刷新。可能是因为事件超出范围之后没有调用刷新。我建议名字叫做 update 的东西还是每帧调用一次最好。

将事件刷新脚本的 133~143 行替换为
  1. @character_sprites.each { |s| s.update }
复制代码
试试看呢?

不过这样可能会失去一些防卡脚本的意义呢……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
70 小时
注册时间
2014-10-11
帖子
50
3
 楼主| 发表于 2015-2-10 21:10:30 | 只看该作者
taroxd 发表于 2015-2-10 21:00
虽然我没看出图片中问题在哪儿,但是看你的问题描述,你可以试试看把影子脚本的121行改成:
self.visible = ...

谢谢大大的回复  原理好像是加入了判断影子生成的条件 虽然判定范围有效了 但还是没有解决问题 影子还是残留     这是我刚截的图      您看看 我在帖子中补充
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

2
发表于 2015-2-10 21:00:30 | 只看该作者
本帖最后由 taroxd 于 2015-2-10 21:03 编辑

虽然我没看出图片中问题在哪儿,但是看你的问题描述,你可以试试看把影子脚本的121行改成:
RUBY 代码复制
  1. self.visible = !@character.transparent && @character.screen_x.between?(0, 640) && @character.screen_y.between?(0, 480) # 大致坐标,并不精确
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-9-22 19:33

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表