Project1

标题: 关于人物阴影脚本的问题 [打印本页]

作者: CCD0645    时间: 2017-11-18 02:21
标题: 关于人物阴影脚本的问题
脚本如下

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


发现问题有,这个阴影脚本并不是对应行走图每一帧的,而是只对应面向下的那四帧,也就是4*4行走图最上面4帧
所以如果你行走图下面那些帧数差别比较大的话,就很容易看出不匹配的问题,例如下图。
要说人物行走图还能勉强凑合的话,那么那些一个行走图放不同场景物件那种,就会看出完全不同的阴影。
有没有办法让他这个阴影脚本,对应上行走图各自的面向与帧数?使之看起来比较匹配




作者: WantMy蕙    时间: 2017-11-19 00:16
我想说的是真佩服楼主这个素材,现在原创的大佬好多...
2333
然后那个脚本的话这里提供一个思路吧,高三狗没什么时间看
嗯我粗略看了一下,有几行是if direction 4之类的,这种的话就是判断角色朝向的语句,就从这种语句入手,先观察观察这个脚本是怎么描绘的阴影,然后根据它的思路进行修改,改成自己所需要的样子




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