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

Project1

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

[转载] [rpgmakervx.net]影子系统VX版[精灵使者完美汉化版]

 关闭 [复制链接]

Lv3.寻梦者 (暗夜天使)

精灵族の天使

梦石
0
星屑
1697
在线时间
3038 小时
注册时间
2007-3-16
帖子
33731

开拓者贵宾

跳转到指定楼层
1
发表于 2008-12-10 22:05:49 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
使用方法:
请复制工程的脚本到你的main前面使用。注意Spriteset_Map脚本要放在两个脚本上面。
各个脚本里面有详尽的使用说明。
anglemin和anglemax变量的设置是以角度为单位,由右边为原点,以逆时针旋转方向前
进。
举例子说明,如果我想让某个灯的右上方向有光(有影子),我需要在事件的注释这样
里面这样设置:
anglemin 0
anglemax 90
这是一幅简要的参考图

135   90   45

180   ◎   0(360)

225  270  315



单位是度。
当然,在Sprite_Shadow里面设定的时候,当你设置好阴影深度值和产生阴影距离的值的
时候,你必须在前面设置好起始的角度与终止的角度。否则,阴影系统将不会正常工作。
这是一个完整的范例:

anglemin 数字(单位角度)
anglemax 数字(单位角度)
distancemax 数字(单位像素,注意32像素为一格)
self_opacity 数字(0-255之间)
与之冲突的脚本:与地图和远景的脚本皆有冲突(尤其是三远景,二远景居多)
与烛光效果有严重冲突,烛光系统可能无法正常运行。
其中Spriteset_Map脚本已由精灵使者重写,防止地图重影现象。

效果图(做得不好,请大家指教)




范例工程下载:http://rpg.blue/upload_program/d ... ��统_109520322.rar

汉化的脚本部分:
spriteset_map


  1. #==============================================================================
  2. # ■ Spriteset_Map
  3. #------------------------------------------------------------------------------
  4. #  处理地图画面活动块和元件的类。本类在 Scene_Map 类的内部使用。
  5. #   重写者:精灵使者
  6. #   此类修正了太阳系统和阴影系统遗留下来的问题,需要放到两者的上面。
  7. #   使用原版会造成严重的地图重影现象,所以我就重写了此类。如果有使用修改此地方
  8. #   的脚本,请重新做相应修改。
  9. #==============================================================================

  10. class Spriteset_Map
  11.   #--------------------------------------------------------------------------
  12.   # ● 生成显示端口
  13.   #--------------------------------------------------------------------------
  14.   def create_viewports
  15.     @viewport0 = Viewport.new(0, 0, 544, 416)
  16.     @viewport1 = Viewport.new(0, 0, 544, 416)
  17.     @viewport2 = Viewport.new(0, 0, 544, 416)
  18.     @viewport3 = Viewport.new(0, 0, 544, 416)
  19.     @viewport0.z = 1
  20.     @viewport1.z = 20
  21.     @viewport2.z = 50
  22.     @viewport3.z = 100
  23.   end
  24.   #--------------------------------------------------------------------------
  25.   # ● 生成地图元件
  26.   #--------------------------------------------------------------------------
  27.   def create_tilemap
  28.     @tilemap0 = Tilemap.new(@viewport0)
  29.     @tilemap0.bitmaps[0] = Cache.system("TileA1")
  30.     @tilemap0.bitmaps[1] = Cache.system("TileA2")
  31.     @tilemap0.bitmaps[4] = Cache.system("TileA5")
  32.     @tilemap = Tilemap.new(@viewport1)
  33.     @tilemap.bitmaps[2] = Cache.system("TileA3")
  34.     @tilemap.bitmaps[3] = Cache.system("TileA4")
  35.     @tilemap.bitmaps[5] = Cache.system("TileB")
  36.     @tilemap.bitmaps[6] = Cache.system("TileC")
  37.     @tilemap.bitmaps[7] = Cache.system("TileD")
  38.     @tilemap.bitmaps[8] = Cache.system("TileE")
  39.     @tilemap.map_data = $game_map.data
  40.     @tilemap.passages = $game_map.passages
  41.     @tilemaps = [@tilemap, @tilemap0]
  42.     @tilemaps.each {|x| x.map_data = $game_map.data}
  43.     @tilemaps.each {|x| x.passages = $game_map.passages}
  44.   end
  45.   #--------------------------------------------------------------------------
  46.   # ● 释放地图元件
  47.   #--------------------------------------------------------------------------
  48.   def dispose_tilemap
  49.     @tilemap.dispose
  50.     @tilemap0.dispose
  51.   end
  52.   #--------------------------------------------------------------------------
  53.   # ● 释放显示端口
  54.   #--------------------------------------------------------------------------
  55.   def dispose_viewports
  56.     @viewport0.dispose
  57.     @viewport1.dispose
  58.     @viewport2.dispose
  59.     @viewport3.dispose
  60.   end
  61.   #--------------------------------------------------------------------------
  62.   # ● 更新地图元件
  63.   #--------------------------------------------------------------------------
  64.   def update_tilemap
  65.     @tilemap.ox = $game_map.display_x / 8
  66.     @tilemap.oy = $game_map.display_y / 8
  67.     @tilemap0.ox = @tilemap.ox
  68.     @tilemap0.oy = @tilemap.oy
  69.     @tilemap.update
  70.     @tilemap0.update
  71.   end
  72.   #--------------------------------------------------------------------------
  73.   # ● 更新显示端口
  74.   #--------------------------------------------------------------------------
  75.   def update_viewports
  76.     @viewport0.tone = $game_map.screen.tone
  77.     @viewport0.ox = $game_map.screen.shake
  78.     @viewport1.tone = $game_map.screen.tone
  79.     @viewport1.ox = $game_map.screen.shake
  80.     @viewport2.color = $game_map.screen.flash_color
  81.     @viewport3.color.set(0, 0, 0, 255 - $game_map.screen.brightness)
  82.     @viewport0.update
  83.     @viewport1.update
  84.     @viewport2.update
  85.     @viewport3.update
  86.   end
  87. end
复制代码

