赞 | 1 |
VIP | 1 |
好人卡 | 2 |
积分 | 1 |
经验 | 36245 |
最后登录 | 2020-7-2 |
在线时间 | 465 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 55
- 在线时间
- 465 小时
- 注册时间
- 2011-4-13
- 帖子
- 174
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 heiwang1997 于 2013-1-25 09:37 编辑
我知道这个范例国外有人做了,但是下载不能……{:2_270:}
下面给大家谈谈我自己做倒影的思路(虽然效果不是很好),个人觉得这样做比较简便
高手可以根据这个思路自己做倒影,注意一下范例和脚本冲突可能性比较大,只适合新手使用
最终效果:
主要思路:
1.使用太阳精灵脚本把影子由黑色改为正常颜色
2.把影子层夹在远景层和地图层中间
3.远景层用水面
范例制作过程(仅供参考):
1. 打开数据库,更改你所用地图的“水”的自动原件为图示自动原件
即为
远景图改为下面两幅图片(任选其一)
这个时候可以进游戏看下效果,应该跟以前没什么差别
2.使用脚本(来自太阳精灵)
脚本一:修改版的太阳精灵
❤修改部分:
A 影子颜色(改为正常颜色)
B 影子的可视端
C 影子位置的微调- #==================================================================================
- # ■ 太阳精灵(活动块修改版) 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_Temp
- attr_accessor :sun_spriteset
- end
- class Game_Party
- attr_reader :characters
- end
- class Sprite_Sun < RPG::Sprite
- attr_accessor :character
- def initialize(viewport, character = nil, id=0)
- super(viewport)
- @character = character
- params=$game_temp.sun_spriteset.sun[id]
- # 默认设置
- self_angle = SUN_ANGLE
- self_opacity = SUN_OPACITY
- # 根据参数的设置
- self_angle = params[0] if params.size > 0
- self_opacity = params[1] if params.size > 1
- @self_angle = self_angle
- @self_opacity = self_opacity
- update
- end
- def update
- super
- if @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_hue
- if @tile_id > 0
- sx = (@tile_id / 128 % 2 * 8 + @tile_id % 8) * 32;
- sy = @tile_id % 256 / 8 % 16 * 32;
- set_number = @tile_id / 256
- self.bitmap = RPG::Cache.system("TileB") if set_number == 0
- self.bitmap = RPG::Cache.system("TileC") if set_number == 1
- self.bitmap = RPG::Cache.system("TileD") if set_number == 2
- self.bitmap = RPG::Cache.system("TileE") if set_number == 3
- self.src_rect.set(0, 0, 32, 32)
- self.ox = 16
- self.oy = 32
- else
- #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#影子的完整度设定
- end
- self.ox = @cw / 2
- self.oy = @ch
- end
- end
- # 设置可见状况
- self.visible = (not @character.transparent)
- # 如果画面是角色的情况下
- if @tile_id == 0
- hue = @character.character_hue
- pattern = @character.pattern < 3 ? @character.pattern : 1
- # 矩形本体设定
- sx = (hue % 4 * 3 + pattern) * @cw
- @direct = @character.direction
- if self.angle > 90 or angle < -90
- sy = ( 4 - 2) / 2 * @ch if @direct == 6
- sy = ( 6 - 2) / 2 * @ch if @direct == 4
- sy = (@character.direction - 2) / 2 * @ch if @direct != 4 and @direct != 6
- else
- sy = (hue / 4 * 4 + (@character.direction - 2) / 2) * @ch
- #sy = @character.direction
- end
- self.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-1
- self.z = @character.screen_z(@ch)-1#
- # 设置不透明度,合成方式和草木深度
- self.opacity = @self_opacity
- # self.opacity = @character.opacity#
- self.blend_type = @character.blend_type
- self.bush_depth = @character.bush_depth
- # 显示动画
- if @character.animation_id != 0#
- animation = $data_animations[@character.animation_id]#
- animation(animation, true)#
- @character.animation_id = 0#
- end
- self.angle = @self_angle.to_i - 90
- end
- end
- class Sprite_Character < RPG::Sprite
- alias sun_initialize initialize
- alias sun_update update
- def initialize(viewport, character = nil)
- @character = character
- super(viewport)
- @sunlist=[]
- if character.is_a?(Game_Event) and $game_temp.sun_spriteset.sun != []
- params = XPML.XPML_read("Shadow", @character.id, 2)
- if params != nil
- for i in 0...$game_temp.sun_spriteset.sun.size
- @sunlist.push(Sprite_Sun.new($viewport5, @character, i))
- end
- end
- end
- if 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 != nil
- for member in $game_party.characters
- for i in 0...$game_temp.sun_spriteset.sun.size
- @sunlist.push(Sprite_Sun.new(viewport, member, i))
- end
- end
- end
- if SQUAD_MOVE_COMPATIBLE and $game_allies.values != nil
- for member in $game_allies.values
- for i in 0...$game_temp.sun_spriteset.sun.size
- @sunlist.push(Sprite_Sun.new(viewport, member, i))
- end
- end
- end
- if CCOA_CATER_COMPATIBLE and $game_train.actors != nil
- for member in $game_train.actors
- for i in 0...$game_temp.sun_spriteset.sun.size
- @sunlist.push(Sprite_Sun.new(viewport, member, i))
- end
- end
- end
- if TRICKSTER_CATER_COMPATIBLE and $game_party.followers != nil
- for member in $game_party.followers
- for i in 0...$game_temp.sun_spriteset.sun.size
- @sunlist.push(Sprite_Sun.new(viewport, member, i))
- end
- end
- end
- #===================================================
- # ● 兼容脚本结束
- #===================================================
- end
- # 执行原始函数调用
- sun_initialize(viewport, @character)
- end
- def update
- sun_update
- if @sunlist != []
- for i in [email protected]
- @sunlist[i].update
- end
- end
- end
- end
- class Game_Event < Game_Character
- attr_accessor :id
- end
- class Spriteset_Map
- attr_accessor :sun
- alias sun_initialize initialize
- def initialize
- [url=home.php?mod=space&uid=33565]@sun[/url] = []
- $game_temp.sun_spriteset = self
- warn = false
- for k in $game_map.events.keys.sort
- if ($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 = true
- end
- params = XPML.XPML_read("Sun", k, 2)
- $game_temp.sun_spriteset.sun.push(params) if params != nil
- end
- if warn == true and SUN_WARN
- p "警告:在地图上至少有一个事件使用了过去的方法来添加太阳效果"
- end
- sun_initialize
- end
- end
- module XPML
- module_function
- def XPML_read(markup, event_id, max_param_number = 0)
- parameter_list = nil
- event = $game_map.events[event_id]
- return if event.list == nil
- for i in 0...event.list.size
- if event.list[i].code == 108 and
- event.list[i].parameters[0].downcase == "begin " + markup.downcase
- parameter_list = [] if parameter_list == nil
- for j in i + 1...event.list.size
- if event.list[j].code == 108
- parts = event.list[j].parameters[0].split
- if 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)
- else
- parameter_list.push(parts[1])
- end
- else
- return parameter_list
- end
- else
- return parameter_list
- end
- if max_param_number != 0 and j == i + max_param_number
- return parameter_list
- end
- end
- end
- end
- return parameter_list
- end
- end
复制代码 脚本二:对Spriteset_map的全新定义(实际上是我懒的不想用Alias)
修改部分:新建查看端口4和5,把远景图层移到端口4,倒影显示在端口5
实例:端口4:@viewport4 端口5:$viewport5- #==============================================================================
- # ■ 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..6
- autotile_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.sort
- sprite = 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
- # 刷新画面
- update
- end
- #--------------------------------------------------------------------------
- # ● 释放
- #--------------------------------------------------------------------------
- def dispose
- # 释放元件地图
- @tilemap.tileset.dispose
- for i in 0..6
- @tilemap.autotiles[i].dispose
- end
- @tilemap.dispose
- # 释放远景平面
- @panorama.dispose
- # 释放雾平面
- @fog.dispose
- # 释放角色活动块
- for sprite in @character_sprites
- sprite.dispose
- end
- # 释放天候
- @weather.dispose
- # 释放图片
- for sprite in @picture_sprites
- sprite.dispose
- end
- # 释放计时器块
- @timer_sprite.dispose
- # 释放显示端口
- @viewport1.dispose
- @viewport2.dispose
- @viewport3.dispose
- @viewport4.dispose
- $viewport5.dispose
- end
- #--------------------------------------------------------------------------
- # ● 刷新画面
- #--------------------------------------------------------------------------
- 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_hue
- if @panorama.bitmap != nil
- @panorama.bitmap.dispose
- @panorama.bitmap = nil
- end
- if @panorama_name != ""
- @panorama.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
- end
- Graphics.frame_reset
- end
- # 雾与现在的情况有差异的情况下
- 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_hue
- if @fog.bitmap != nil
- @fog.bitmap.dispose
- @fog.bitmap = nil
- end
- if @fog_name != ""
- @fog.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
- end
- Graphics.frame_reset
- end
- # 刷新元件地图
- @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_sprites
- sprite.update
- end
- # 刷新天候图形
- @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_sprites
- sprite.update
- end
- # 刷新计时器块
- @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.update
- end
- end
复制代码 3.在有水面的地图上新建事件,事件页的第一项为注释“begin Sun”
在你想在水面上显示阴影的事件的事件页第一页开头注释“begin shadow”
搞定,进游戏就能看见效果了{:2_274:}
范例:
水面·倒影.zip
(226.72 KB, 下载次数: 231)
|
|