|
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有账号?注册会员
×
找了2个镜像脚本,但是效果并不是很好
[fold=脚本1][/fold]
[fold=脚本2]- =begin
-
- 墙壁镜面效果,事件中使用注释:
- mirror
-
- 水面倒影效果则是
- water
-
- 以上2个注释必须写在开头
- 注释有 water 的事件,z 坐标会设置为 20
-
-
- 它们都可以附带参数:
-
- x:?? 调整镜面 x 坐标
- y:?? 调整镜面 y 坐标
- w:?? 设置镜面宽度 默认32
- h:?? 设置镜面高度 默认32
- sy:?? 设置镜面与地面距离 默认0,只能设置正数
- op:?? 设置镜子内投影不透明度 默认230
- 不透明度修改得太低的话,如果有重叠的人物会造成透视
-
- r:?? 设置镜面精灵颜色:红 默认0
- g:?? 绿 默认0
- b:?? 蓝 默认0
- a:?? 精灵颜色不透明度 默认0
-
- ts:?? 设置此镜面可能的目标 0 代表玩家
- ts:1 目标为事件1
- ts:0 目标位玩家
- ts:1-6 ts:1~6 目标位1~6号事件
- ts:0,1,3,4,5 目标为玩家以及 1 3 4 5 号事件,必须用半角逗号隔开
-
-
- 例子
- mirror x:-5 y:20 w:50 h:100 sy:25 op:200 r:100 a:100 ts:0
-
-
-
- 所有字母须小写,单个参数内不能有空格。
-
- =end
- # 上下翻转 Bitmap
- # by dant
- # url http://rm.66rpg.com/thread-224341-1-1.html
- class Bitmap
- #--------------------------------------------------------------------------
- # ● 传送到内存的API函数
- #--------------------------------------------------------------------------
- RtlMoveMemory_pi = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
- Memcpy_ii = Win32API.new('kernel32.dll','RtlMoveMemory','iii','v')
- Malloc = Win32API.new('msvcrt.dll','malloc','i','i')
- Free = Win32API.new('msvcrt.dll','free','i','v')
- #--------------------------------------------------------------------------
- # ● Bitmap地址
- #--------------------------------------------------------------------------
- # [[[bitmap.object_id * 2 + 16] + 8] + 16] == 数据的开头
- def address
- buffer, ad = "rgba", object_id * 2 + 16
- RtlMoveMemory_pi.call(buffer, ad, 4)
- ad = buffer.unpack("L")[0] + 8
- RtlMoveMemory_pi.call(buffer, ad, 4)
- ad = buffer.unpack("L")[0] + 16
- RtlMoveMemory_pi.call(buffer, ad, 4)
- return buffer.unpack("L")[0]
- end
- #--------------------------------------------------------------------------
- # ● 上下翻转
- #--------------------------------------------------------------------------
- def reverse!
- len = width * height * 4
- pBuf = Malloc.call(len)
- lenln = width * 4
- src = address + len - lenln
- dst = pBuf
-
- for i in 0...height
- Memcpy_ii.call(dst,src,lenln)
- src-=lenln
- dst+=lenln
- end
- Memcpy_ii.call(address,pBuf,len)
- Free.call(pBuf)
- end
-
- def reverse
- newBmp=self.clone
- newBmp.reverse!
- return newBmp
- end
- end
- #墙体镜面
- class Mirror_Effect
- def initialize(x, y, w, h, sy, op, cl, vp, ts)
- @real_x = x
- @real_y = y - syy(sy) * 4
- @width = w
- @height = h
- @sy = sy
- @opacity = op
- @color = cl
- @viewport = vp
- @mirror = []
- @states = []
- @mirror_size = 0
- @targets = ts
- end
- def syy(sy)
- sy
- end
- def update
- clear
- x = (@real_x - $game_map.display_x + 3) / 4 + 16
- y = (@real_y - $game_map.display_y + 3) / 4 + 32
- @targets.each {|s| update_mirror(x, y, s)}
- @mirror.sort{|a, b| b.z<=>a.z}.each_with_index {|m, i|
- m.x = x
- m.y = y
- m.z = i
- }
- end
- def clear
- @mirror.each_with_index {|m, i|
- if @states[i]
- m.bitmap.clear
- @states[i] = false
- end
- }
- @count = 0
- end
-
- def dispose
- @mirror.each {|m|
- m.bitmap.dispose
- m.dispose
- }
- @mirror.clear
- end
- #
- def setup_mirror_effect
- @states[@count] = true
- @count >= @mirror_size ? create_mirror : @mirror[@count]
- end
- def create_mirror
- @mirror_size += 1
- s = Sprite.new @viewport
- b = Bitmap.new(@width, @height)
- s.bitmap = b
- s.color = @color
- s.opacity = @opacity
- s.oy = @height
- @mirror.push s
- return s
- end
- def update_mirror(mx, my, s)
- x = s.x - s.ox
- y = s.y - 32 #可修改此值调整镜像的 y 偏移,但不能大于32
- sr = s.src_rect
- sh = sr.height
- sw = sr.width
- rx = mx - x
- if rx > 0
- rw = sw - rx
- return if rw <= 0
- bx = 0
- else
- rw = @width + rx
- return if rw <= 0
- bx = -rx
- rx = 0
- end
- ry = my - y + @sy#与镜子的 -距离
- if ry > 0
- return
- else
- rh = @height + ry
- if rh <= -@sy
- return
- elsif rh > sh #足够显示整个
- by = rh - sh
- ry = -@sy
- rh = sh
- else
- by = 0
- ry = sh - rh - @sy
- rh += @sy
- rh = sh if rh > sh
- end
- end
- ry = 0 if ry < 0
- rw = sw if rw > sw
- case sr.y
- when 0; ry += sh * 3
- when sh * 3; ry
- else ry = sr.y + ry
- end
- ms = setup_mirror_effect
- @count += 1
- ms.bitmap.blt( bx, by, s.bitmap, Rect.new(sr.x + rx, ry, rw, rh) )
- ms.z = s.z
- end
- end
- # 水面
- class Watersf_Effect < Mirror_Effect
- def syy(sy)
- -sy
- end
- def update_mirror(mx, my, s)
- x = s.x - s.ox
- y = s.y
- sr = s.src_rect
- sh = sr.height
- sw = sr.width
- rx = mx - x
- if rx > 0
- rw = sw - rx
- return if rw <= 0
- bx = 0
- else
- rw = @width + rx
- return if rw <= 0
- bx = -rx
- rx = 0
- end
- return if my - @sy <= y
- by = y + @sy - my + @height
- if by > -sh
- ry = y - my
- if ry < 0
- return if ry <= -my - sh
- ry = 0
- end
- else
- return
- end
- rw = sw if rw > sw
- case sr.y / sh
- when 0; ry += sh * 3
- when 1; ry += sh * 2
- when 2; ry += sh
- end
- ms = setup_mirror_effect
- @count += 1
- ms.bitmap.blt( bx, by, s.water_bitmap, Rect.new(sr.x + rx, ry, rw, sh) )
- ms.z = -s.z
- end
- end
- class Spriteset_Map
- alias mirror_effect_dispose dispose
- def dispose
- mirror_effect_dispose
- dispose_mirror_effect
- end
- alias mirror_effect_update update
- def update
- mirror_effect_update
- update_mirror_effect
- end
-
- # new methods -
- def setup_mirror_effect
- @mirror_effects = []
- @water_bitmaps = []
- temp_sprites = []
- css = @character_sprites
- $game_map.events.each_value {|e|
- e.list.each {|cmd|
- code = cmd.code
- # 查看注释,判断是否为镜面
- if code == 108 || code == 408
- str = cmd.parameters[0]
- # 可以在此修改注释
- if str =~ /^(m)irror/ || str =~ /^(w)ater/
- water = ($1 == 'w')
- e.water = water
- e.real_x
- x = e.real_x - 64
- x += $1.to_i * 4 if str =~ /x:(-?\d+)/
- y = e.real_y
- y += $1.to_i * 4 if str =~ /[^s]y:(-?\d+)/
- w = str =~ /w:(\d+)/ ? $1.to_i : 32
- h = str =~ /h:(\d+)/ ? $1.to_i : 32
- sy = str =~ /sy:(\d+)/ ? $1.to_i : 0
- op = str =~ /op:(\d+)/ ? $1.to_i : 230 # 默认透明度
- cl = Color.new(0,0,0,0)
- cl.red = $1.to_f if str =~ /r:(\d+)/
- cl.green = $1.to_f if str =~ /g:(\d+)/
- cl.blue = $1.to_f if str =~ /b:(\d+)/
- cl.alpha = $1.to_f if str =~ /a:(\d+)/
- # 设置目标
- ts = []
- if str =~ /ts:([\d\-\~\,]+)/
- if $1.include?('-') || $1.include?('~') &&
- $1 =~ /(\d+)[\-\~](\d+)/
- $1.to_i.upto($2.to_i) {|id|
- css.each {|s|
- if s.character.id == id.to_i
- ts.push s
- s.setup_water_bitmap if water
- break
- end
- }
- }
- else
- $1.scan(/\d+/).each {|id|
- css.each {|s|
- if s.character.id == id.to_i
- ts.push s
- s.setup_water_bitmap if water
- break
- end
- }
- }
- end
- else
- css.each {|s|
- if s.character != e
- ts.push s
- s.setup_water_bitmap if water
- end
- }
- end
- @mirror_effects.push water ?
- Watersf_Effect.new(x,y,w,h,sy, op,cl,@viewport1, ts) :
- Mirror_Effect.new(x,y,w,h,sy, op,cl,@viewport1, ts)
- end
- end
- }
- }
- end
- def dispose_mirror_effect
- @mirror_effects.each {|m| m.dispose}
- @water_bitmaps.each {|b| b.dispose}
- end
- def update_mirror_effect
- @mirror_effects.each {|m| m.update}
- end
- end
- class Sprite_Character
- attr_reader\
- :water_bitmap
- def setup_water_bitmap
- return if @wb_name == @character.character_name
- dispose_water_bitmap
- @water_bitmap = bitmap.reverse if bitmap
- @wb_name = @character.character_name
- end
-
- def dispose_water_bitmap
- @water_bitmap.dispose if @water_bitmap
- end
-
- alias_method :water_effect_dispose, :dispose
- def dispose
- water_effect_dispose
- dispose_water_bitmap
- end
- end
- class Game_Character
- attr_writer\
- :water
- alias mirror_effect_screen_z screen_z
- def screen_z(height = 0)
- # 修改水面事件的 Z 坐标
- @water ? 20 : mirror_effect_screen_z(height)
- end
- end
- #
- class Spriteset_Map
- def initialize
- # 生成显示端口
- @viewport1 = Viewport.new(0, 0, 640, 480)
- @viewport2 = Viewport.new(0, 0, 640, 480)
- @viewport3 = Viewport.new(0, 0, 640, 480)
- @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(@viewport1)
- @panorama.z = -1000
- # 生成雾平面
- @fog = 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
- ############################添加镜面效果
- setup_mirror_effect
- # 刷新画面
- update
- end
- end
复制代码 [/fold] |
|