Sprite_sun

  1. #==================================================================================
  2. # ■ 太阳精灵(活动块)
  3. #------------------------------------------------------------------------------
  4. #    由阴影精灵(活动块)为基础
  5. #    由 Rataime 原创。
  6. #    由 DerVVulfman 重新编辑。
  7. #    由 Syvkal 改写为VX(精灵:应该有XP版本的吧。)
  8. #    由 Painhurt 进行修正。
  9. #    由 精灵使者 进行汉化并修正。
  10. #    2008年10月14日
  11. #------------------------------------------------------------------------------
  12. #
  13. #  介绍:
  14. #
  15. #  这个系统允许角色和所有“已经准备好的”事件在大地图上产生阴影。当角色四处移动的
  16. #  时候,将会出现由算法算出的像阳光照射一样的影子。当然,经过在事件页里特殊注释的
  17. #  事件也会同样产生影子。
  18. #  
  19. #------------------------------------------------------------------------------
  20. #
  21. # 使用方法:
  22. #
  23. #  -- 太阳
  24. #     想创建阳光效果的话,你必须要在地图上创建一个“太阳”的事件。在很多的场合之下
  25. #     ,这个事件的行走图肯定是空白的。你肯定不想“看”到太阳,是么?(精灵:太阳事
  26. #     件无论在任何位置,只要在地图内就可以了喵~当然,此事件不能加任何启动条件。)
  27. #
  28. #     想把这些事件的其中的一个当做太阳,那么你就必须在这个事件页里面添加一些东西。
  29. #     这些东西没有什么太多的,仅仅是一些注释而已。
  30. #
  31. #     你首先要添加的注释就是“begin Sun”请不要加引号。这个告诉了系统,这张地图要使
  32. #     使用太阳效果。剩下的两个值是可选项,而且在脚本里面有默认值(当然只加进了脚本里
  33. #     面)。当然,这些也可以加入作为注释。注意大小写,一定要符合要求。注:切记不能写
  34. #     在一起,每个注释一行。
  35. #
  36. #     begin Sun --- 启动太阳系统
  37. #     self_angle 数字 --- 每个影子的角度是多少。(0-360)
  38. #     self_opacity 数字 --- 影子的不透明度是多少。(0-255)
  39. #     书写格式举例:self_angle 90
  40. #
  41. #     然后,你的角色移动的时候就会自动产生影子了。
  42. #
  43. #  -- 其他事件
  44. #     事件不会知道他们如何才可以产生阴影。如果想让他们产生阴影的话,你只需要在此事件
  45. #     的的事件页里添加一段特殊的注释。这个注释仅仅是一个特殊短语“begin shadow”(再
  46. #     次注意,不要加引号)。请注意,产生阴影的优先级一定为“与角色相同”或者“上方”
  47. #     才可以产生阴影。注意有些事件如果处于在画面以上的优先级的情况之下,其影子会被遮
  48. #     掩,所以不要启用那些事件的阴影,切记。
  49. #
  50. #
  51. #------------------------------------------------------------------------------
  52. #
  53. # 更新日志:
  54. #
  55. #  1) 在脚本中增添了更人性化的标签和标题头。
  56. #  2) 在XPML模块里压缩了关键字分隔符和参数。
  57. #  3) 为了降低资源,将太阳产生的影子数组设成了实例变量。
  58. #  4) 与Near Fantastica 的人物跟随脚本兼容。
  59. #  5) 与Ccoa的人物跟随脚本兼容。
  60. #  6) 与Trickster的人物跟随脚本兼容。
  61. #  7) 在设定区段增加了默认的影子设定。
  62. #
  63. #==================================================================================



  64.    #========================================================================
  65.    #  ■      设       定       系        统          部       分       ■  #
  66.    #========================================================================
  67.     # 跟随系统部分设定(如果选用了相应的系统请选true,否则选false)
  68.     CATERPILLAR_COMPATIBLE      = true    # 原版跟随系统兼容开关  
  69.     SQUAD_MOVE_COMPATIBLE       = false   # Near Fantastica的跟随系统兼容开关
  70.     CCOA_CATER_COMPATIBLE       = false   # Ccoa的跟随系统兼容开关
  71.     TRICKSTER_CATER_COMPATIBLE  = false   # Trickster的跟随系统兼容开关
  72.    
  73.     # 太阳系统的特别设定
  74.     SUN_WARN                    = true    # 检查是否兼容老版本的太阳系统
  75.     SUN_ANGLE                   = 45      # 默认太阳系统产生的影子角度
  76.     SUN_OPACITY                 = 128     # 默认太阳系统产生的影子深度

  77.    
  78.    #========================================================================
  79.    #  ■■   设         定       部          分          结      束   ■■  #
  80.    #========================================================================
  81.   
  82.   

  83. #==================================================================================
  84. # ■ Game_Temp
  85. #------------------------------------------------------------------------------
  86. #  在没有存档的情况下,处理临时数据的类。这个类的实例请参考 $game_temp 。
  87. #=================================================================================
  88. class Game_Temp
  89.   #--------------------------------------------------------------------------
  90.   # ● 定义实例变量
  91.   #--------------------------------------------------------------------------
  92.   attr_accessor :sun_spriteset            # 维持太阳阴影的活动块
  93. end

  94. #==================================================================================
  95. # ■ Game_Party
  96. #------------------------------------------------------------------------------
  97. #  处理同伴的类。包含金钱以及物品的信息。本类的实例请参考 $game_party。
  98. #==================================================================================

  99. class Game_Party
  100.   #--------------------------------------------------------------------------
  101.   # ● 定义实例变量
  102.   #--------------------------------------------------------------------------
  103.   attr_reader :characters
  104. end



  105. #==================================================================================
  106. # ■ Sprite_Sun
  107. #------------------------------------------------------------------------------
  108. #  根据角色的地图位置来处理角色阴影角度的精灵(活动块)类。Game_Character 类的实例
  109. #  监视、活动块状态的自动变化。
  110. #==================================================================================

  111. class Sprite_Sun < Sprite_Base
  112.   #--------------------------------------------------------------------------
  113.   # ● 定义实例变量
  114.   #--------------------------------------------------------------------------
  115.   attr_accessor :character         
  116.   #--------------------------------------------------------------------------
  117.   # ● 初始化对象
  118.   #     viewport  : 显示端口
  119.   #     character : 角色 (Game_Character)
  120.   #     id        : 角色ID
  121.   #--------------------------------------------------------------------------
  122.   def initialize(viewport, character = nil, id=0)
  123.     super(viewport)
  124.     @character = character
  125.     params=$game_temp.sun_spriteset.sun[id]
  126.     # 默认设置
  127.     self_angle    = SUN_ANGLE
  128.     self_opacity  = SUN_OPACITY
  129.     # 根据参数的设置
  130.     self_angle    = params[0]   if params.size > 0
  131.     self_opacity  = params[1]   if params.size > 1
  132.     @self_angle   = self_angle
  133.     @self_opacity = self_opacity
  134.     update
  135.   end
  136.   #--------------------------------------------------------------------------
  137.   # ● 更新画面
  138.   #--------------------------------------------------------------------------  
  139.   def update
  140.     super
  141.     # 在图块ID,文件名或者色相不同于当前的情况下
  142.     if @tile_id != @character.tile_id or
  143.        @character_name != @character.character_name or
  144.        @character_index != @character.character_index
  145.       @tile_id = @character.tile_id
  146.       @character_name = @character.character_name
  147.       @character_index = @character.character_index
  148.       if @tile_id > 0
  149.         sx = (@tile_id / 128 % 2 * 8 + @tile_id % 8) * 32;
  150.         sy = @tile_id % 256 / 8 % 16 * 32;
  151.         set_number = @tile_id / 256
  152.         self.bitmap = Cache.system("TileB") if set_number == 0
  153.         self.bitmap = Cache.system("TileC") if set_number == 1
  154.         self.bitmap = Cache.system("TileD") if set_number == 2
  155.         self.bitmap = Cache.system("TileE") if set_number == 3
  156.         self.src_rect.set(sx, sy, 32, 32)
  157.         self.ox = 16
  158.         self.oy = 32
  159.       else
  160.         self.bitmap = Cache.character(@character_name)
  161.         sign = @character_name[/^[\!\$]./]
  162.         if sign != nil and sign.include?('$')
  163.           @cw = bitmap.width / 3
  164.           @ch = bitmap.height / 4
  165.         else
  166.           @cw = bitmap.width / 12
  167.           @ch = bitmap.height / 8
  168.         end
  169.         self.ox = @cw / 2
  170.         self.oy = @ch
  171.       end
  172.     end
  173.     # 设置可见状况
  174.     self.visible = (not @character.transparent)
  175.     # 如果画面是角色的情况下
  176.     if @tile_id == 0
  177.       index = @character.character_index
  178.       pattern = @character.pattern < 3 ? @character.pattern : 1
  179.       # 矩形本体设定
  180.       sx = (index % 4 * 3 + pattern) * @cw
  181.       @direct = @character.direction
  182.       if self.angle > 90 or angle < -90
  183.         sy = ( 4 - 2) / 2 * @ch                   if @direct == 6
  184.         sy = ( 6 - 2) / 2 * @ch                   if @direct == 4
  185.         sy = (@character.direction - 2) / 2 * @ch if @direct != 4 and @direct != 6
  186.       else
  187.         sy = (index / 4 * 4 + (@character.direction - 2) / 2) * @ch
  188.       end
  189.       self.src_rect.set(sx, sy, @cw, @ch)
  190.     end
  191.     # 设置精灵(活动块)的坐标
  192.     self.x = @character.screen_x
  193.     self.y = @character.screen_y-5
  194.     self.z = 10 #@character.screen_z-1
  195.     # 设置不透明度,合成方式和草木深度
  196.     self.opacity = @self_opacity
  197.     self.blend_type = @character.blend_type
  198.     self.bush_depth = @character.bush_depth
  199.     # 显示动画
  200.     if @character.animation_id != 0
  201.       animation = $data_animations[@character.animation_id]
  202.       animation(animation, true)
  203.       @character.animation_id = 0
  204.     end
  205.     self.angle = @self_angle.to_i - 90
  206.     self.color = Color.new(0, 0, 0)
  207.   end
  208. end



  209. #==================================================================================
  210. # ■ Sprite_Character
  211. #------------------------------------------------------------------------------
  212. #  角色显示用脚本。监视 Game_Character 类的实例、自动变化脚本状态。
  213. #==================================================================================

  214. class Sprite_Character < Sprite_Base
  215.   #--------------------------------------------------------------------------
  216.   # ● 重命名函数列表
  217.   #--------------------------------------------------------------------------  
  218.   alias sun_initialize initialize
  219.   alias sun_update update
  220.   #--------------------------------------------------------------------------
  221.   # ● 初始化对像
  222.   #     viewport  : 显示端口
  223.   #     character : 角色 (Game_Character)
  224.   #--------------------------------------------------------------------------
  225.   def initialize(viewport, character = nil)
  226.     @viewport0 = Viewport.new(0, 0, 544, 416)
  227.     @viewport0.z = 1
  228.     @character = character
  229.     super(viewport)
  230.     @sunlist=[]
  231.     if character.is_a?(Game_Event) and $game_temp.sun_spriteset.sun != []
  232.       params = XPML.XPML_read("Shadow", @character.id, 2)
  233.       if params != nil
  234.         for i in 0...$game_temp.sun_spriteset.sun.size
  235.           @sunlist.push(Sprite_Sun.new(@viewport0, @character, i))
  236.         end
  237.       end
  238.     end
  239.     if character.is_a?(Game_Player) and $game_temp.sun_spriteset.sun != []
  240.       for i in 0...$game_temp.sun_spriteset.sun.size
  241.         @sunlist.push(Sprite_Sun.new(@viewport0, $game_player, i))
  242.       end
  243.       #===================================================
  244.       # ● 与人物跟随功能兼容脚本
  245.       #===================================================
  246.       if CATERPILLAR_COMPATIBLE and $game_party.characters != nil
  247.         for member in $game_party.characters
  248.           for i in 0...$game_temp.sun_spriteset.sun.size
  249.             @sunlist.push(Sprite_Sun.new(@viewport0, member, i))
  250.           end
  251.         end
  252.       end
  253.       if SQUAD_MOVE_COMPATIBLE and $game_allies.values != nil
  254.         for member in $game_allies.values
  255.           for i in 0...$game_temp.sun_spriteset.sun.size
  256.             @sunlist.push(Sprite_Sun.new(@viewport0, member, i))
  257.           end
  258.         end
  259.       end
  260.       if CCOA_CATER_COMPATIBLE and $game_train.actors != nil
  261.         for member in $game_train.actors
  262.           for i in 0...$game_temp.sun_spriteset.sun.size
  263.             @sunlist.push(Sprite_Sun.new(@viewport0, member, i))
  264.           end
  265.         end
  266.       end
  267.       if TRICKSTER_CATER_COMPATIBLE and $game_party.followers != nil
  268.         for member in $game_party.followers
  269.           for i in 0...$game_temp.sun_spriteset.sun.size
  270.             @sunlist.push(Sprite_Sun.new(@viewport0, member, i))
  271.           end
  272.         end
  273.       end
  274.       #===================================================
  275.       # ● 兼容脚本结束
  276.       #===================================================      
  277.     end
  278.     # 执行原始函数调用
  279.     sun_initialize(viewport, @character)
  280.   end
  281.   #--------------------------------------------------------------------------
  282.   # ● 更新画面
  283.   #--------------------------------------------------------------------------
  284.   def update
  285.     sun_update
  286.     if @sunlist != []
  287.       for i in [email protected]
  288.         @sunlist[i].update
  289.       end
  290.     end
  291.   end  
  292. end



  293. #==================================================================================
  294. # ■ Game_Event
  295. #------------------------------------------------------------------------------
  296. #  处理事件的类。条件判断、事件页的切换、并行处理、执行事件功能
  297. # 在 Game_Map 类的内部使用。
  298. #==================================================================================

  299. class Game_Event < Game_Character
  300.   #--------------------------------------------------------------------------
  301.   # ● 定义实例变量
  302.   #--------------------------------------------------------------------------
  303.   attr_accessor :id
  304. end




  305. #==================================================================================
  306. # ■ Spriteset_Map
  307. #------------------------------------------------------------------------------
  308. #  处理地图画面活动块和元件的类。本类在 Scene_Map 类的内部使用。
  309. #================================================================================

  310. class Spriteset_Map
  311.   #--------------------------------------------------------------------------
  312.   # ● 定义实例变量
  313.   #--------------------------------------------------------------------------  
  314.   attr_accessor :sun
  315.   #--------------------------------------------------------------------------
  316.   # ● 重命名函数列表
  317.   #--------------------------------------------------------------------------  
  318.   alias sun_initialize initialize
  319.   #--------------------------------------------------------------------------
  320.   # ● 初始化对象
  321.   #--------------------------------------------------------------------------   
  322.   def initialize
  323.     @sun = []
  324.     $game_temp.sun_spriteset = self
  325.     warn = false
  326.     for k in $game_map.events.keys.sort
  327.       if ($game_map.events[k].list != nil and
  328.           $game_map.events[k].list[0].code == 108 and
  329.           ($game_map.events[k].list[0].parameters == ["Sun"] or
  330.           $game_map.events[k].list[0].parameters == ["o"]))
  331.         warn = true
  332.       end
  333.       params = XPML.XPML_read("Sun", k, 2)
  334.       $game_temp.sun_spriteset.sun.push(params) if params != nil
  335.     end
  336.     if warn == true and SUN_WARN
  337.       p "警告:在地图上至少有一个事件使用了过去的方法来添加太阳效果"
  338.     end
  339.     # 执行原始函数调用
  340.     sun_initialize
  341.   end  
  342. end


  343. #==============================================================================
  344. # ■ module XPML
  345. #------------------------------------------------------------------------------
  346. #  本模块用来读取并传递注释中的参数。
  347. #
  348. #  使用此模块的主要用途就是检查和读出事件的注释。
  349. #  * 标记的关键字的注明方法:
  350. #    begin 关键字
  351. #  * 注意参数之间必须用关键字隔开。
  352. #  * 调用此函数的方法:
  353. #    XPML_read("关键字",事件ID,读取参数的最大值)
  354. #  * 最后一项可以忽略,默认为整个事件。
  355. #  * 赋值方法:
  356. #    变量名 参数
  357. #  * 每个变量名和参数各占一行。
  358. #  * 如果指明的关键字在事件里面不存在的话,则返回nil。
  359. #  * 如果两个标记之间没有参数的话,则返回空数组。
  360. #  * 如果参数中有数字参数的话,会自动返回为数字变量。
  361. #  举例:在一个事件中的注释写入(每个注释写一行,#号后面的不写)
  362. #       begin first # 第一关键字
  363. #       begin second #第二关键字
  364. #       变量1 1
  365. #       变量2 two
  366. #       begin third #第三关键字
  367. #       任何东西 3
  368. #  然后得出转换结果:
  369. #   p XPML_read("first", event_id) -> [] #第一关键字和第二关键字没有参数
  370. #   p XPML_read("second", event_id) -> [1,"two"] #第二关键字和第三关键字之间有2个参数
  371. #   p XPML_read("third", event_id) -> [3] #第三关键字之间有一个参数
  372. #   p XPML_read("forth", event_id) -> nil #找不到第四关键字则返回nil
  373. #===================================================

  374. module XPML
  375.   module_function
  376.   #--------------------------------------------------------------------------
  377.   # ● XPML_read
  378.   #     markup           : 需要在文件注释里检查的关键字。
  379.   #     event_id         : 事件ID
  380.   #     max_param_number : 读取参数/注释的最大值,0为事件内的所有注释
  381.   #--------------------------------------------------------------------------  
  382.   def XPML_read(markup, event_id, max_param_number = 0)
  383.     parameter_list = nil
  384.     event = $game_map.events[event_id]
  385.     return if event.list == nil
  386.       for i in 0...event.list.size
  387.         if event.list[i].code == 108 and
  388.           event.list[i].parameters[0].downcase == "begin " + markup.downcase
  389.           parameter_list = [] if parameter_list == nil
  390.           for j in i + 1...event.list.size
  391.             if event.list[j].code == 108
  392.               parts = event.list[j].parameters[0].split
  393.               if parts.size != 1 and parts[0].downcase != "begin"
  394.                 if parts[1].to_i != 0 or parts[1] == "0"
  395.                   parameter_list.push(parts[1].to_i)
  396.                 else
  397.                   parameter_list.push(parts[1])
  398.                 end
  399.               else
  400.                 return parameter_list
  401.               end
  402.             else
  403.               return parameter_list
  404.             end
  405.             if max_param_number != 0 and j == i + max_param_number
  406.               return parameter_list
  407.             end
  408.           end
  409.         end
  410.       end
  411.     return parameter_list
  412.   end
  413. end
