游戏的动态模糊效果
动态模糊效果,我想大家应该都见识过,比如极品飞车游戏中常常会看到这种效果这么好的效果我们不能用不是太可惜了,经过几天的努力,终于做出了这个效果,我现
在将脚本和工程都发上来,以供参考
先上图:
脚本:#--------------------------------------------------------------------------# ● 动态糊模效果# 制作者小飞侠_shoed# 用法:# 打开# 开关[模糊效果]=ON# 开关[模糊效果]=OFF$模糊效果 = 1#==============================================================================# ■ Scene_Map#==============================================================================class Scene_Map#--------------------------------------------------------------------------# ● 主处理#--------------------------------------------------------------------------alias plan_map_window_main maindef main @blur_window = Blur_Effect.new @blur_window.visible=$game_switches[$模糊效果] plan_map_window_main @blur_window.disposeend#--------------------------------------------------------------------------# ● 更新#--------------------------------------------------------------------------alias plan_map_window_update updatedef update plan_map_window_update @blur_window.visible=$game_switches[$模糊效果] @blur_window.updateend#--------------------------------------------------------------------------# ● 场所移动的变化#--------------------------------------------------------------------------alias plan_map_window_transfer_player transfer_playerdef transfer_player visible = $game_switches[$模糊效果] $game_switches[$模糊效果] = false @blur_window.visible=$game_switches[$模糊效果] plan_map_window_transfer_player @blur_window.dispose @blur_window = Blur_Effect.new $game_switches[$模糊效果] = visible @blur_window.visible=$game_switches[$模糊效果]endend#==============================================================================# Blur_Effect#==============================================================================class Blur_Effectdef initialize @blurSprite=Sprite.new @sum=Bitmap.new(640,480) @RT=Picture_Map.new @blurSprite.bitmap=@sum @blurSprite.z=9999end def update if $game_switches[$模糊效果] == true @RT.update @sum.blt(0,0,@RT,Rect.new(0,0,@RT.width,@RT.height),60) endend def dispose @sum.dispose @RT.dispose @blurSprite.disposeend def visible=(flag) @blurSprite.visible=flagendend#==============================================================================# Picture_Character#==============================================================================class Picture_Character < Bitmapattr_accessor :character # 角色 def initialize(character = nil) @character = character @bitmap = RPG::Cache.character(@character.character_name, @character.character_hue) @cw = @bitmap.width / 4 @ch = @bitmap.height / 4 super(@cw,@ch) @stopTitles=[] @moveTitles=[]end def update self.clear # 元件 ID、文件名、色相与现在的情况存在差异的情况下 if @tile_id != @character.tile_id or @character_name != @character.character_name or @character_hue != @character.character_hue # 记忆元件 ID 与文件名、色相 @tile_id = @character.tile_id @character_name = @character.character_name @character_hue = @character.character_hue # 元件 ID 为有效值的情况下 if @tile_id >= 384 @bitmap = RPG::Cache.tile($game_map.tileset_name, @tile_id, @character.character_hue) @cw = 32 @ch = 32 else @bitmap = RPG::Cache.character(@character.character_name, @character.character_hue) end end # 图形是角色的情况下 if @tile_id == 0 # 设置传送目标的矩形 sx = @character.pattern * @cw sy = (@character.direction - 2) / 2 * @ch self.blt(0,0,@bitmap,Rect.new(sx,sy,@cw,@ch)) end #计算title if self.visible if @x != self.x or @y != self.y @x=self.x @y=self.y @stopTitles.clear #@moveTitles.clear tile_x=self.real_width/32 if tile_x%2==0 tile_x+=1 end tile_y=(self.real_height/32.0).ceil for j in 0...tile_y maskId= @stopTitles.push(maskId) for i in 1..(tile_x-1)/2 maskId= @stopTitles.push(maskId) maskId= @stopTitles.push(maskId) end end @ case @character.direction when 2 #向下 maskId= @moveTitles.push(maskId) for i in 1..(tile_x-1)/2 maskId= @moveTitles.push(maskId) maskId= @moveTitles.push(maskId) end when 4 #向左 for j in 0...tile_y maskId= @moveTitles.push(maskId) end when 6 #向右 for j in 0...tile_y maskId= @moveTitles.push(maskId) end when 8 #向上 for k in @moveTitles k+=1 end maskId= @moveTitles.push(maskId) for i in 1..(tile_x-1)/2 maskId= @moveTitles.push(maskId) maskId= @moveTitles.push(maskId) end end end endend def x return @character.xend def y return @character.yend def screen_x return @character.screen_xend def screen_y return @character.screen_yend def screen_z return @character.screen_z(@ch)end def real_width return @cwend def real_height return @chend def visible return end def opacity return @character.opacityend def maskTitles if @character.moving? return @moveTitles else return @stopTitles endendend#==============================================================================# Picture_Map#==============================================================================class Picture_Map < Bitmapdef initialize super(640,480) @map_cw = $game_map.width * 32 @map_ch = $game_map.height * 32 @tileset = RPG::Cache.tileset($game_map.tileset_name) @autotiles = [] for i in 0..6 autotile_name = $game_map.autotile_names @autotiles = RPG::Cache.autotile(autotile_name) end @map_data = $game_map.data @priorities = $game_map.priorities @character_sprites = [] for i in $game_map.events.keys.sort sprite = Picture_Character.new($game_map.events) @character_sprites.push(sprite) end @character_sprites.push(Picture_Character.new($game_player)) @all_map = Bitmap.new (@map_cw,@map_ch) make_mapend def update self.clear self.blt(0,0,@all_map,Rect.new(map_x,map_y,width,height)) # 刷新角色活动块 @character_sprites.sort!{|a,b|a.screen_zb.screen_z} for sprite in @character_sprites if sprite.visible sprite.update px=sprite.screen_x-sprite.real_width/2 py=sprite.screen_y-sprite.real_height self.blt(px,py,sprite,Rect.new(0,0,sprite.real_width,sprite.real_height),sprite.opacity) for mask_id in sprite.maskTitles next unless $game_map.valid?(mask_id, mask_id) for i in tile = @map_data, mask_id, i] next if tile == 0 #透明的 if $game_map.priorities > mask_id if tile < 384 if tile >= 48 tile -= 48 src_rect = Rect.new(32, 2 * 32, 32, 32) self.blt(mask_id * 32 - map_x, mask_id * 32 - map_y, @autotiles, src_rect) end else tile -= 384 src_rect = Rect.new(tile % 8 * 32, tile / 8 * 32, 32, 32) self.blt(mask_id * 32 - map_x, mask_id * 32 -map_y, @tileset, src_rect) end break end end end end endend def dispose super # 释放元件地图 @tileset.dispose for i in 0..6 @autotiles.dispose end # 释放角色活动块 for sprite in @character_sprites sprite.dispose end @all_map.dispose end def make_map for y in 0...$game_map.height for x in 0...$game_map.width for z in 0...3 tile = @map_data next if tile == nil if tile < 384 if tile >= 48 tile -= 48 src_rect = Rect.new(32, 2 * 32, 32, 32) @all_map.blt(x * 32, y * 32, @autotiles, src_rect) end else tile -= 384 src_rect = Rect.new(tile % 8 * 32, tile / 8 * 32, 32, 32) @all_map.blt(x * 32, y * 32, @tileset, src_rect) end end end endend def map_width return @map_cwend def map_height return @map_chenddef map_x return $game_map.display_x / 4end def map_y return $game_map.display_y / 4endend复制代码附件:
用法:
开关[模糊效果]=ON
开关[模糊效果]=OFF
本帖来自P1论坛作者shoed,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=207413若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页:
[1]