我本来是不需要参数传递和按ESC弹出菜单的,但是为了方便朋友们,干脆一起写出来了。这个完全就是事件的脚本化,我怕事件写多了,写得乱七八糟,不好修改,干脆写成脚本了。我的水平也就这样了,这东西完全是事件的思维,不断的if,case,when,高手轻怕。我也知道,这玩意写得很繁琐,我也有好的想法写简单,但是水平有限,会出现自己都莫名其妙的问题,干脆就写成这样了。 
版本1.01 
1.修正了图片显示错误的问题,写糊涂了。 
2.修正了返回地图时地图没有刷新的问题。 
3.优化了结束拼图消失的问题。 
另:我的设定是,第一盘赢后打开开关,但只要再进一次拼图开关就变关闭了,只要是不是 
再胜利开关就是关闭状态,就是中途退出,开关就是关闭。不想要这设定的,删除166行的 
$game_switches[$Pt_Victory] = false。
呃,还有一个问题,是我疏忽了,我这种播放SE\ME的方法不好,要是碰到一些音量控制脚本是无效的。所以,大家可以改一下,我说说就行了,不在脚本里改了。把177~193行的两个Audio.se_play("Audio/SE/002-System02", 100, 100)都改成$game_system.se_play($data_system.decision_se)。把194行左右的case @num里的所有播放音效改成$game_system.se_play($data_system.cursor_se) 
接着,把329行左右的Audio.me_play("Audio/ME/001-Victory01", 100, 100),改成$game_system.me_play($game_system.battle_end_me)
--------------------------------------------------------------------华丽的分割线----------------------------------------------------------- 
RUBY 代码 - #==============================================================================
 - # ■ Scene_ZPT
 - #------------------------------------------------------------------------------
 - #  旋转拼图  1.01                     ——海的那边
 - #==============================================================================
 - $Pt_Victory = 5       #完成打开开关
 - $OPA_N = 120         #未选择中的透明度
 - $OPA_Y = 255         #选择中的透明度
 - $SITE_X = 255        #图片的X坐标
 - $SITE_Y = 255        #图片的Y坐标
 - =begin
 - 版本1.01
 - 1.修正了图片显示错误的问题,写糊涂了。
 - 2.修正了返回地图时地图没有刷新的问题。
 - 3.优化了结束拼图消失的问题。
 - 另:我的设定是,第一盘赢后打开开关,但只要再进一次拼图开关就变关闭了,只要是不是
 - 再胜利开关就是关闭状态,就是中途退出,开关就是关闭。不想要这设定的,删除166行的
 - $game_switches[$Pt_Victory] = false。
 - 呃,这个就是模仿刺客信条2的真相解密里的那个旋转拼图,这玩意是我用在我的游戏
 - 里的,我需要的功能都有,所以大概就这个样子,或许写得不是很人性化。
 - 这玩意的使用方法:方向键左右选择高亮的光标;上下是逆顺时针选择。
 - 事件里写$scene = Scene_ZPT.new("pt") ,"pt"是一个参数,
 - 就是游戏Graphics/Pictures/目录里的拼图图片,图片写成 pt_01、pt_02到pt_05五张。
 - 目录里还有一张pt_00,那张是完整是图片,是最后拼完后显示的。黑色的那个back的背后
 - 的挡板,如果有朋友换背景图片,这个高亮选中的方法不至于出现奇葩的现象。
 - 哦,还有一个,就是刺客信条2里的这个拼图可没有这么简单,它旋转一个是时候,别的
 - 也会跟着一起动,这个嘛,大家有需要的自己制作了,很容易旋转的when那里,别的跟着
 - 旋转就行。
 - BUG嘛,五个随机数,有可能出现一进游戏就胜利的情况,虽然微乎其微,但是理论上是可能滴。
 - 我暂时没有发现。有发现的朋友说一声,能不能修复我不知道。 - -b
 - 冲突,我想不太可能。
 - 大家放进游戏的时候,自己添加背景图片吧,加个Sprite,再释放就行。
 - 对了,求助一下大神,为什么旋转的时候会出现图片衔接出现有一点缝隙的?旋转到这角度
 - 有,另一个角度就没了,不知道是不是我们PS制作得不严谨?
 - =end
 - class Scene_ZPT
 -   def initialize(pic)
 -     @pt_pic = pic
 -   end
 -   #--------------------------------------------------------------------------
 -   # ● 主处理
 -   #--------------------------------------------------------------------------
 -   def main
 -     #生成圆形背景图片
 -     @ptb = Sprite.new
 -     @ptb.bitmap = Bitmap.new("Graphics/Pictures/" + @pt_pic + "_back.png")
 -     @ptb.x = $SITE_X
 -     @ptb.y = $SITE_Y
 -     @ptb.ox = @ptb.bitmap.width / 2
 -     @ptb.oy = @ptb.bitmap.height / 2
 -     #生成轴图片
 -     @pt1 = Sprite.new
 -     @pt1.bitmap = Bitmap.new("Graphics/Pictures/" + @pt_pic + "_1.png")
 -     @pt1.x = $SITE_X
 -     @pt1.y = $SITE_Y
 -     @pt1.ox = @pt1.bitmap.width / 2
 -     @pt1.oy = @pt1.bitmap.height / 2
 -     @pt1.opacity = $OPA_N
 -     #生成拼图 2
 -     @pt2 = Sprite.new
 -     @pt2.bitmap = Bitmap.new("Graphics/Pictures/" + @pt_pic + "_2.png")   
 -     @pt2.x = @pt1.x
 -     @pt2.y = @pt1.y
 -     @pt2.ox = @pt2.bitmap.width / 2
 -     @pt2.oy = @pt2.bitmap.height / 2
 -     @pt2.opacity = $OPA_N
 -     #生成拼图 3
 -     @pt3 = Sprite.new
 -     @pt3.bitmap = Bitmap.new("Graphics/Pictures/" + @pt_pic + "_3.png")  
 -     @pt3.x = @pt1.x
 -     @pt3.y = @pt1.y
 -     @pt3.ox = @pt3.bitmap.width / 2
 -     @pt3.oy = @pt3.bitmap.height / 2
 -     @pt3.opacity = $OPA_N
 -     #生成拼图 4
 -     @pt4 = Sprite.new
 -     @pt4.bitmap = Bitmap.new("Graphics/Pictures/" + @pt_pic + "_4.png")
 -     @pt4.x = @pt1.x
 -     @pt4.y = @pt1.y
 -     @pt4.ox = @pt4.bitmap.width / 2
 -     @pt4.oy = @pt4.bitmap.height / 2
 -     @pt4.opacity = $OPA_N
 -     #生成拼图 5
 -     @pt5 = Sprite.new
 -     @pt5.bitmap = Bitmap.new("Graphics/Pictures/" + @pt_pic + "_5.png")
 -     @pt5.x = @pt1.x
 -     @pt5.y = @pt1.y
 -     @pt5.ox = @pt5.bitmap.width / 2
 -     @pt5.oy = @pt5.bitmap.height / 2
 -     @pt5.opacity = $OPA_N
 -     #生成完整图
 -     @pt0 = Sprite.new
 -     @pt0.bitmap = Bitmap.new("Graphics/Pictures/" + @pt_pic + "_0.png")
 -     @pt0.x = $SITE_X
 -     @pt0.y = $SITE_Y
 -     @pt0.opacity = 0
 -     @pt0.ox = @pt1.bitmap.width / 2
 -     @pt0.oy = @pt1.bitmap.height / 2
 -     @update_begin = 1
 -     @num = 1        #开始的光标亮在哪里
 -     game_begin
 - #--------------菜单--------------
 -     # 生成命令窗口
 -     s1 = "重新开始"
 -     s2 = "退出"
 -     @command_window = Window_Command.new(180,[s1,s2])
 -     @command_window.x = 240
 -     @command_window.y = 160
 -     @command_window.z = 1000
 -     @command_window.back_opacity = 180
 -     @command_window.visible = false
 -     @command_window.active = false
 -     @command_window.index = 0
 - #-------------------------------  
 -     # 执行过渡
 -     Graphics.transition(40)
 -     # 主循环
 -     loopdo
 -       # 刷新游戏画面
 -       Graphics.update
 -       # 刷新输入信息
 -       Input.update
 -       # 刷新画面情报
 -       update
 -       # 如果画面被切换的话就中断循环
 -       if$scene != self
 -         break
 -       end
 -     end
 -     # 准备过渡
 -     Graphics.freeze
 -     #释放窗口
 -     @command_window.dispose
 -     # 释放拼图图形
 -     @ptb.bitmap.dispose
 -     @ptb.dispose
 -     @pt1.bitmap.dispose
 -     @pt1.dispose
 -     @pt2.bitmap.dispose
 -     @pt2.dispose
 -     @pt3.bitmap.dispose
 -     @pt3.dispose
 -     @pt4.bitmap.dispose
 -     @pt4.dispose
 -     @pt5.bitmap.dispose
 -     @pt5.dispose
 -     @pt0.bitmap.dispose
 -     @pt0.dispose
 -     # 执行过度
 -     Graphics.transition(20)
 -     # 准备过渡
 -     Graphics.freeze
 -   end
 -   #--------------------------------------------------------------------------
 -   # ● 刷新画面
 -   #--------------------------------------------------------------------------
 -   def update
 -   $game_switches[$Pt_Victory] = false
 -   case@update_begin
 -   when1
 -     #----呼出菜单
 -     if Input.trigger?(Input::B)
 -       @update_begin = 2
 -       @command_window.visible = true
 -       @command_window.active = true
 -       return
 -     end
 -    #----
 -    #用变量判断旋转那张图片
 -    if@num > 1  
 -       if Input.trigger?(Input::RIGHT)
 -         @num -= 1
 -         Audio.se_play("Audio/SE/002-System02", 100, 100)
 -       end
 -     end
 -    if@num < 4
 -     if Input.trigger?(Input::LEFT)
 -       @num +=  1
 -       Audio.se_play("Audio/SE/002-System02", 100, 100)
 -     end
 -   end
 -   case@num
 -     when1#p5
 -       return_pic               #——还原图片透明
 -       @pt5.opacity = $OPA_Y    #选中透明度变化
 -       # 按 上 的情况
 -       if Input.trigger?(Input::UP)
 -          @pt5.angle = @pt5.angle + 15
 -          Audio.se_play("Audio/SE/001-System01", 100, 100)
 -        return
 -       end
 -       #按 下 的情况
 -       if Input.trigger?(Input::DOWN)
 -          @pt5.angle = @pt5.angle - 15
 -          Audio.se_play("Audio/SE/001-System01", 100, 100)
 -        return
 -      end
 -     when2#p4
 -       return_pic
 -       @pt4.opacity = $OPA_Y
 -       # 按 上 的情况  
 -       if Input.trigger?(Input::UP)
 -          @pt4.angle = @pt4.angle + 15
 -          Audio.se_play("Audio/SE/001-System01", 100, 100)
 -        return
 -       end
 -      #按 下 的情况
 -       if Input.trigger?(Input::DOWN)
 -          @pt4.angle = @pt4.angle - 15
 -          Audio.se_play("Audio/SE/001-System01", 100, 100)
 -        return
 -      end
 -     when3#p3
 -       return_pic
 -       @pt3.opacity = $OPA_Y
 -       # 按 上 的情况  
 -       if Input.trigger?(Input::UP)
 -         @pt3.angle = @pt3.angle + 15
 -         Audio.se_play("Audio/SE/001-System01", 100, 100)
 -       return
 -       end
 -       #按 下 的情况
 -       if Input.trigger?(Input::DOWN)
 -         @pt3.angle = @pt3.angle - 15
 -         Audio.se_play("Audio/SE/001-System01", 100, 100)
 -         return
 -       end
 -     when4#p2
 -       return_pic
 -       @pt2.opacity = $OPA_Y
 -       # 按 上 的情况  
 -       if Input.trigger?(Input::UP)
 -         @pt2.angle = @pt2.angle + 15
 -         Audio.se_play("Audio/SE/001-System01", 100, 100)
 -       return
 -      end
 -      #按 下 的情况
 -      if Input.trigger?(Input::DOWN)
 -         @pt2.angle = @pt2.angle - 15
 -         Audio.se_play("Audio/SE/001-System01", 100, 100)
 -      return
 -      end
 -    end#——end case @num
 -   victory_pt
 - when2
 -   update_command
 - end#--end case @update_begin
 - end#——end update
 -   #--------------------------------------------------------------------------
 -   # ● 窗口刷新画面
 -   #--------------------------------------------------------------------------
 -   def update_command
 -       @command_window.update
 -     if Input.trigger?(Input::B)
 -       @update_begin = 1
 -       @command_window.visible = false
 -       @command_window.active = false
 -   end
 -     # 按下 C 键的情况下
 -     if Input.trigger?(Input::C)
 -       # 命令窗口的光标位置分支
 -       case@command_window.index
 -       when0
 -       @update_begin = 1
 -       @command_window.visible = false
 -       @command_window.active = false
 -       game_begin
 -       when1
 -       $scene = Scene_Map.new
 -       $game_map.refresh         
 -       end
 -   end
 - end#---end update_command
 -   #--------------------------------------------------------------------------
 -   # ● 还原透明度
 -   #--------------------------------------------------------------------------  
 - def return_pic
 -   #还原选择透明度
 -   @pt2.opacity = $OPA_N
 -   @pt3.opacity = $OPA_N
 -   @pt4.opacity = $OPA_N
 -   @pt5.opacity = $OPA_N
 - end
 -   #--------------------------------------------------------------------------
 -   # ● 开始处理
 -   #--------------------------------------------------------------------------
 - def game_begin
 -   if@pt2.angle && @pt3.angle && @pt4.angle && @pt5.angle == 0   #我也不知道这种
 -   @pt2.angle = rand(360) * 15                                    #方法管不管用。- -
 -   @pt3.angle = rand(360) * 15
 -   @pt4.angle = rand(360) * 15
 -   @pt5.angle = rand(360) * 15
 -    else
 -   @pt2.angle = rand(360) * 15
 -   @pt3.angle = rand(360) * 15
 -   @pt4.angle = rand(360) * 15
 -   @pt5.angle = rand(360) * 15
 -   end
 - end
 -   #--------------------------------------------------------------------------
 -   # ● 结束处理
 -   #--------------------------------------------------------------------------
 - def victory_pt
 -   @finish_pt2 = @pt2.angle % 360
 -   @finish_pt3 = @pt3.angle % 360
 -   @finish_pt4 = @pt4.angle % 360
 -   @finish_pt5 = @pt5.angle % 360
 -   if@finish_pt2 ==0 && @finish_pt3 == 0 && @finish_pt4 ==0 && @finish_pt5 == 0
 -     Audio.me_play("Audio/ME/001-Victory01", 80, 100)
 -     for i in0..15
 -       @pt0.opacity+=18
 -       Graphics.update
 -     end   
 -     for j in0..200   #----等待,我只能想出这方法了,有别的方法告诉我一声! - -b
 -      Graphics.update
 -    end   
 -    $game_switches[$Pt_Victory] = true
 -    $scene = Scene_Map.new
 -    $game_map.refresh          #刷新地图,奇怪了,以前没有用过,害我郁闷了半天。
 -    return
 -   end
 - end
 - end#——end class
 
  复制代码 