复制代码

Lv3.寻梦者 (暗夜天使)

精灵族の天使

梦石
0
星屑
1697
在线时间
3038 小时
注册时间
2007-3-16
帖子
33731

开拓者贵宾

2
 楼主| 发表于 2008-12-10 22:06:10 | 只看该作者
占楼
Sprite_Shadow
  1. #==============================================================================
  2. #  阴影精灵(活动块) (渐变精灵(活动块))
  3. #------------------------------------------------------------------------------
  4. #    以 Genzai Kawakami的阴影脚本为基础。
  5. #    由 Rataime 重新编写功能并改进
  6. #    由 Boushy 增添新的功能。
  7. #    由 DerVVulfman 重新编辑。
  8. #    由 Syvkal 改写为VX版(精灵:依然有XP版的……)
  9. #    由 Painhurt 修正错误
  10. #    由 精灵使者 翻译并改进
  11. #    2008 年 10月 14日
  12. #
  13. #------------------------------------------------------------------------------
  14. #
  15. # 介绍
  16. #
  17. #  这个系统允许角色和所有“预定的”事件在地图上产生阴影。角色可以在“光源”四周
  18. #  移动,同时产生阴影。当然,特殊注释过的事件也会产生此光源的阴影。
  19. #
  20. #------------------------------------------------------------------------------
  21. #
  22. # 使用方法
  23. #
  24. #  -- 灯光光源
  25. #     为了制作光源,你需要在地图上建立一个作为灯光的事件。大多数情况下,这个事件
  26. #     使用“火炬”或者“灯”的行走图。举个例子,默认VX的other02的火炬和others03的
  27. #     灯。
  28. #
  29. #     如果想让其中的一个事件作为光源的话,你需要在光源的事件页里添加一系列东西。
  30. #     这些东西,仅仅是一些注释而已。
  31. #     
  32. #     你需要加的第一条注释是 begin Shadow Source (请不要加引号,大小写切记)。这
  33. #     个注释告知了系统,这个事件是一个光源。剩下的4个参数是可选的,而且在脚本的默
  34. #     认参数里已经定义过。当然,这些也可以加入做为注释。书写范例为:
  35. #     anglemin 90(不加引号)
  36. #
  37. #     anglemin 数字     --- 光源发光的起始扇形弧度(以逆时针旋转),0-360
  38. #     anglemax 数字     --- 光源发光的结束扇形弧度(以逆时针旋转),0-360
  39. #     *结束弧度一定要大于等于起始弧度值,如果相等则是360度普通光源
  40. #     distancemax 数字  --- 光源的强度,也就是说,远离光源多远不会产生此光的影子。
  41. #     光源的强度单位为像素。也就是说,32像素为一格,要计算好了。
  42. #     self_opacity 数字 --- 影子的深度,也就是你的影子的透明度是多少,(0-255)
  43. #     
  44. #     然后,你的角色就可以移动的时候产生影子了。
  45. #  -- 其他的事件
  46. #
  47. #     事件可不会知道他们如何会产生阴影。如果想让他们产生影子的话,你只需要在相应
  48. #     的事件页里放置一个解释,解释的事件里只需要一句短语“begin Shadow”(注意!
  49. #     不要带引号!)。
  50. #     
  51. #  -- 阻挡阴影
  52. #     为了防止当穿过一些可以移动的事件时候还有影子,例如门,墙壁,橱柜或者其他类
  53. #     型的家具,你需要在这些事件里面使用“与角色相同”或者”在角色上方“的优先级
  54. #     。在普通的情况下,在默认图块里的墙等物体,没有优先级标志,那么他们就仅仅阻
  55. #     挡玩家通行。   
  56. #
  57. #------------------------------------------------------------------------------
  58. #
  59. #  更新日志
  60. #
  61. #  1) 在脚本中增添了更人性化的标签和标题头。
  62. #  2) 在XPML模块里压缩了关键字分隔符和参数。
  63. #  3) 为了降低资源,将太阳产生的影子数组设成了实例变量。
  64. #  4) 与Near Fantastica 的人物跟随脚本兼容。
  65. #  5) 与Ccoa的人物跟随脚本兼容。
  66. #  6) 与Trickster的人物跟随脚本兼容。
  67. #  7) 在设定区段增加了默认的影子设定。
  68. #
  69. #==============================================================================
  70.    #========================================================================
  71.    #          设       定       系        统          部       分           #
  72.    #========================================================================
  73.     # 跟随系统部分设定(如果选用了相应的系统请选true,否则选false)
  74.     CATERPILLAR_COMPATIBLE      = true    # 原版跟随系统兼容开关   
  75.     SQUAD_MOVE_COMPATIBLE       = false   # Near Fantastica的跟随系统兼容开关
  76.     CCOA_CATER_COMPATIBLE       = false   # Ccoa的跟随系统兼容开关
  77.     TRICKSTER_CATER_COMPATIBLE  = false    # Trickster的跟随系统兼容开关
  78.         
  79.     #阴影系统的特殊设定
  80.     SHADOW_WARN                 = true    # 检查是否兼容老版本的阴影系统
  81.     SHADOW_MIN                  = 0       # 光源发光的起始扇形弧度
  82.     SHADOW_MAX                  = 0       # 光源发光的结束扇形弧度
  83.     SHADOW_OPACITY              = 150     # 影子的深度
  84.     SHADOW_DISTANCE             = 350     # 光源的强度(单位为像素)

  85.     #  光源的弧度     单位为角度,这个是控制光源强制往某个特定的角度发光,从
  86.     #                而使其产生阴影。这个在绘制挂在墙壁上的灯的时候特别有用。
  87.     #                从而防止他产生透过墙壁的阴影。
  88.     #
  89.     #                如果能准确的确定90度为界限的发射方向,还得需要好好的练习
  90.     #                。例如,0-90度是右上方向部分,90-180度是左上方向的部分等
  91.     #                等,以逆时针方向旋转。
  92.     #
  93.    #========================================================================
  94.    #        设         定       部          分          结      束          #
  95.    #========================================================================
  96.   
  97.   

  98. #==============================================================================
  99. # ■ Game_Temp
  100. #------------------------------------------------------------------------------
  101. #  在没有存档的情况下,处理临时数据的类。这个类的实例请参考 $game_temp 。
  102. #=============================================================================

  103. class Game_Temp
  104.   #--------------------------------------------------------------------------
  105.   # ● 定义实例变量
  106.   #--------------------------------------------------------------------------
  107.   attr_accessor :shadow_spriteset                         # 维持影子的活动块
  108. end



  109. #==============================================================================
  110. # ■ Game_Party
  111. #------------------------------------------------------------------------------
  112. #  处理同伴的类。包含金钱以及物品的信息。本类的实例请参考 $game_party。
  113. #==============================================================================

  114. class Game_Party
  115.   #--------------------------------------------------------------------------
  116.   # ● 定义实例变量
  117.   #--------------------------------------------------------------------------
  118.   attr_reader :characters
  119. end



  120. #==============================================================================
  121. #  Sprite_Shadow
  122. #------------------------------------------------------------------------------
  123. #  根据角色的地图位置来处理角色阴影角度的精灵(活动块)类。Game_Character 类的实例
  124. #  监视、活动块状态的自动变化。
  125. #==============================================================================
  126. class Sprite_Shadow < Sprite_Base
  127.   #--------------------------------------------------------------------------
  128.   # ● 定义实例变量
  129.   #--------------------------------------------------------------------------
  130.   attr_accessor :character
  131.   #--------------------------------------------------------------------------
  132.   # ● 初始化对象
  133.   #     viewport  : 显示端口
  134.   #     character : 角色 (Game_Character)
  135.   #     id        : 角色ID
  136.   #--------------------------------------------------------------------------
  137.   def initialize(viewport, character = nil, id = 0)
  138.     super(viewport)
  139.     params  = $game_temp.shadow_spriteset.shadows[id]
  140.     @source = params[0]
  141.     # 默认设置
  142.     @anglemin     = SHADOW_MIN
  143.     @anglemax     = SHADOW_MAX
  144.     @self_opacity = SHADOW_OPACITY
  145.     @distancemax  = SHADOW_DISTANCE
  146.     # 根据参数设置
  147.     @anglemin     = params[1]   if params.size > 1
  148.     @anglemax     = params[2]   if params.size > 2
  149.     @distancemax  = params[3]   if params.size > 3
  150.     @self_opacity = params[4]   if params.size > 4
  151.     @character = character
  152.     update
  153.   end
  154.   #--------------------------------------------------------------------------
  155.   # ● 更新画面
  156.   #--------------------------------------------------------------------------
  157.   def update
  158.     # 如果影子在光源范围之外的情况下
  159.     if !in_range?(@character, @source, @distancemax)
  160.       self.opacity = 0
  161.       return
  162.     end
  163.     super
  164.     # 在图块ID,文件名或者色相不同于当前的情况下
  165.     if @tile_id != @character.tile_id or
  166.        @character_name != @character.character_name or
  167.        @character_index != @character.character_index
  168.       @tile_id = @character.tile_id
  169.       @character_name = @character.character_name
  170.       @character_index = @character.character_index
  171.       if @tile_id > 0
  172.         sx = (@tile_id / 128 % 2 * 8 + @tile_id % 8) * 32;
  173.         sy = @tile_id % 256 / 8 % 16 * 32;
  174.         set_number = @tile_id / 256
  175.         self.bitmap = Cache.system("TileB") if set_number == 0
  176.         self.bitmap = Cache.system("TileC") if set_number == 1
  177.         self.bitmap = Cache.system("TileD") if set_number == 2
  178.         self.bitmap = Cache.system("TileE") if set_number == 3
  179.         self.src_rect.set(sx, sy, 32, 32)
  180.         self.ox = 16
  181.         self.oy = 32
  182.       else
  183.         self.bitmap = Cache.character(@character_name)
  184.         sign = @character_name[/^[\!\$]./]
  185.         if sign != nil and sign.include?('$')
  186.           @cw = bitmap.width / 3
  187.           @ch = bitmap.height / 4
  188.         else
  189.           @cw = bitmap.width / 12
  190.           @ch = bitmap.height / 8
  191.         end
  192.         self.ox = @cw / 2
  193.         self.oy = @ch
  194.       end
  195.     end
  196.     # 设置可见状况
  197.     self.visible = (not @character.transparent)
  198.     # 如果画面是角色的情况下
  199.     if @tile_id == 0
  200.       index = @character.character_index
  201.       pattern = @character.pattern < 3 ? @character.pattern : 1
  202.       # 矩形本体设定
  203.       sx = (index % 4 * 3 + pattern) * @cw
  204.       sy = (index / 4 * 4 + (@character.direction - 2) / 2) * @ch
  205.       if self.angle > 90 or angle < -90
  206.         sy = ( 4 - 2) / 2 * @ch   if @character.direction == 6
  207.         sy = ( 6 - 2) / 2 * @ch   if @character.direction == 4
  208.         sy = ( 8 - 2) / 2 * @ch   if @character.direction == 2
  209.         sy = ( 2 - 2) / 2 * @ch   if @character.direction == 8
  210.       end
  211.       self.src_rect.set(sx, sy, @cw, @ch)
  212.     end
  213.     # 设置精灵(活动块)的坐标   
  214.     self.x = @character.screen_x
  215.     self.y = @character.screen_y-5
  216.     self.z = 10 #@character.screen_z-1
  217.     # 设置合成方式和草木深度
  218.     self.blend_type = @character.blend_type
  219.     self.bush_depth = @character.bush_depth
  220.     # 显示动画
  221.     if @character.animation_id != 0
  222.       animation = $data_animations[@character.animation_id]
  223.       animation(animation, true)
  224.       @character.animation_id = 0
  225.     end
  226.     @deltax       = @source.screen_x - self.x
  227.     @deltay       = @source.screen_y - self.y
  228.     self.color    = Color.new(0, 0, 0)
  229.     @distance     = ((@deltax ** 2) + (@deltay ** 2))
  230.     # 按照光源离自己的距离来设置透明度
  231.     self.opacity  = @self_opacity * 13000 /
  232.                       ((@distance * 370 / @distancemax) + 6000)
  233.     self.angle    = 57.3 * Math.atan2(@deltax, @deltay )
  234.     @angle_trigo  = self.angle+90
  235.     if @angle_trigo < 0
  236.         @angle_trigo = 360 + @angle_trigo
  237.      end
  238.     if @anglemin != 0 or @anglemax != 0
  239.        if (@angle_trigo < @anglemin or @angle_trigo > @anglemax) and
  240.           @anglemin < @anglemax
  241.          self.opacity = 0
  242.          return
  243.        end
  244.        if (@angle_trigo < @anglemin and @angle_trigo > @anglemax) and
  245.           @anglemin > @anglemax
  246.          self.opacity=0
  247.          return
  248.        end   
  249.      end
  250.   end
  251.   #--------------------------------------------------------------------------
  252.   # ●  范围脚本  (从Near的防卡脚本中获取,已编辑)
  253.   #     element:     元件
  254.   #     object :     对象
  255.   #     range  :     图块间的范围
  256.   #--------------------------------------------------------------------------
  257.   def in_range?(element, object, range)
  258.     x = (element.screen_x - object.screen_x) * (element.screen_x - object.screen_x)
  259.     y = (element.screen_y - object.screen_y) * (element.screen_y - object.screen_y)
  260.     r = x + y
  261.     if r <= (range * range)
  262.        return true
  263.     else
  264.       return false
  265.     end
  266.   end
  267. end



  268. #==============================================================================
  269. # ■ Sprite_Character
  270. #------------------------------------------------------------------------------
  271. #  角色显示用脚本。监视 Game_Character 类的实例、自动变化脚本状态。
  272. #==============================================================================

  273. class Sprite_Character < Sprite_Base
  274.   #--------------------------------------------------------------------------
  275.   # ● 重命名函数列表
  276.   #--------------------------------------------------------------------------
  277.   alias shadow_initialize initialize
  278.   alias shadow_update update  
  279.   #--------------------------------------------------------------------------
  280.   # ● 初始化对像
  281.   #     viewport  : 显示端口
  282.   #     character : 角色 (Game_Character)
  283.   #--------------------------------------------------------------------------
  284.   def initialize(viewport, character = nil)
  285.     @viewport0 = Viewport.new(0, 0, 544, 416)
  286.     @viewport0.z = 1
  287.     @character = character
  288.     super(viewport)
  289.     @ombrelist = Array.new
  290.     @ombrelist = []
  291.     if character.is_a?(Game_Event) and $game_temp.shadow_spriteset.shadows != []
  292.       params = XPML.XPML_read("Shadow", @character.id, 5)
  293.       if params != nil
  294.         for i in 0...$game_temp.shadow_spriteset.shadows.size
  295.           @ombrelist.push(Sprite_Shadow.new(@viewport0, @character,i))
  296.         end
  297.       end
  298.     end
  299.     if character.is_a?(Game_Player) and $game_temp.shadow_spriteset.shadows != []
  300.       for i in 0...$game_temp.shadow_spriteset.shadows.size
  301.         @ombrelist.push(Sprite_Shadow.new(@viewport0, $game_player,i))
  302.       end
  303.       #===================================================
  304.       # ● 与人物跟随功能兼容脚本
  305.       #===================================================
  306.       if CATERPILLAR_COMPATIBLE and $game_party.characters != nil
  307.         for member in $game_party.characters
  308.           for i in 0...$game_temp.shadow_spriteset.shadows.size
  309.             @ombrelist.push(Sprite_Shadow.new(@viewport0, member, i))
  310.           end
  311.         end
  312.       end
  313.       if SQUAD_MOVE_COMPATIBLE and $game_allies.values != nil
  314.         for member in $game_allies.values
  315.           for i in 0...$game_temp.shadow_spriteset.shadows.size
  316.             @ombrelist.push(Sprite_Shadow.new(@viewport0, member, i))
  317.           end
  318.         end
  319.       end
  320.       if CCOA_CATER_COMPATIBLE and $game_train.actors != nil
  321.         for member in $game_train.actors
  322.           for i in 0...$game_temp.shadow_spriteset.shadows.size
  323.             @ombrelist.push(Sprite_Shadow.new(@viewport0, member, i))
  324.           end
  325.         end
  326.       end
  327.       if TRICKSTER_CATER_COMPATIBLE and $game_party.followers != nil
  328.         for member in $game_party.followers
  329.           for i in 0...$game_temp.shadow_spriteset.shadows.size
  330.             @ombrelist.push(Sprite_Shadow.new(@viewport0, member, i))
  331.           end
  332.         end
  333.       end
  334.       #===================================================
  335.       # ● 兼容脚本结束
  336.       #===================================================     
  337.     end
  338.     # 执行原始函数调用
  339.     shadow_initialize(viewport, @character)
  340.   end
  341.   #--------------------------------------------------------------------------
  342.   # ● 更新画面
  343.   #--------------------------------------------------------------------------
  344.   def update
  345.     shadow_update
  346.     if @ombrelist != []
  347.       for i in [email protected]
  348.         @ombrelist[i].update

  349.       end
  350.     end
  351.   end  
  352. end



  353. #==================================================================================
  354. # ■ Game_Event
  355. #------------------------------------------------------------------------------
  356. #  处理事件的类。条件判断、事件页的切换、并行处理、执行事件功能
  357. # 在 Game_Map 类的内部使用。
  358. #==================================================================================
  359. class Game_Event < Game_Character
  360.   #--------------------------------------------------------------------------
  361.   # ● 定义实例变量
  362.   #--------------------------------------------------------------------------
  363.   attr_accessor :id
  364. end



  365. #==================================================================================
  366. # ■ Spriteset_Map
  367. #------------------------------------------------------------------------------
  368. #  处理地图画面活动块和元件的类。本类在 Scene_Map 类的内部使用。
  369. #================================================================================

  370. class Spriteset_Map
  371.   #--------------------------------------------------------------------------
  372.   # ● 定义实例变量
  373.   #--------------------------------------------------------------------------  
  374.   attr_accessor :shadows
  375.   #--------------------------------------------------------------------------
  376.   # ● 重命名函数列表
  377.   #--------------------------------------------------------------------------   
  378.   alias shadow_initialize initialize
  379.   #--------------------------------------------------------------------------
  380.   # ● 初始化对象
  381.   #--------------------------------------------------------------------------  
  382.   def initialize
  383.     $game_temp.shadow_spriteset = self
  384.     @shadows = []
  385.     warn = false
  386.     for k in $game_map.events.keys.sort
  387.       if ($game_map.events[k].list != nil and
  388.             $game_map.events[k].list[0].code == 108 and
  389.             ($game_map.events[k].list[0].parameters == ["s"] or
  390.             $game_map.events[k].list[0].parameters == ["o"]))
  391.         warn = true        
  392.       end
  393.       params = XPML.XPML_read("Shadow Source", k, 5)
  394.       if params != nil
  395.         $game_temp.shadow_spriteset.shadows.push([$game_map.events[k]] + params)
  396.       end
  397.     end
  398.     if warn == true and SHADOW_WARN
  399.       p "警告:在地图上至少有一个事件使用了过去的方法来添加阴影效果"
  400.     end
  401.     # 执行原始函数调用
  402.     shadow_initialize
  403.   end  
  404. end



  405. #==============================================================================
  406. # ■ module XPML
  407. #------------------------------------------------------------------------------
  408. #  本模块用来读取并传递注释中的参数。
  409. #
  410. #  使用此模块的主要用途就是检查和读出事件的注释。
  411. #  * 标记的关键字的注明方法:
  412. #    begin 关键字
  413. #  * 注意参数之间必须用关键字隔开。
  414. #  * 调用此函数的方法:
  415. #    XPML_read("关键字",事件ID,读取参数的最大值)
  416. #  * 最后一项可以忽略,默认为整个事件。
  417. #  * 赋值方法:
  418. #    变量名 参数
  419. #  * 每个变量名和参数各占一行。
  420. #  * 如果指明的关键字在事件里面不存在的话,则返回nil。
  421. #  * 如果两个标记之间没有参数的话,则返回空数组。
  422. #  * 如果参数中有数字参数的话,会自动返回为数字变量。
  423. #  举例:在一个事件中的注释写入
  424. #       begin first # 第一关键字
  425. #       begin second #第二关键字
  426. #       变量1 1
  427. #       变量2 two
  428. #       begin third #第三关键字
  429. #       任何东西 3
  430. #  然后得出转换结果:
  431. #   p XPML_read("first", event_id) -> [] #第一关键字和第二关键字没有参数
  432. #   p XPML_read("second", event_id) -> [1,"two"] #第二关键字和第三关键字之间有2个参数
  433. #   p XPML_read("third", event_id) -> [3] #第三关键字之间有一个参数
  434. #   p XPML_read("forth", event_id) -> nil #找不到第四关键字则返回nil
  435. #===================================================


  436. module XPML
  437.   module_function
  438.   #--------------------------------------------------------------------------
  439.   # ● XPML_read
  440.   #     markup           : 需要在文件注释里检查的关键字。
  441.   #     event_id         : 事件ID
  442.   #     max_param_number : 读取参数/注释的最大值,0为事件内的所有注释
  443.   #--------------------------------------------------------------------------  
  444.   def XPML_read(markup, event_id, max_param_number = 0)
  445.     parameter_list = nil
  446.     event = $game_map.events[event_id]
  447.     return if event.list == nil
  448.       for i in 0...event.list.size
  449.         if event.list[i].code == 108 and
  450.           event.list[i].parameters[0].downcase == "begin " + markup.downcase
  451.           parameter_list = [] if parameter_list == nil
  452.           for j in i + 1...event.list.size
  453.             if event.list[j].code == 108
  454.               parts = event.list[j].parameters[0].split
  455.               if parts.size != 1 and parts[0].downcase != "begin"
  456.                 if parts[1].to_i != 0 or parts[1] == "0"
  457.                   parameter_list.push(parts[1].to_i)
  458.                 else
  459.                   parameter_list.push(parts[1])
  460.                 end
  461.               else
  462.                 return parameter_list
  463.               end
  464.             else
  465.               return parameter_list
  466.             end
  467.             if max_param_number != 0 and j == i + max_param_number
  468.               return parameter_list
  469.             end
  470.           end
  471.         end
  472.       end
  473.     return parameter_list
  474.   end
  475. end
