搜索附件  
同能RPG制作大师 附件中心 同能RM技术讨论区 RPG Maker XP 讨论区 【地图美化】水面上的倒影: d2.jpg

【地图美化】水面上的倒影: d2.jpg

 

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

最终效果:




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

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

即为

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



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

2.使用脚本(来自太阳精灵)
脚本一:修改版的太阳精灵
    ❤修改部分:
        A 影子颜色(改为正常颜色)
        B 影子的可视端
        C 影子位置的微调
  1. #==================================================================================# ■ 太阳精灵(活动块修改版) modified by heiwang# 由于是借用别人的脚本,我也不多说什么了# 这是VX版本的太阳精灵,不过貌似XP中也能用,呵呵#==================================================================================# 由阴影精灵(活动块)为基础# 由 Rataime 原创。# 由 DerVVulfman 重新编辑。# 由 Syvkal 改写为VX(精灵:应该有XP版本的吧。)# 由 Painhurt 进行修正。# 由 精灵使者 进行汉化并修正。# 2008年10月14日#------------------------------------------------------------------------------## 介绍:## 这个系统允许角色和所有“已经准备好的”事件在大地图上产生阴影。当角色四处移动的# 时候,将会出现由算法算出的像阳光照射一样的影子。当然,经过在事件页里特殊注释的# 事件也会同样产生影子。# #------------------------------------------------------------------------------## 使用方法:## -- 太阳# 想创建阳光效果的话,你必须要在地图上创建一个“太阳”的事件。在很多的场合之下# ,这个事件的行走图肯定是空白的。你肯定不想“看”到太阳,是么?(精灵:太阳事# 件无论在任何位置,只要在地图内就可以了喵~当然,此事件不能加任何启动条件。)## 想把这些事件的其中的一个当做太阳,那么你就必须在这个事件页里面添加一些东西。# 这些东西没有什么太多的,仅仅是一些注释而已。## 你首先要添加的注释就是“begin Sun”请不要加引号。这个告诉了系统,这张地图要使# 使用太阳效果。剩下的两个值是可选项,而且在脚本里面有默认值(当然只加进了脚本里# 面)。当然,这些也可以加入作为注释。注意大小写,一定要符合要求。注:切记不能写# 在一起,每个注释一行。## begin Sun --- 启动太阳系统# self_angle 数字 --- 每个影子的角度是多少。(0-360)# self_opacity 数字 --- 影子的不透明度是多少。(0-255)# 书写格式举例:self_angle 90## 然后,你的角色移动的时候就会自动产生影子了。## -- 其他事件# 事件不会知道他们如何才可以产生阴影。如果想让他们产生阴影的话,你只需要在此事件# 的的事件页里添加一段特殊的注释。这个注释仅仅是一个特殊短语“begin shadow”(再# 次注意,不要加引号)。请注意,产生阴影的优先级一定为“与角色相同”或者“上方”# 才可以产生阴影。注意有些事件如果处于在画面以上的优先级的情况之下,其影子会被遮# 掩,所以不要启用那些事件的阴影,切记。###------------------------------------------------------------------------------## 更新日志:## 1) 在脚本中增添了更人性化的标签和标题头。# 2) 在XPML模块里压缩了关键字分隔符和参数。# 3) 为了降低资源,将太阳产生的影子数组设成了实例变量。# 4) 与Near Fantastica 的人物跟随脚本兼容。# 5) 与Ccoa的人物跟随脚本兼容。# 6) 与Trickster的人物跟随脚本兼容。# 7) 在设定区段增加了默认的影子设定。##==================================================================================#========================================================================# ■ 设 定 系 统 部 分 ■ ##========================================================================# 跟随系统部分设定(如果选用了相应的系统请选true,否则选false)CATERPILLAR_COMPATIBLE = true # 原版跟随系统兼容开关 SQUAD_MOVE_COMPATIBLE = false # Near Fantastica的跟随系统兼容开关CCOA_CATER_COMPATIBLE = false # Ccoa的跟随系统兼容开关TRICKSTER_CATER_COMPATIBLE = false # Trickster的跟随系统兼容开关# 太阳系统的特别设定SUN_WARN = true # 检查是否兼容老版本的太阳系统SUN_ANGLE = 270 # 默认太阳系统产生的影子角度SUN_OPACITY = 128 # 默认太阳系统产生的影子深度#========================================================================# ■■ 设 定 部 分 结 束 ■■ ##========================================================================class Game_Tempattr_accessor :sun_spritesetendclass Game_Partyattr_reader :charactersendclass Sprite_Sun < RPG::Spriteattr_accessor :character def initialize(viewport, character = nil, id=0)super(viewport)@character = characterparams=$game_temp.sun_spriteset.sun[id]# 默认设置self_angle = SUN_ANGLEself_opacity = SUN_OPACITY# 根据参数的设置self_angle = params[0] if params.size > 0self_opacity = params[1] if params.size > 1@self_angle = self_angle@self_opacity = self_opacityupdateenddef updatesuperif @tile_id != @character.tile_id or@character_name != @character.character_name or@character_hue != @character.character_hue@tile_id = @character.tile_id@character_name = @character.character_name@character_hue = @character.character_hueif @tile_id > 0sx = (@tile_id / 128 % 2 * 8 + @tile_id % 8) * 32;sy = @tile_id % 256 / 8 % 16 * 32;set_number = @tile_id / 256self.bitmap = RPG::Cache.system("TileB") if set_number == 0self.bitmap = RPG::Cache.system("TileC") if set_number == 1self.bitmap = RPG::Cache.system("TileD") if set_number == 2self.bitmap = RPG::Cache.system("TileE") if set_number == 3self.src_rect.set(0, 0, 32, 32)self.ox = 16self.oy = 32else#self.bitmap =RPG::Cache.character(@character_name)#影子参数的对应修改self.bitmap = RPG::Cache.character(@character.character_name,@character.character_hue)sign = @character_name[/^[\!\$]./]if sign != nil and sign.include?('$')@cw = bitmap.width / 4#影子的完整度设定@ch = bitmap.height / 4#影子的完整度设定else@cw = bitmap.width / 4#影子的完整度设定@ch = bitmap.height / 4#影子的完整度设定endself.ox = @cw / 2self.oy = @chendend# 设置可见状况self.visible = (not @character.transparent)# 如果画面是角色的情况下if @tile_id == 0hue = @character.character_huepattern = @character.pattern < 3 ? @character.pattern : 1# 矩形本体设定sx = (hue % 4 * 3 + pattern) * @cw@direct = @character.directionif self.angle > 90 or angle < -90sy = ( 4 - 2) / 2 * @ch if @direct == 6sy = ( 6 - 2) / 2 * @ch if @direct == 4sy = (@character.direction - 2) / 2 * @ch if @direct != 4 and @direct != 6elsesy = (hue / 4 * 4 + (@character.direction - 2) / 2) * @ch#sy = @character.directionendself.src_rect.set(sx, sy, @cw, @ch)end# 设置精灵(活动块)的坐标self.x = @character.screen_x# self.y = @character.screen_y + 5 # #self.z = 10#@character.screen_z-1self.z = @character.screen_z(@ch)-1# # 设置不透明度,合成方式和草木深度self.opacity = @self_opacity# self.opacity = @character.opacity# self.blend_type = @character.blend_typeself.bush_depth = @character.bush_depth# 显示动画if @character.animation_id != 0# animation = $data_animations[@character.animation_id]# animation(animation, true)# @character.animation_id = 0# endself.angle = @self_angle.to_i - 90endendclass Sprite_Character < RPG::Spritealias sun_initialize initializealias sun_update updatedef initialize(viewport, character = nil)@character = charactersuper(viewport)@sunlist=[]if character.is_a?(Game_Event) and $game_temp.sun_spriteset.sun != []params = XPML.XPML_read("Shadow", @character.id, 2)if params != nilfor i in 0...$game_temp.sun_spriteset.sun.size@sunlist.push(Sprite_Sun.new($viewport5, @character, i))endendendif character.is_a?(Game_Player) and $game_temp.sun_spriteset.sun != []for i in 0...$game_temp.sun_spriteset.sun.size@sunlist.push(Sprite_Sun.new($viewport5, $game_player, i))end#===================================================# ● 与人物跟随功能兼容脚本#===================================================if CATERPILLAR_COMPATIBLE and $game_party.characters != nilfor member in $game_party.charactersfor i in 0...$game_temp.sun_spriteset.sun.size@sunlist.push(Sprite_Sun.new(viewport, member, i))endendendif SQUAD_MOVE_COMPATIBLE and $game_allies.values != nilfor member in $game_allies.valuesfor i in 0...$game_temp.sun_spriteset.sun.size@sunlist.push(Sprite_Sun.new(viewport, member, i))endendendif CCOA_CATER_COMPATIBLE and $game_train.actors != nilfor member in $game_train.actorsfor i in 0...$game_temp.sun_spriteset.sun.size@sunlist.push(Sprite_Sun.new(viewport, member, i))endendendif TRICKSTER_CATER_COMPATIBLE and $game_party.followers != nilfor member in $game_party.followersfor i in 0...$game_temp.sun_spriteset.sun.size@sunlist.push(Sprite_Sun.new(viewport, member, i))endendend#===================================================# ● 兼容脚本结束#=================================================== end# 执行原始函数调用sun_initialize(viewport, @character)enddef updatesun_updateif @sunlist != []for i in [email protected]@sunlist[i].updateendendend endclass Game_Event < Game_Characterattr_accessor :idendclass Spriteset_Mapattr_accessor :sunalias sun_initialize initialize def initialize[url=home.php?mod=space&uid=33565]@sun[/url] = []$game_temp.sun_spriteset = selfwarn = falsefor k in $game_map.events.keys.sortif ($game_map.events[k].list != nil and$game_map.events[k].list[0].code == 108 and($game_map.events[k].list[0].parameters == ["Sun"] or$game_map.events[k].list[0].parameters == ["o"]))warn = trueendparams = XPML.XPML_read("Sun", k, 2)$game_temp.sun_spriteset.sun.push(params) if params != nilendif warn == true and SUN_WARNp "警告:在地图上至少有一个事件使用了过去的方法来添加太阳效果"endsun_initializeend endmodule XPMLmodule_function def XPML_read(markup, event_id, max_param_number = 0)parameter_list = nilevent = $game_map.events[event_id]return if event.list == nilfor i in 0...event.list.sizeif event.list[i].code == 108 andevent.list[i].parameters[0].downcase == "begin " + markup.downcaseparameter_list = [] if parameter_list == nilfor j in i + 1...event.list.sizeif event.list[j].code == 108parts = event.list[j].parameters[0].splitif parts.size != 1 and parts[0].downcase != "begin"if parts[1].to_i != 0 or parts[1] == "0"parameter_list.push(parts[1].to_i)elseparameter_list.push(parts[1])endelsereturn parameter_listendelsereturn parameter_listendif max_param_number != 0 and j == i + max_param_numberreturn parameter_listendendendendreturn parameter_listendend复制代码
