查看: 1892|回复: 8

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

[复制链接]
梦石
0
星屑
50
在线时间
70 小时
注册时间
2014-10-11
回帖
38
发表于 2015-2-10 20:54:44 | 显示全部楼层 |阅读模式

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

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

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

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

如图:
          局部刷新地图和影子脚本的冲突.png
求大神帮忙解决 ,
   



附上脚本

局部刷新事件  :
[pre lang="ruby"]#======================================
# ■ Anti Event Lag Script
#======================================
#  By: Near Fantastica
#   Date: 12.06.05
#   Version: 3
#======================================
#======================================
# ■ Game_Map
#======================================
class Game_Map
  #--------------------------------------------------------------------------
  def in_range?(object)
    screne_x = $game_map.display_x
    screne_x -= 256
    screne_y = $game_map.display_y
    screne_y -= 256
    screne_width = $game_map.display_x
    screne_width += 2816  
    screne_height = $game_map.display_y
    screne_height += 2176 #- 400
    return false if object.real_x <= screne_x  #- 128
    return false if object.real_x >= screne_width# - 128
    return false if object.real_y <= screne_y #- 16000# + 140
    return false if object.real_y >= screne_height
    return true
  end
  #--------------------------------------------------------------------------
  def update
    if $game_map.need_refresh
      refresh
    end
    if @scroll_rest > 0
      distance = 2 ** @scroll_speed
      case @scroll_direction
      when 2
        scroll_down(distance)
      when 4
        scroll_left(distance)
      when 6   
        scroll_right(distance)
      when 8   
        scroll_up(distance)
      end
      @scroll_rest -= distance
    end
    for event in @events.values
      if in_range?(event) or event.trigger == 3 or (event.trigger == 4 and @arpg_id == 0)
        event.update
      end
    end
    for common_event in @common_events.values
      common_event.update
    end
    @fog_ox -= @fog_sx / 8.0
    @fog_oy -= @fog_sy / 8.0
    if @fog_tone_duration >= 1
      d = @fog_tone_duration
      target = @fog_tone_target
      @fog_tone.red = (@fog_tone.red * (d - 1) + target.red) / d
      @fog_tone.green = (@fog_tone.green * (d - 1) + target.green) / d
      @fog_tone.blue = (@fog_tone.blue * (d - 1) + target.blue) / d
      @fog_tone.gray = (@fog_tone.gray * (d - 1) + target.gray) / d
      @fog_tone_duration -= 1
    end
    if @fog_opacity_duration >= 1
      d = @fog_opacity_duration
      @fog_opacity = (@fog_opacity * (d - 1) + @fog_opacity_target) / d
      @fog_opacity_duration -= 1
    end
  end
end
#======================================
# ■ Spriteset_Map
#======================================
class Spriteset_Map
  #--------------------------------------------------------------------------
  def in_range?(object)
    screne_x = $game_map.display_x
    screne_x -= 256
    screne_y = $game_map.display_y
    screne_y -= 256
    screne_width = $game_map.display_x
    screne_width += 2816
    screne_height = $game_map.display_y
    screne_height += 2176
    return false if object.real_x <= screne_x
    return false if object.real_x >= screne_width
    return false if object.real_y <= screne_y
    return false if object.real_y >= screne_height
    return true
  end
  #--------------------------------------------------------------------------
  def update
    if @panorama_name != $game_map.panorama_name or
        @panorama_hue != $game_map.panorama_hue
      @panorama_name = $game_map.panorama_name
      @panorama_hue = $game_map.panorama_hue
      if @panorama.bitmap != nil
        @panorama.bitmap.dispose
        @panorama.bitmap = nil
      end
      if @panorama_name != ""
        @panorama.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
      end
      Graphics.frame_reset
    end
    if @fog_name != $game_map.fog_name or @fog_hue != $game_map.fog_hue
      @fog_name = $game_map.fog_name
      @fog_hue = $game_map.fog_hue
      if @fog.bitmap != nil
        @fog.bitmap.dispose
        @fog.bitmap = nil
      end
      if @fog_name != ""
        @fog.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
      end
      Graphics.frame_reset
    end
    @tilemap.ox = $game_map.display_x / 4
    @tilemap.oy = $game_map.display_y / 4
    @tilemap.update
    @panorama.ox = $game_map.display_x / 8
    @panorama.oy = $game_map.display_y / 8
    @fog.zoom_x = $game_map.fog_zoom / 100.0
    @fog.zoom_y = $game_map.fog_zoom / 100.0
    @fog.opacity = $game_map.fog_opacity
    @fog.blend_type = $game_map.fog_blend_type
    @fog.ox = $game_map.display_x / 4 + $game_map.fog_ox
    @fog.oy = $game_map.display_y / 4 + $game_map.fog_oy
    @fog.tone = $game_map.fog_tone
    i=0
    for sprite in @character_sprites
      if sprite.character.is_a?(Game_Event)
        if in_range?(sprite.character) or sprite.character.trigger == 3 or sprite.character.trigger == 4
          sprite.update
          i+=1
        end
      else
        sprite.update
        i+=1
      end
    end
    #p i
    @weather.type = $game_screen.weather_type
    @weather.max = $game_screen.weather_max
    @weather.ox = $game_map.display_x / 4
    @weather.oy = $game_map.display_y / 4
    @weather.update
    for sprite in @picture_sprites
      sprite.update
    end
    @timer_sprite.update
    @viewport1.tone = $game_screen.tone
    @viewport1.ox = $game_screen.shake
    @viewport3.color = $game_screen.flash_color
    @viewport1.update
    @viewport3.update
  end
