Project1

标题: 【地图美化】水面上的倒影 [打印本页]

作者: heiwang1997    时间: 2013-1-25 09:36
标题: 【地图美化】水面上的倒影
本帖最后由 heiwang1997 于 2013-1-25 09:37 编辑

我知道这个范例国外有人做了,但是下载不能……{:2_270:}
下面给大家谈谈我自己做倒影的思路(虽然效果不是很好),个人觉得这样做比较简便
高手可以根据这个思路自己做倒影,注意一下范例和脚本冲突可能性比较大,只适合新手使用

最终效果:




主要思路:
1.使用太阳精灵脚本把影子由黑色改为正常颜色
2.把影子层夹在远景层和地图层中间
3.远景层用水面

范例制作过程(仅供参考):
1. 打开数据库,更改你所用地图的“水”的自动原件为图示自动原件

即为

远景图改为下面两幅图片(任选其一)



这个时候可以进游戏看下效果,应该跟以前没什么差别

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



  66. #========================================================================
  67. # ■ 设 定 系 统 部 分 ■ #
  68. #========================================================================
  69. # 跟随系统部分设定(如果选用了相应的系统请选true,否则选false)
  70. CATERPILLAR_COMPATIBLE = true # 原版跟随系统兼容开关
  71. SQUAD_MOVE_COMPATIBLE = false # Near Fantastica的跟随系统兼容开关
  72. CCOA_CATER_COMPATIBLE = false # Ccoa的跟随系统兼容开关
  73. TRICKSTER_CATER_COMPATIBLE = false # Trickster的跟随系统兼容开关

  74. # 太阳系统的特别设定
  75. SUN_WARN = true # 检查是否兼容老版本的太阳系统
  76. SUN_ANGLE = 270 # 默认太阳系统产生的影子角度
  77. SUN_OPACITY = 128 # 默认太阳系统产生的影子深度


  78. #========================================================================
  79. # ■■ 设 定 部 分 结 束 ■■ #
  80. #========================================================================
  81. class Game_Temp
  82. attr_accessor :sun_spriteset
  83. end

  84. class Game_Party
  85. attr_reader :characters
  86. end

  87. class Sprite_Sun < RPG::Sprite
  88. attr_accessor :character
  89. def initialize(viewport, character = nil, id=0)
  90. super(viewport)
  91. @character = character
  92. params=$game_temp.sun_spriteset.sun[id]
  93. # 默认设置
  94. self_angle = SUN_ANGLE
  95. self_opacity = SUN_OPACITY
  96. # 根据参数的设置
  97. self_angle = params[0] if params.size > 0
  98. self_opacity = params[1] if params.size > 1
  99. @self_angle = self_angle
  100. @self_opacity = self_opacity
  101. update
  102. end
  103. def update
  104. super
  105. if @tile_id != @character.tile_id or
  106. @character_name != @character.character_name or
  107. @character_hue != @character.character_hue
  108. @tile_id = @character.tile_id
  109. @character_name = @character.character_name
  110. @character_hue = @character.character_hue
  111. if @tile_id > 0
  112. sx = (@tile_id / 128 % 2 * 8 + @tile_id % 8) * 32;
  113. sy = @tile_id % 256 / 8 % 16 * 32;
  114. set_number = @tile_id / 256
  115. self.bitmap = RPG::Cache.system("TileB") if set_number == 0
  116. self.bitmap = RPG::Cache.system("TileC") if set_number == 1
  117. self.bitmap = RPG::Cache.system("TileD") if set_number == 2
  118. self.bitmap = RPG::Cache.system("TileE") if set_number == 3
  119. self.src_rect.set(0, 0, 32, 32)
  120. self.ox = 16
  121. self.oy = 32
  122. else
  123. #self.bitmap =RPG::Cache.character(@character_name)#影子参数的对应修改
  124. self.bitmap = RPG::Cache.character(@character.character_name,
  125. @character.character_hue)
  126. sign = @character_name[/^[\!\$]./]
  127. if sign != nil and sign.include?('$')
  128. @cw = bitmap.width / 4#影子的完整度设定
  129. @ch = bitmap.height / 4#影子的完整度设定
  130. else
  131. @cw = bitmap.width / 4#影子的完整度设定
  132. @ch = bitmap.height / 4#影子的完整度设定
  133. end
  134. self.ox = @cw / 2
  135. self.oy = @ch
  136. end
  137. end
  138. # 设置可见状况
  139. self.visible = (not @character.transparent)
  140. # 如果画面是角色的情况下
  141. if @tile_id == 0
  142. hue = @character.character_hue
  143. pattern = @character.pattern < 3 ? @character.pattern : 1
  144. # 矩形本体设定
  145. sx = (hue % 4 * 3 + pattern) * @cw
  146. @direct = @character.direction
  147. if self.angle > 90 or angle < -90
  148. sy = ( 4 - 2) / 2 * @ch if @direct == 6
  149. sy = ( 6 - 2) / 2 * @ch if @direct == 4
  150. sy = (@character.direction - 2) / 2 * @ch if @direct != 4 and @direct != 6
  151. else
  152. sy = (hue / 4 * 4 + (@character.direction - 2) / 2) * @ch
  153. #sy = @character.direction
  154. end
  155. self.src_rect.set(sx, sy, @cw, @ch)
  156. end
  157. # 设置精灵(活动块)的坐标
  158. self.x = @character.screen_x#
  159. self.y = @character.screen_y + 5 #
  160. #self.z = 10#@character.screen_z-1

  161. self.z = @character.screen_z(@ch)-1#
  162. # 设置不透明度,合成方式和草木深度
  163. self.opacity = @self_opacity
  164. # self.opacity = @character.opacity#
  165. self.blend_type = @character.blend_type
  166. self.bush_depth = @character.bush_depth
  167. # 显示动画
  168. if @character.animation_id != 0#
  169. animation = $data_animations[@character.animation_id]#
  170. animation(animation, true)#
  171. @character.animation_id = 0#
  172. end
  173. self.angle = @self_angle.to_i - 90
  174. end
  175. end
  176. class Sprite_Character < RPG::Sprite
  177. alias sun_initialize initialize
  178. alias sun_update update
  179. def initialize(viewport, character = nil)
  180. @character = character
  181. super(viewport)
  182. @sunlist=[]
  183. if character.is_a?(Game_Event) and $game_temp.sun_spriteset.sun != []
  184. params = XPML.XPML_read("Shadow", @character.id, 2)
  185. if params != nil
  186. for i in 0...$game_temp.sun_spriteset.sun.size
  187. @sunlist.push(Sprite_Sun.new($viewport5, @character, i))
  188. end
  189. end
  190. end
  191. if character.is_a?(Game_Player) and $game_temp.sun_spriteset.sun != []
  192. for i in 0...$game_temp.sun_spriteset.sun.size
  193. @sunlist.push(Sprite_Sun.new($viewport5, $game_player, i))
  194. end
  195. #===================================================
  196. # ● 与人物跟随功能兼容脚本
  197. #===================================================
  198. if CATERPILLAR_COMPATIBLE and $game_party.characters != nil
  199. for member in $game_party.characters
  200. for i in 0...$game_temp.sun_spriteset.sun.size
  201. @sunlist.push(Sprite_Sun.new(viewport, member, i))
  202. end
  203. end
  204. end
  205. if SQUAD_MOVE_COMPATIBLE and $game_allies.values != nil
  206. for member in $game_allies.values
  207. for i in 0...$game_temp.sun_spriteset.sun.size
  208. @sunlist.push(Sprite_Sun.new(viewport, member, i))
  209. end
  210. end
  211. end
  212. if CCOA_CATER_COMPATIBLE and $game_train.actors != nil
  213. for member in $game_train.actors
  214. for i in 0...$game_temp.sun_spriteset.sun.size
  215. @sunlist.push(Sprite_Sun.new(viewport, member, i))
  216. end
  217. end
  218. end
  219. if TRICKSTER_CATER_COMPATIBLE and $game_party.followers != nil
  220. for member in $game_party.followers
  221. for i in 0...$game_temp.sun_spriteset.sun.size
  222. @sunlist.push(Sprite_Sun.new(viewport, member, i))
  223. end
  224. end
  225. end
  226. #===================================================
  227. # ● 兼容脚本结束
  228. #===================================================
  229. end
  230. # 执行原始函数调用
  231. sun_initialize(viewport, @character)
  232. end
  233. def update

  234. sun_update
  235. if @sunlist != []
  236. for i in [email protected]
  237. @sunlist[i].update
  238. end
  239. end
  240. end
  241. end
  242. class Game_Event < Game_Character
  243. attr_accessor :id
  244. end
  245. class Spriteset_Map
  246. attr_accessor :sun
  247. alias sun_initialize initialize
  248. def initialize
  249. [url=home.php?mod=space&uid=33565]@sun[/url] = []
  250. $game_temp.sun_spriteset = self
  251. warn = false
  252. for k in $game_map.events.keys.sort
  253. if ($game_map.events[k].list != nil and
  254. $game_map.events[k].list[0].code == 108 and
  255. ($game_map.events[k].list[0].parameters == ["Sun"] or
  256. $game_map.events[k].list[0].parameters == ["o"]))
  257. warn = true
  258. end
  259. params = XPML.XPML_read("Sun", k, 2)
  260. $game_temp.sun_spriteset.sun.push(params) if params != nil
  261. end
  262. if warn == true and SUN_WARN
  263. p "警告:在地图上至少有一个事件使用了过去的方法来添加太阳效果"
  264. end
  265. sun_initialize
  266. end
  267. end
  268. module XPML
  269. module_function
  270. def XPML_read(markup, event_id, max_param_number = 0)
  271. parameter_list = nil
  272. event = $game_map.events[event_id]
  273. return if event.list == nil
  274. for i in 0...event.list.size
  275. if event.list[i].code == 108 and
  276. event.list[i].parameters[0].downcase == "begin " + markup.downcase
  277. parameter_list = [] if parameter_list == nil
  278. for j in i + 1...event.list.size
  279. if event.list[j].code == 108
  280. parts = event.list[j].parameters[0].split
  281. if parts.size != 1 and parts[0].downcase != "begin"
  282. if parts[1].to_i != 0 or parts[1] == "0"
  283. parameter_list.push(parts[1].to_i)
  284. else
  285. parameter_list.push(parts[1])
  286. end
  287. else
  288. return parameter_list
  289. end
  290. else
  291. return parameter_list
  292. end
  293. if max_param_number != 0 and j == i + max_param_number
  294. return parameter_list
  295. end
  296. end
  297. end
  298. end
  299. return parameter_list
  300. end
  301. end
