Project1

标题: 求一个影子系统 [打印本页]

作者: 1196395297    时间: 2012-4-16 20:58
标题: 求一个影子系统
记得有一个影子系统可以设置多个光源,只要注释一个英文字母就行了
在需要影子的NPC那里也只要注释就行,不需要的不注释
还有就是影子随着角色的移动而改变方向,离光源的距离而改变长短
只要这个脚本,别的不要,麻烦大家找出来,我发誓一定有的。dsu_plus_rewardpost_czw
作者: 永远の路克酱    时间: 2012-4-16 21:39
  1. #使用方法:不透明的物体在光源旁边会产生一个阴影。
  2. #所以,在光源的事件里面(例如火),请在第一页加上一个注释“s”(请不要带引号)
  3. #然后将此脚本命名为“人物阴影”插入到main上方即可。

  4. #==============================================================================
  5. # ■ 阴影精灵 (渐变精灵 )
  6. # 以 Genzai Kawakami的阴影脚本为基础,
  7. #  Rataime为其重写和更新,
  8. #  Boushy 为其添加附属功能
  9. #  精灵使者汉化
  10. #==============================================================================

  11. CATERPILLAR_COMPATIBLE = true

  12. class Game_Party
  13. attr_reader :characters
  14. end

  15. class Sprite_Shadow < RPG::Sprite

  16. attr_accessor :character

  17. def initialize(viewport, character = nil,source = nil,anglemin=0,anglemax=0,distancemax=0)
  18.    super(viewport)
  19.    @anglemin=anglemin.to_f
  20.    @anglemax=anglemax.to_f
  21.    @distancemax=distancemax.to_f
  22.    @character = character
  23.    @source = source
  24.    update
  25. end

  26. def update
  27.    super
  28.    
  29.    if @tile_id != @character.tile_id or
  30.       @character_name != @character.character_name or
  31.       @character_hue != @character.character_hue
  32.      @tile_id = @character.tile_id
  33.      @character_name = @character.character_name
  34.      @character_hue = @character.character_hue
  35.      if @tile_id >= 384
  36.        self.bitmap = RPG::Cache.tile($game_map.tileset_name,
  37.          @tile_id, @character.character_hue)
  38.        self.src_rect.set(0, 0, 32, 32)
  39.        self.ox = 16
  40.        self.oy = 32
  41.      else
  42.        self.bitmap = RPG::Cache.character(@character.character_name,
  43.          @character.character_hue)
  44.        @cw = bitmap.width / 4
  45.        @ch = bitmap.height / 4
  46.        self.ox = @cw / 2
  47.        self.oy = @ch
  48.      end
  49.    end
  50.    self.visible = (not @character.transparent)
  51.    if @tile_id == 0
  52.      sx = @character.pattern * @cw
  53.      sy = (@character.direction - 2) / 2 * @ch
  54.      if self.angle>90 or angle<-90
  55.        if @character.direction== 6
  56.               sy = ( 4- 2) / 2 * @ch
  57.        end
  58.        if @character.direction== 4
  59.               sy = ( 6- 2) / 2 * @ch
  60.        end
  61.        if @character.direction== 2
  62.               sy = ( 8- 2) / 2 * @ch
  63.        end
  64.        if @character.direction== 8
  65.               sy = ( 2- 2) / 2 * @ch
  66.        end
  67.      end
  68.      self.src_rect.set(sx, sy, @cw, @ch)
  69.    end
  70.    self.x = @character.screen_x
  71.    self.y = @character.screen_y-5
  72.    self.z = @character.screen_z(@ch)-1
  73.    self.opacity = @character.opacity
  74.    self.blend_type = @character.blend_type
  75.    self.bush_depth = @character.bush_depth
  76.    if @character.animation_id != 0
  77.      animation = $data_animations[@character.animation_id]
  78.      animation(animation, true)
  79.      @character.animation_id = 0
  80.    end
  81.    @[email protected]
  82.    @deltay= @source.y-self.y
  83.    self.angle = 57.3*Math.atan2(@deltax, @deltay )
  84.    @angle_trigo=self.angle+90
  85.    if @angle_trigo<0
  86.      @angle_trigo=360+@angle_trigo
  87.    end
  88.    self.color = Color.new(0, 0, 0)
  89.    @distance = ((@deltax ** 2) + (@deltay ** 2))
  90.    if$game_map.shadows==-1
  91.      self.opacity = 0
  92.    else
  93.      self.opacity = 1200000/(@distance+6000)   
  94.    end
  95.    @distance = @distance ** 0.5
  96.    if @distancemax !=0 and @distance>=@distancemax
  97.      self.opacity=0
  98.    end
  99.    if @anglemin !=0 or @anglemax !=0
  100.       if (@angle_trigo<@anglemin or @angle_trigo>@anglemax) and @anglemin<@anglemax
  101.         self.opacity=0
  102.       end
  103.       if (@angle_trigo<@anglemin and @angle_trigo>@anglemax) and @anglemin>@anglemax
  104.         self.opacity=0
  105.       end     
  106.    end
  107. end
  108. end

  109. #===================================================
  110. # ■ 重定义 Sprite_Character
  111. #===================================================

  112. class Sprite_Character < RPG::Sprite
  113. alias shadow_initialize initialize

  114. def initialize(viewport, character = nil)
  115.    @character = character
  116.    super(viewport)
  117.    @ombrelist=[]
  118.    if (character.is_a?(Game_Event) and character.list!=nil and character.list[0].code == 108 and character.list[0].parameters == ["s"])
  119.      if (character.list[1]!=nil and character.list[1].code == 108)
  120.        @anglemin=character.list[1].parameters[0]
  121.      end
  122.      if (character.list[2]!=nil and character.list[2].code == 108)
  123.        @anglemax=character.list[2].parameters[0]
  124.      end
  125.      if (character.list[3]!=nil and character.list[3].code == 108)
  126.        @distancemax=character.list[3].parameters[0]
  127.      end  
  128.     for i in $game_map.events.keys.sort
  129.      if ($game_map.events[i].is_a?(Game_Event) and $game_map.events[i].list!=nil and $game_map.events[i].list[0].code == 108 and $game_map.events[i].list[0].parameters == ["o"])
  130.        @ombrelist[i+1] = Sprite_Shadow.new(viewport, $game_map.events[i],self,@anglemin,@anglemax,@distancemax)
  131.      end
  132.     end
  133.     @ombrelist[1] = Sprite_Shadow.new(viewport, $game_player,self,@anglemin,@anglemax,@distancemax)
  134. #===================================================
  135. # ● 原装人物跟随兼容脚本
  136. #===================================================
  137. if CATERPILLAR_COMPATIBLE and $game_party.characters!=nil

  138. for member in $game_party.characters
  139.    @ombrelist.push(Sprite_Shadow.new(viewport, member,self,@anglemin,@anglemax,@distancemax))
  140. end

  141. end
  142. #===================================================
  143. # ● 兼容脚本结束
  144. #===================================================
  145.    end
  146.    shadow_initialize(viewport, @character)
  147. end

  148. alias shadow_update update

  149. def update
  150.    shadow_update
  151.    if @ombrelist!=[]
  152.      for i in [email protected]
  153.        if @ombrelist[i]!=nil
  154.          @ombrelist[i].update
  155.        end
  156.      end
  157.    end
  158. end  

  159. end

  160. #===================================================
  161. # ■ 新定义类Scene_Save
  162. #===================================================
  163. class Scene_Save < Scene_File

  164. alias shadows_write_save_data write_save_data

  165. def write_save_data(file)
  166.    $game_map.shadows = nil
  167.    shadows_write_save_data(file)
  168. end
  169. end

  170. #===================================================
  171. # ■ 新定义类 Game_Map
  172. #===================================================
  173. class Game_Map
  174. attr_accessor :shadows
  175. end
复制代码





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