复制代码
[LINE]1,#dddddd[/LINE]版主对此帖的认可:『800for debug&重写 1200for 翻译 200 for 讲解』,积分『+2200』。
顺手贴一个XP的影子脚本(由于用法十分简单,就不放工程了。p.s.光线是无限远的。)

  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

复制代码
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

lov Peii 4ever

梦石
0
星屑
50
在线时间
1 小时
注册时间
2008-10-28
帖子
423
3
发表于 2008-12-11 02:48:49 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

精灵族の天使

梦石
0
星屑
1697
在线时间
3038 小时
注册时间
2007-3-16
帖子
33731

开拓者贵宾

4
 楼主| 发表于 2008-12-11 06:16:52 | 只看该作者
以下引用3nξhα0_lim于2008-12-10 18:48:49的发言:

XP版之前在地球存看过,不过现在不知到为什么找不着了……

我翻译的时候看更新历史应该是从XP版移植过来的。
麻烦找一下XP版的资料。
另外顺手PIA飞改动标题的某人
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

lov Peii 4ever

梦石
0
星屑
50
在线时间
1 小时
注册时间
2008-10-28
帖子
423
5
发表于 2008-12-11 06:34:48 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

精灵族の天使

梦石
0
星屑
1697
在线时间
3038 小时
注册时间
2007-3-16
帖子
33731