end
[/pre]

太阳精灵影子脚本

[pre lang="ruby"]#使用方法:不透明的物体在光源旁边会产生一个阴影。

#所以,在光源的事件里面(例如火),请在第一页加上一个注释“s”(请不要带引号)

#然后将此脚本命名为“人物阴影”插入到main上方即可。


#==============================================================================

# ■ 阴影精灵 (渐变精灵 )

# 以 Genzai Kawakami的阴影脚本为基础,
#  Rataime为其重写和更新,
#  Boushy 为其添加附属功能

#  精灵使者汉化

#==============================================================================


CATERPILLAR_COMPATIBLE = true


class Game_Party

attr_reader :characters

end


class Sprite_Shadow < RPG::Sprite


attr_accessor :character


def initialize(viewport, character = nil,source = nil,anglemin=0,anglemax=0,distancemax=0)

   super(viewport)

   @anglemin=anglemin.to_f

   @anglemax=anglemax.to_f

   @distancemax=distancemax.to_f

   @character = character

   @source = source

   update

end


def update

   super


   if (@tile_id != @character.tile_id or

      @character_name != @character.character_name or

      @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)

     @tile_id = @character.tile_id

     @character_name = @character.character_name

     @character_hue = @character.character_hue
     if   @character_name.include?("AC") and  not   @character_name.include?("=4")
            if @character.direction == 4
      self.mirror = false
    else
       self.mirror = true
     end
     else
            if @character.direction == 4
      self.mirror = true
    else
       self.mirror = false
     end
     end
     if @tile_id >= 384

       self.bitmap = RPG::Cache.tile($game_map.tileset_name,

         @tile_id, @character.character_hue)

       self.src_rect.set(0, 0, 32, 32)

       self.ox = 16

       self.oy = 32

     else

       self.bitmap = RPG::Cache.character(@character.character_name,

         @character.character_hue)

       @cw = bitmap.width / 4

       @cw = bitmap.width / 4
    if not   @character_name.include?("=4")
       @ch = bitmap.height / 4
     else
       @ch = bitmap.height / 4
       end
   

       self.ox = @cw / 2

       self.oy = @ch

     end

   end

   self.visible = (not @character.transparent)

    if @tile_id == 0
      # 设置传送目标的矩形
    if not   @character_name.include?("=4")
      if @character.pattern >= 4
      sx = (@character.pattern - 4) * @cw
        else
      sx = @character.pattern * @cw
    end
      if @character.pattern >= 4
        sy = (4 - 2) / 2 * @ch  
       else
      sy = (2 - 2) / 2 * @ch
      end
      self.src_rect.set(sx, sy, @cw, @ch)
    else
            sx = @character.pattern * @cw
      sy = (@character.direction - 2) / 2 * @ch
      self.src_rect.set(sx, sy, @cw, @ch)
      end
    end

   self.x = @character.screen_x

   self.y = @character.screen_y-5

   self.z = @character.screen_z(@ch)-1

   self.opacity = @character.opacity

   self.blend_type = @character.blend_type

   self.bush_depth = @character.bush_depth

   #if @character.animation_id != 0

     #animation = $data_animations[@character.animation_id]

    # animation(animation, true)

    # @character.animation_id = 0

   #end

   @deltax=@source.x-self.x

   @deltay= @source.y-self.y

   self.angle = 57.3*Math.atan2(@deltax, @deltay )

   @angle_trigo=self.angle+90

   if @angle_trigo<0

     @angle_trigo=360+@angle_trigo

   end

   self.color = Color.new(0, 0, 0)

   @distance = ((@deltax ** 2) + (@deltay ** 2))

   if$game_map.shadows==-1

     self.opacity = 0
   else

     self.opacity = 1200000/(@distance+6000)   
   end

   if @character.screen_x >= 640 or @character.screen_x <= 0 or @character.screen_y >= 480 or @character.screen_y <= 0
   self.opacity = 0
     end   

   @distance = @distance ** 0.5

   if @distancemax !=0 and @distance>=@distancemax

     self.opacity=0

   end

   if @anglemin !=0 or @anglemax !=0

      if (@angle_trigo<@anglemin or @angle_trigo>@anglemax) and @anglemin<@anglemax

        self.opacity=0

      end

      if (@angle_trigo<@anglemin and @angle_trigo>@anglemax) and @anglemin>@anglemax

        self.opacity=0

      end     

   end

