设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3595|回复: 2
打印 上一主题 下一主题

[原创发布] 表现回忆时的实时场景旋转切换效果

[复制链接]

Lv1.梦旅人

梦石
0
星屑
60
在线时间
66 小时
注册时间
2011-5-25
帖子
73
跳转到指定楼层
1
发表于 2011-8-27 18:10:30 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 shoed 于 2011-8-30 16:33 编辑

这种效果是当你切换场景时以一种旋转的效果进行的,而且是实时的,
可以用来表现旧照片方式的记忆效果,上一帖中的动态模糊也是利用此
脚本写的,玩角可以根据自已的需要修改脚本,做出更炫的效果。

先上图:






脚本:
  1. #--------------------------------------------------------------------------
  2. # ● 场景旋转切换效果
  3. # 制作者  小飞侠_shoed
  4. # 用法:

  5. # 准备渐变
  6. # 开关[旋转切换]=ON
  7. # 场所移动
  8. # 执行渐变

  9. #==============================================================================
  10. # ■ Scene_Map
  11. #==============================================================================
  12. $旋转切换 = 1
  13. class Scene_Map
  14.   #--------------------------------------------------------------------------
  15.   # ● 主处理
  16.   #--------------------------------------------------------------------------
  17.   alias plan_map_window_main main
  18.   def main
  19.     @blur_window = Blur_Effect.new
  20.     plan_map_window_main
  21.     @blur_window.dispose
  22.   end
  23.   #--------------------------------------------------------------------------
  24.   # ● 更新
  25.   #--------------------------------------------------------------------------
  26.   alias plan_map_window_update update
  27.   def update
  28.     # 循环
  29.     loop do
  30.       # 按照地图、实例、主角的顺序刷新
  31.       # (本更新顺序不会在满足事件的执行条件下成为给予角色瞬间移动
  32.       #  的机会的重要因素)
  33.       $game_map.update
  34.       $game_system.map_interpreter.update
  35.       $game_player.update
  36.       # 系统 (计时器)、画面刷新
  37.       $game_system.update
  38.       $game_screen.update
  39.       # 如果主角在场所移动中就中断循环
  40.       unless $game_temp.player_transferring
  41.         break
  42.       end
  43.       
  44.       # 执行场所移动
  45.       transfer_player
  46.       # 处理过渡中的情况下、中断循环
  47.       if $game_temp.transition_processing
  48.         break
  49.       end
  50.     end
  51.     # 刷新活动块
  52.     @spriteset.update
  53.     # 刷新信息窗口
  54.     @message_window.update
  55.     # 游戏结束的情况下
  56.     if $game_temp.gameover
  57.       # 切换的游戏结束画面
  58.       $scene = Scene_Gameover.new
  59.       return
  60.     end
  61.     # 返回标题画面的情况下
  62.     if $game_temp.to_title
  63.       # 切换到标题画面
  64.       $scene = Scene_Title.new
  65.       return
  66.     end
  67.     # 处理过渡中的情况下
  68.     if $game_temp.transition_processing
  69.       # 清除过渡处理中标志
  70.       $game_temp.transition_processing = false
  71.       # 执行过渡
  72.       if $game_switches[$旋转切换]==true
  73.         Graphics.transition(0)
  74.         loop do
  75.           @blur_window.update
  76.           # 刷新游戏画面
  77.           Graphics.update
  78.           if $game_switches[$旋转切换] == false
  79.             break
  80.           end
  81.         end
  82.       elsif $game_temp.transition_name == ""
  83.         Graphics.transition(20)
  84.       else
  85.         Graphics.transition(40, "Graphics/Transitions/" +
  86.           $game_temp.transition_name)
  87.       end
  88.     end
  89.     # 显示信息窗口中的情况下
  90.     if $game_temp.message_window_showing
  91.       return
  92.     end
  93.     # 遇敌计数为 0 且、且遇敌列表不为空的情况下
  94.     if $game_player.encounter_count == 0 and $game_map.encounter_list != []
  95.       # 不是在事件执行中或者禁止遇敌中
  96.       unless $game_system.map_interpreter.running? or
  97.              $game_system.encounter_disabled
  98.         # 确定队伍
  99.         n = rand($game_map.encounter_list.size)
  100.         troop_id = $game_map.encounter_list[n]
  101.         # 队伍有效的话
  102.         if $data_troops[troop_id] != nil
  103.           # 设置调用战斗标志
  104.           $game_temp.battle_calling = true
  105.           $game_temp.battle_troop_id = troop_id
  106.           $game_temp.battle_can_escape = true
  107.           $game_temp.battle_can_lose = false
  108.           $game_temp.battle_proc = nil
  109.         end
  110.       end
  111.     end
  112.     # 按下 B 键的情况下
  113.     if Input.trigger?(Input::B)
  114.       # 不是在事件执行中或菜单禁止中
  115.       unless $game_system.map_interpreter.running? or
  116.              $game_system.menu_disabled
  117.         # 设置菜单调用标志以及 SE 演奏
  118.         $game_temp.menu_calling = true
  119.         $game_temp.menu_beep = true
  120.       end
  121.     end
  122.     # 调试模式为 ON 并且按下 F9 键的情况下
  123.     if $DEBUG and Input.press?(Input::F9)
  124.       # 设置调用调试标志
  125.       $game_temp.debug_calling = true
  126.     end
  127.     # 不在主角移动中的情况下
  128.     unless $game_player.moving?
  129.       # 执行各种画面的调用
  130.       if $game_temp.battle_calling
  131.         call_battle
  132.       elsif $game_temp.shop_calling
  133.         call_shop
  134.       elsif $game_temp.name_calling
  135.         call_name
  136.       elsif $game_temp.menu_calling
  137.         call_menu
  138.       elsif $game_temp.save_calling
  139.         call_save
  140.       elsif $game_temp.debug_calling
  141.         call_debug
  142.       end
  143.     end
  144.   end
  145.   
  146.    #--------------------------------------------------------------------------
  147.   # ● 场所移动的变化
  148.   #--------------------------------------------------------------------------
  149.   alias plan_map_window_transfer_player transfer_player
  150.   def transfer_player
  151.     # 获取移动前的场景
  152.     @blur_window.get_bitmap
  153.     plan_map_window_transfer_player
  154.     @blur_window.refresh_map
  155.   end
  156. end

  157. #==============================================================================
  158. # Blur_Effect
  159. #==============================================================================
  160. class Blur_Effect
  161.   def initialize
  162.     @blur_map=Picture_Map.new
  163.     @map_cw=@blur_map.width
  164.     @map_ch=@blur_map.height
  165.    
  166.     @blurSprite=Sprite.new
  167.     @blurSprite.bitmap=Bitmap.new(@map_cw,@map_ch)
  168.     @blurSprite.z=9999
  169.    
  170.     @blurSprite.ox=320
  171.     @blurSprite.oy=240
  172.     @blurSprite.x=320
  173.     @blurSprite.y=240
  174.   end
  175.   
  176.   def get_bitmap
  177.     @blur_map.update
  178.     @blurSprite.bitmap.blt(0,0,@blur_map,Rect.new(0,0,@map_cw,@map_ch))
  179.   end
  180.   
  181.   def update
  182.    
  183.     if $game_switches[$旋转切换] == true
  184.       
  185.       @blurSprite.visible=true
  186.       @blurSprite.angle+=20
  187.       @blurSprite.zoom_x-=0.02
  188.       @blurSprite.zoom_y-=0.02
  189.       
  190.       if @blurSprite.zoom_y<=0.1
  191.         @blurSprite.angle=0
  192.         @blurSprite.zoom_x=1
  193.         @blurSprite.zoom_y=1
  194.         @blurSprite.visible=false
  195.         $game_switches[$旋转切换] = false
  196.       end
  197.     end
  198.    
  199.   end
  200.   
  201.   def refresh_map
  202.     @blur_map.dispose
  203.     @blur_map=Picture_Map.new
  204.   end
  205.   
  206.   def dispose
  207.     @blur_map.dispose
  208.     @blurSprite.bitmap.dispose
  209.     @blurSprite.dispose
  210.   end
  211.   
  212. end

  213. #==============================================================================
  214. # Picture_Character
  215. #==============================================================================
  216. class Picture_Character < Bitmap
  217.   attr_accessor :character                # 角色
  218.   
  219.   def initialize(character = nil)
  220.     @character = character
  221.    
  222.     @bitmap = RPG::Cache.character(@character.character_name,
  223.       @character.character_hue)
  224.     @cw = @bitmap.width / 4
  225.     @ch = @bitmap.height / 4
  226.   
  227.     super(@cw,@ch)
  228.    
  229.     @stopTitles=[]
  230.     @moveTitles=[]
  231.   end
  232.   
  233.   def update
  234.     self.clear
  235.     # 元件 ID、文件名、色相与现在的情况存在差异的情况下
  236.     if @tile_id != @character.tile_id or
  237.        @character_name != @character.character_name or
  238.        @character_hue != @character.character_hue
  239.       # 记忆元件 ID 与文件名、色相
  240.       @tile_id = @character.tile_id
  241.       @character_name = @character.character_name
  242.       @character_hue = @character.character_hue
  243.       # 元件 ID 为有效值的情况下
  244.       if @tile_id >= 384
  245.         @bitmap = RPG::Cache.tile($game_map.tileset_name,
  246.           @tile_id, @character.character_hue)
  247.         @cw = 32
  248.         @ch = 32
  249.       else
  250.         @bitmap = RPG::Cache.character(@character.character_name,
  251.           @character.character_hue)
  252.       end
  253.     end

  254.     # 图形是角色的情况下
  255.     if @tile_id == 0
  256.       # 设置传送目标的矩形
  257.       sx = @character.pattern * @cw
  258.       sy = (@character.direction - 2) / 2 * @ch
  259.       self.blt(0,0,@bitmap,Rect.new(sx,sy,@cw,@ch))
  260.     end
  261.    
  262.     #计算title
  263.     if self.visible
  264.       if @x != self.x or @y != self.y
  265.         @x=self.x
  266.         @y=self.y
  267.         
  268.         @stopTitles.clear
  269.         #@moveTitles.clear
  270.         
  271.         tile_x=self.real_width/32
  272.         if tile_x%2==0
  273.           tile_x+=1
  274.         end
  275.         tile_y=(self.real_height/32.0).ceil
  276.         for j in 0...tile_y
  277.           maskId=[self.x,self.y-j,j]
  278.           @stopTitles.push(maskId)
  279.           for i in 1..(tile_x-1)/2
  280.             maskId=[self.x-i,self.y-j,j]
  281.             @stopTitles.push(maskId)
  282.             maskId=[self.x+i,self.y-j,j]
  283.             @stopTitles.push(maskId)
  284.           end
  285.         end
  286.         
  287.         @[email protected]
  288.         
  289.         case @character.direction
  290.           when 2 #向下
  291.             maskId=[self.x,self.y-tile_y,tile_y]
  292.             @moveTitles.push(maskId)
  293.             for i in 1..(tile_x-1)/2
  294.               maskId=[self.x-i,self.y-tile_y,tile_y]
  295.               @moveTitles.push(maskId)
  296.               maskId=[self.x+i,self.y-tile_y,tile_y]
  297.               @moveTitles.push(maskId)
  298.             end
  299.           when 4 #向左
  300.             for j in 0...tile_y
  301.               maskId=[self.x+(tile_x-1)/2+1,self.y-j,j]
  302.               @moveTitles.push(maskId)
  303.             end
  304.           when 6 #向右
  305.             for j in 0...tile_y
  306.               maskId=[self.x-(tile_x-1)/2-1,self.y-j,j]
  307.               @moveTitles.push(maskId)
  308.             end
  309.           when 8 #向上
  310.             for k in @moveTitles
  311.               k[2]+=1
  312.             end
  313.             maskId=[self.x,self.y+1,0]
  314.             @moveTitles.push(maskId)
  315.             for i in 1..(tile_x-1)/2
  316.               maskId=[self.x-i,self.y+1,0]
  317.               @moveTitles.push(maskId)
  318.               maskId=[self.x+i,self.y+1,0]
  319.               @moveTitles.push(maskId)
  320.             end
  321.           end
  322.       end
  323.     end
  324.   end
  325.   
  326.   def x
  327.     return @character.x
  328.   end
  329.   
  330.   def y
  331.     return @character.y
  332.   end
  333.    
  334.   def screen_x
  335.     return @character.screen_x
  336.   end
  337.   
  338.   def screen_y
  339.     return @character.screen_y
  340.   end
  341.   
  342.   def screen_z
  343.     return @character.screen_z(@ch)
  344.   end
  345.   
  346.   def real_width
  347.     return @cw
  348.   end
  349.   
  350.   def real_height
  351.     return @ch
  352.   end
  353.   
  354.   def visible
  355.     return [email protected]
  356.   end
  357.   
  358.   def opacity
  359.     return @character.opacity
  360.   end
  361.   
  362.   def maskTitles
  363.     if @character.moving?
  364.       return @moveTitles
  365.     else
  366.       return @stopTitles
  367.     end
  368.   end
  369. end


  370. #==============================================================================
  371. # Picture_Map
  372. #==============================================================================
  373. class Picture_Map < Bitmap
  374.   def initialize
  375.     super(640,480)
  376.    
  377.     @map_cw = $game_map.width * 32
  378.     @map_ch = $game_map.height * 32
  379.    
  380.     @tileset = RPG::Cache.tileset($game_map.tileset_name)
  381.     @autotiles = []
  382.     for i in 0..6
  383.       autotile_name = $game_map.autotile_names[i]
  384.       @autotiles[i] = RPG::Cache.autotile(autotile_name)
  385.     end
  386.     @map_data = $game_map.data
  387.     @priorities = $game_map.priorities
  388.     @character_sprites = []
  389.     for i in $game_map.events.keys.sort
  390.       sprite = Picture_Character.new($game_map.events[i])
  391.       @character_sprites.push(sprite)
  392.     end
  393.     @character_sprites.push(Picture_Character.new($game_player))
  394.     @all_map = Bitmap.new (@map_cw,@map_ch)
  395.     make_map
  396.   end
  397.   
  398.   def update
  399.     self.clear

  400.     self.blt(0,0,@all_map,Rect.new(map_x,map_y,width,height))
  401.    
  402.     # 刷新角色活动块
  403.     @character_sprites.sort!{|a,b|a.screen_z<=>b.screen_z}
  404.     for sprite in @character_sprites
  405.       if sprite.visible
  406.         sprite.update
  407.         
  408.         px=sprite.screen_x-sprite.real_width/2
  409.         py=sprite.screen_y-sprite.real_height
  410.         self.blt(px,py,sprite,Rect.new(0,0,sprite.real_width,sprite.real_height),sprite.opacity)
  411.         
  412.         for mask_id in sprite.maskTitles
  413.           next unless $game_map.valid?(mask_id[0], mask_id[1])
  414.           for i in [2, 1, 0]
  415.             tile = @map_data[mask_id[0], mask_id[1], i]
  416.             next if tile == 0 #透明的
  417.             if $game_map.priorities[tile] > mask_id[2]
  418.               if tile < 384
  419.                 if tile >= 48
  420.                   tile -= 48
  421.                   src_rect = Rect.new(32, 2 * 32, 32, 32)
  422.                   self.blt(mask_id[0] * 32 - map_x, mask_id[1] * 32 - map_y, @autotiles[tile / 48], src_rect)
  423.                 end
  424.               else
  425.                 tile -= 384
  426.                 src_rect = Rect.new(tile % 8 * 32, tile / 8 * 32, 32, 32)
  427.                 self.blt(mask_id[0] * 32 - map_x, mask_id[1] * 32 -  map_y, @tileset, src_rect)
  428.               end
  429.               
  430.               break
  431.             end
  432.           end
  433.         end
  434.       end
  435.     end
  436.   end
  437.   
  438.   def dispose
  439.     super
  440.     # 释放元件地图
  441.     @tileset.dispose
  442.     for i in 0..6
  443.       @autotiles[i].dispose
  444.     end
  445.     # 释放角色活动块
  446.     for sprite in @character_sprites
  447.       sprite.dispose
  448.     end
  449.     @all_map.dispose
  450.    
  451.   end
  452.   
  453.   def make_map
  454.     for y in 0...$game_map.height
  455.       for x in 0...$game_map.width
  456.         for z in 0...3
  457.           tile = @map_data[x, y, z]
  458.           next if tile == nil
  459.           if tile < 384
  460.             if tile >= 48
  461.               tile -= 48
  462.               src_rect = Rect.new(32, 2 * 32, 32, 32)
  463.               @all_map.blt(x * 32, y * 32, @autotiles[tile / 48], src_rect)
  464.             end
  465.           else
  466.             tile -= 384
  467.             src_rect = Rect.new(tile % 8 * 32, tile / 8 * 32, 32, 32)
  468.             @all_map.blt(x * 32, y * 32, @tileset, src_rect)
  469.           end
  470.         end
  471.       end
  472.     end
  473.   end
  474.   
  475.   def map_width
  476.     return @map_cw
  477.   end
  478.   
  479.   def map_height
  480.     return @map_ch
  481.   end

  482.   def map_x
  483.     return $game_map.display_x / 4
  484.   end
  485.   
  486.   def map_y
  487.     return $game_map.display_y / 4
  488.   end
  489. end