开拓者贵宾

6
 楼主| 发表于 2008-12-11 06:55:10 | 只看该作者
以下引用3nξhα0_lim于2008-12-10 22:34:48的发言:


以下引用精灵使者于2008-12-10 22:16:52的发言:
我翻译的时候看更新历史应该是从XP版移植过来的。
麻烦找一下XP版的资料。
另外顺手PIA飞改动标题的某人


啊哈哈哈哈,XP版的让我给找到了。
使用方法:在事件第一页添加注释,内容为『s』,小写。这就是光源的设置方法。
[本贴由作者于 2008-12-10 22:43:02 最后编辑]

谢了~等我翻译以后更新到二楼。
OK~更新完毕~话说XP的比VX的果然简单很多,功能也简陋很多……
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

lov Peii 4ever

梦石
0
星屑
50
在线时间
1 小时
注册时间
2008-10-28
帖子
423
7
发表于 2008-12-11 15:40:19 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

精灵族の天使

梦石
0
星屑
1697
在线时间
3038 小时
注册时间
2007-3-16
帖子
33731

开拓者贵宾

8
 楼主| 发表于 2008-12-11 20:49:49 | 只看该作者
问题是有人想要远大近小脚本和其整合。
而我想要烛光系统与其整合。
p.s.远大近小脚本和XP的整合部分见提问区
另外,如果那些注释在任何地方都有效就好了……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
62
在线时间
1 小时
注册时间
2008-1-4
帖子
260
9
发表于 2008-12-11 22:22:17 | 只看该作者
支持!期待高手来完善
回复 支持 反对

使用道具 举报

Lv2.观梦者

沉默的羔狼

梦石
0
星屑
268
在线时间
72 小时
注册时间
2005-10-23
帖子
3534
10
发表于 2008-12-12 18:45:41 | 只看该作者
不错啊!

点评

- - 发现是坟帖  发表于 2010-7-29 15:11
能把灰小伙素材发挥得更好了  发表于 2010-7-29 15:10
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-20 12:17

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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