复制代码
脚本二:对Spriteset_map的全新定义(实际上是我懒的不想用Alias)
修改部分:新建查看端口4和5,把远景图层移到端口4,倒影显示在端口5
实例:端口4:@viewport4  端口5:$viewport5
  1. #==============================================================================# ■ Spriteset_Map#------------------------------------------------------------------------------#  处理地图画面活动块和元件的类。本类在# Scene_Map 类的内部使用。#==============================================================================class Spriteset_Map#--------------------------------------------------------------------------# ● 初始化对像#--------------------------------------------------------------------------def initialize# 生成显示端口@viewport4 = Viewport.new(0, 0, 640, 480)$viewport5 = Viewport.new(0, 0, 640, 480)@viewport1 = Viewport.new(0, 0, 640, 480)@viewport2 = Viewport.new(0, 0, 640, 480)@viewport3 = Viewport.new(0, 0, 640, 480)@viewport1.z = 100@viewport4.z = 0$viewport5.z = 50@viewport2.z = 200@viewport3.z = 5000# 生成元件地图@tilemap = Tilemap.new(@viewport1)@tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name)for i in 0..6autotile_name = $game_map.autotile_names[i]@tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name)end@tilemap.map_data = $game_map.data@tilemap.priorities = $game_map.priorities# 生成远景平面@panorama = Plane.new(@viewport4)@panorama.z = -1000# 生成雾平面[url=home.php?mod=space&uid=14217]@fog[/url] = Plane.new(@viewport1)@fog.z = 3000# 生成角色活动块@character_sprites = []for i in $game_map.events.keys.sortsprite = Sprite_Character.new(@viewport1, $game_map.events[i])@character_sprites.push(sprite)end@character_sprites.push(Sprite_Character.new(@viewport1, $game_player))# 生成天气@weather = RPG::Weather.new(@viewport1)# 生成图片@picture_sprites = []for i in 1..50@picture_sprites.push(Sprite_Picture.new(@viewport2,$game_screen.pictures[i]))end# 生成计时器块@timer_sprite = Sprite_Timer.new# 刷新画面updateend#--------------------------------------------------------------------------# ● 释放#--------------------------------------------------------------------------def dispose# 释放元件地图@tilemap.tileset.disposefor i in 0..6@tilemap.autotiles[i].disposeend@tilemap.dispose# 释放远景平面@panorama.dispose# 释放雾平面@fog.dispose# 释放角色活动块for sprite in @character_spritessprite.disposeend# 释放天候@weather.dispose# 释放图片for sprite in @picture_spritessprite.disposeend# 释放计时器块@timer_sprite.dispose# 释放显示端口@viewport1.dispose@viewport2.dispose@viewport3.dispose@viewport4.dispose$viewport5.disposeend#--------------------------------------------------------------------------# ● 刷新画面#--------------------------------------------------------------------------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_hueif @panorama.bitmap != nil@panorama.bitmap.dispose@panorama.bitmap = nilendif @panorama_name != ""@panorama.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)endGraphics.frame_resetend# 雾与现在的情况有差异的情况下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_hueif @fog.bitmap != nil@fog.bitmap.dispose@fog.bitmap = nilendif @fog_name != ""@fog.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)endGraphics.frame_resetend# 刷新元件地图@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# 刷新角色活动块for sprite in @character_spritessprite.updateend# 刷新天候图形@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_spritessprite.updateend# 刷新计时器块@timer_sprite.update# 设置画面的色调与震动位置@viewport1.tone = $game_screen.tone@viewport1.ox = $game_screen.shake@viewport4.tone = $game_screen.tone@viewport4.ox = $game_screen.shake$viewport5.tone = $game_screen.tone$viewport5.ox = $game_screen.shake# 设置画面的闪烁色@viewport3.color = $game_screen.flash_color# 刷新显示端口@viewport1.update$viewport5.update@viewport4.update@viewport3.updateendend复制代码
复制代码
3.在有水面的地图上新建事件,事件页的第一项为注释“begin Sun”
在你想在水面上显示阴影的事件的事件页第一页开头注释“begin shadow”
搞定,进游戏就能看见效果了{:2_274:}

范例:

             本帖来自P1论坛作者heiwang1997,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=279628  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
【地图美化】水面上的倒影: d2.jpg

QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

GMT+8, 2024-9-21 19:39 , Processed in 0.037876 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

返回顶部