----------------------------------------------------------------------截图----------------------------------------------------------------
 
-------------------------------------------------------------------可爱的分割线------------------------------------------------------------ 
拼图图片制作: 
图像——图像大小
 
设置好大小后,点切片工具
 
在图片上右键,选划分切片,切2 * 2的切片
 
再选椭圆工具
 
选固定比例 1:1,圆形选择工具的羽化调成0
 
按着ALT,对着中间切片中心的点拉出正圆
 
按shift+ctrl+J分离出一个新层,后,再选新层
 
切出来的第一个完整的图,记得再备份一个,后面用来制作黑色底版
 
然后不断的切切切,切成像甜甜圈那样5张。
 
然后就是一层一层的保存出来,包括那个完整大圆。
 
然后选择那个备份出来的大圆图,选图像——调整——色相、饱和度,明暗调成0
 
最后再保存出来就ok了! 
=============================分隔,分隔=============== 
以下范例以更新1.01 
百度网盘:
 点我,点我,点我下载
点下面下载:
 
我切好的图片范例:
 
=====================================================
 对了,求助大神一下,为什么游戏里会出现这种明显的缝隙?旋转到一定角度有,一定角度后没有。
             本帖来自P1论坛作者海的那边,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址: https://rpg.blue/forum.php?mod=viewthread&tid=253643  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。  |