复制代码
脚本二:对Spriteset_map的全新定义(实际上是我懒的不想用Alias)
修改部分:新建查看端口4和5,把远景图层移到端口4,倒影显示在端口5
实例:端口4:@viewport4  端口5:$viewport5
  1. #==============================================================================
  2. # ■ Spriteset_Map
  3. #------------------------------------------------------------------------------
  4. #  处理地图画面活动块和元件的类。本类在
  5. # Scene_Map 类的内部使用。
  6. #==============================================================================

  7. class Spriteset_Map
  8. #--------------------------------------------------------------------------
  9. # ● 初始化对像
  10. #--------------------------------------------------------------------------
  11. def initialize
  12. # 生成显示端口
  13. @viewport4 = Viewport.new(0, 0, 640, 480)
  14. $viewport5 = Viewport.new(0, 0, 640, 480)
  15. @viewport1 = Viewport.new(0, 0, 640, 480)
  16. @viewport2 = Viewport.new(0, 0, 640, 480)
  17. @viewport3 = Viewport.new(0, 0, 640, 480)
  18. @viewport1.z = 100
  19. @viewport4.z = 0
  20. $viewport5.z = 50
  21. @viewport2.z = 200
  22. @viewport3.z = 5000
  23. # 生成元件地图
  24. @tilemap = Tilemap.new(@viewport1)
  25. @tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name)
  26. for i in 0..6
  27. autotile_name = $game_map.autotile_names[i]
  28. @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name)
  29. end
  30. @tilemap.map_data = $game_map.data
  31. @tilemap.priorities = $game_map.priorities
  32. # 生成远景平面
  33. @panorama = Plane.new(@viewport4)
  34. @panorama.z = -1000
  35. # 生成雾平面
  36. [url=home.php?mod=space&uid=14217]@fog[/url] = Plane.new(@viewport1)
  37. @fog.z = 3000
  38. # 生成角色活动块
  39. @character_sprites = []
  40. for i in $game_map.events.keys.sort
  41. sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
  42. @character_sprites.push(sprite)
  43. end
  44. @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
  45. # 生成天气
  46. @weather = RPG::Weather.new(@viewport1)
  47. # 生成图片
  48. @picture_sprites = []
  49. for i in 1..50
  50. @picture_sprites.push(Sprite_Picture.new(@viewport2,
  51. $game_screen.pictures[i]))
  52. end
  53. # 生成计时器块
  54. @timer_sprite = Sprite_Timer.new
  55. # 刷新画面
  56. update
  57. end
  58. #--------------------------------------------------------------------------
  59. # ● 释放
  60. #--------------------------------------------------------------------------
  61. def dispose
  62. # 释放元件地图
  63. @tilemap.tileset.dispose
  64. for i in 0..6
  65. @tilemap.autotiles[i].dispose
  66. end
  67. @tilemap.dispose
  68. # 释放远景平面
  69. @panorama.dispose
  70. # 释放雾平面
  71. @fog.dispose
  72. # 释放角色活动块
  73. for sprite in @character_sprites
  74. sprite.dispose
  75. end
  76. # 释放天候
  77. @weather.dispose
  78. # 释放图片
  79. for sprite in @picture_sprites
  80. sprite.dispose
  81. end
  82. # 释放计时器块
  83. @timer_sprite.dispose
  84. # 释放显示端口
  85. @viewport1.dispose
  86. @viewport2.dispose
  87. @viewport3.dispose
  88. @viewport4.dispose
  89. $viewport5.dispose
  90. end
  91. #--------------------------------------------------------------------------
  92. # ● 刷新画面
  93. #--------------------------------------------------------------------------
  94. def update
  95. # 远景与现在的情况有差异发情况下
  96. if @panorama_name != $game_map.panorama_name or
  97. @panorama_hue != $game_map.panorama_hue
  98. @panorama_name = $game_map.panorama_name
  99. @panorama_hue = $game_map.panorama_hue
  100. if @panorama.bitmap != nil
  101. @panorama.bitmap.dispose
  102. @panorama.bitmap = nil
  103. end
  104. if @panorama_name != ""
  105. @panorama.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
  106. end
  107. Graphics.frame_reset
  108. end
  109. # 雾与现在的情况有差异的情况下
  110. if @fog_name != $game_map.fog_name or @fog_hue != $game_map.fog_hue
  111. @fog_name = $game_map.fog_name
  112. @fog_hue = $game_map.fog_hue
  113. if @fog.bitmap != nil
  114. @fog.bitmap.dispose
  115. @fog.bitmap = nil
  116. end
  117. if @fog_name != ""
  118. @fog.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
  119. end
  120. Graphics.frame_reset
  121. end
  122. # 刷新元件地图
  123. @tilemap.ox = $game_map.display_x / 4
  124. @tilemap.oy = $game_map.display_y / 4
  125. @tilemap.update
  126. # 刷新远景平面
  127. @panorama.ox = $game_map.display_x / 8
  128. @panorama.oy = $game_map.display_y / 8
  129. # 刷新雾平面
  130. @fog.zoom_x = $game_map.fog_zoom / 100.0
  131. @fog.zoom_y = $game_map.fog_zoom / 100.0
  132. @fog.opacity = $game_map.fog_opacity
  133. @fog.blend_type = $game_map.fog_blend_type
  134. @fog.ox = $game_map.display_x / 4 + $game_map.fog_ox
  135. @fog.oy = $game_map.display_y / 4 + $game_map.fog_oy
  136. @fog.tone = $game_map.fog_tone
  137. # 刷新角色活动块
  138. for sprite in @character_sprites
  139. sprite.update
  140. end
  141. # 刷新天候图形
  142. @weather.type = $game_screen.weather_type
  143. @weather.max = $game_screen.weather_max
  144. @weather.ox = $game_map.display_x / 4
  145. @weather.oy = $game_map.display_y / 4
  146. @weather.update
  147. # 刷新图片
  148. for sprite in @picture_sprites
  149. sprite.update
  150. end
  151. # 刷新计时器块
  152. @timer_sprite.update
  153. # 设置画面的色调与震动位置
  154. @viewport1.tone = $game_screen.tone
  155. @viewport1.ox = $game_screen.shake
  156. @viewport4.tone = $game_screen.tone
  157. @viewport4.ox = $game_screen.shake
  158. $viewport5.tone = $game_screen.tone
  159. $viewport5.ox = $game_screen.shake
  160. # 设置画面的闪烁色
  161. @viewport3.color = $game_screen.flash_color
  162. # 刷新显示端口
  163. @viewport1.update
  164. $viewport5.update
  165. @viewport4.update
  166. @viewport3.update
  167. end
  168. end
复制代码
3.在有水面的地图上新建事件,事件页的第一项为注释“begin Sun”
在你想在水面上显示阴影的事件的事件页第一页开头注释“begin shadow”
搞定,进游戏就能看见效果了{:2_274:}

范例: 水面·倒影.zip (226.72 KB, 下载次数: 232)

作者: Shure    时间: 2013-1-25 10:38
这脚本……不是一次两次见到了。
但这个脚本还是不错……虽然不是楼主原创的。
作者: 1733450036    时间: 2013-1-25 11:52
板凳啊。你终于上线了,这个脚本对我用处很大啊,你的BFS我在改造兼容3.91啊,好难啊,需要将xas3.91的全键盘调整,全部都是全键盘脚本错误




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