复制代码
附件:

旋转场景.rar (231.6 KB, 下载次数: 255)

用法:
# 准备渐变
# 开关[旋转切换]=ON
# 场所移动
# 执行渐变

Lv3.寻梦者 (暗夜天使)

精灵族の天使

梦石
0
星屑
1697
在线时间
3038 小时
注册时间
2007-3-16
帖子
33731

开拓者贵宾

2
发表于 2011-8-28 00:02:41 | 只看该作者
旋转的效果这个如果有渐变图形的话那么会很容易做(准备渐变——场所转移——执行渐变)

点评

http://bbs.66rpg.com/article-60559.html这里有不少渐变图  发表于 2011-8-28 00:20
执行渐变的时候可以选择渐变的图形(也就是说,可以自己做渐变图(参考素材规则——渐变图)),不过仅在RMXP里有效  发表于 2011-8-28 00:14
在执行渐变有可以旋转的效果吗,能说具体点吗  发表于 2011-8-28 00:09
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

名侦探小柯

梦石
0
星屑
3299
在线时间
3619 小时
注册时间
2006-9-6
帖子
37400

开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

3
发表于 2011-8-30 12:33:19 | 只看该作者
就是把当前画面做成一张图片,然后中心点旋转并且一边缩小么,感觉事件也可以 =3=

点评

的确是,做成图片,我这种做法就是不用提前做图片  发表于 2011-8-30 14:39
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-26 12:39

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表