end

end


#===================================================

# ■ 重定义 Sprite_Character

#===================================================


class Sprite_Character < RPG::Sprite

alias shadow_initialize initialize


def initialize(viewport, character = nil)

   @character = character
  # @character = nil
   super(viewport)

   @ombrelist=[]

   if (character.is_a?(Game_Event) and character.list!=nil and character.list[0].code == 108 and character.list[0].parameters == ["s"])

     if (character.list[1]!=nil and character.list[1].code == 108)

       @anglemin=character.list[1].parameters[0]

     end

     if (character.list[2]!=nil and character.list[2].code == 108)

       @anglemax=character.list[2].parameters[0]

     end

     if (character.list[3]!=nil and character.list[3].code == 108)

       @distancemax=character.list[3].parameters[0]

     end  

    for i in $game_map.events.keys.sort

     if ($game_map.events.is_a?(Game_Event) and not ($game_map.events.list[0].code == 108 && ($game_map.events.list[0].parameters == ["NotShadow"]) or $game_map.events.list[0].parameters == ["s"]) ) #$game_map.events.list!=nil and $game_map.events.list[0].code == 108 and $game_map.events.list[0].parameters == ["o"])

       @ombrelist[i+1] = Sprite_Shadow.new(viewport, $game_map.events,self,@anglemin,@anglemax,@distancemax)

     end

    end

    @ombrelist[1] = Sprite_Shadow.new(viewport, $game_player,self,@anglemin,@anglemax,@distancemax)

#===================================================

# ● 原装人物跟随兼容脚本

#===================================================

if CATERPILLAR_COMPATIBLE and $game_party.characters!=nil


for member in $game_party.characters

   @ombrelist.push(Sprite_Shadow.new(viewport, member,self,@anglemin,@anglemax,@distancemax))

end


end

#===================================================

# ● 兼容脚本结束

#===================================================

   end

   shadow_initialize(viewport, @character)

end


alias shadow_update update


def update
   shadow_update
   if @ombrelist!=[]

     for i in 1..@ombrelist.size
  # if @character.x >= 7 # character.x = @x -1
       if @ombrelist!=nil

         @ombrelist.update

       end
  # end
     end

   end

end  


end


#===================================================

# ■ 新定义类Scene_Save

#===================================================

class Scene_Save < Scene_File


alias shadows_write_save_data write_save_data


def write_save_data(file)

   $game_map.shadows = nil

   shadows_write_save_data(file)

end

end


#===================================================

# ■ 新定义类 Game_Map

#===================================================

class Game_Map

attr_accessor :shadows

end[/pre]  

补充截图 局部刷新地图和影子脚本的冲突2.png

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2015-2-10 21:00:30 | 显示全部楼层
本帖最后由 taroxd 于 2015-2-10 21:03 编辑

虽然我没看出图片中问题在哪儿,但是看你的问题描述,你可以试试看把影子脚本的121行改成:
[pre lang="ruby"]self.visible = !@character.transparent && @character.screen_x.between?(0, 640) && @character.screen_y.between?(0, 480) # 大致坐标,并不精确[/pre]
回复

使用道具 举报

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

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

使用道具 举报

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

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

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

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

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

使用道具 举报

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

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

点评

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

使用道具 举报

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2015-2-10 21:46:44 | 显示全部楼层
本帖最后由 taroxd 于 2015-2-10 21:54 编辑
风晴生 发表于 2015-2-10 21:41
报告大大 虽然没有残影了 但是防卡效果失效了


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

[pre lang="ruby"]    i=0
    for sprite in @character_sprites
      if sprite.character.is_a?(Game_Event)
        if in_range?(sprite.character) or sprite.character.trigger == 3 or sprite.character.trigger == 4
          sprite.update
          i+=1
        else
          sprite.instance_eval do
            if @ombrelist!=[]
              for i in 1..@ombrelist.size
                # if @character.x >= 7 # character.x = @x -1
                if @ombrelist!=nil
                    @ombrelist.visible = false
                end
                # end
              end
            end
          end
        end
      else
        sprite.update
        i+=1
      end
    end [/pre]

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

评分

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

查看全部评分

回复

使用道具 举报

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

    i=0


问题解决了 多谢
回复

使用道具 举报

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

    i=0

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

使用道具 举报

梦石
0
星屑
50
在线时间
70 小时
注册时间
2014-10-11
回帖
38
 楼主| 发表于 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
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部