扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 117|回复: 0

[转载发布] 【已修正 版本1.01】仿。刺客信条2的旋转拼图

[复制链接]
累计送礼:
0 个
累计收礼:
0 个
  • TA的每日心情
    开心
    2025-3-29 03:52
  • 签到天数: 127 天

    连续签到: 11 天

    [LV.7]常住居民III

    2350

    主题

    420

    回帖

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    6
    卡币
    11311
    OK点
    16
    推广点
    0
    同能卷
    0
    积分
    14109

    灌水之王

    发表于 2024-4-19 21:12:13 | 显示全部楼层 |阅读模式
    我本来是不需要参数传递和按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 代码
    1. #==============================================================================
    2. # ■ Scene_ZPT
    3. #------------------------------------------------------------------------------
    4. #  旋转拼图  1.01                     ——海的那边
    5. #==============================================================================
    6. $Pt_Victory = 5       #完成打开开关
    7. $OPA_N = 120         #未选择中的透明度
    8. $OPA_Y = 255         #选择中的透明度
    9. $SITE_X = 255        #图片的X坐标
    10. $SITE_Y = 255        #图片的Y坐标
    11. =begin
    12. 版本1.01
    13. 1.修正了图片显示错误的问题,写糊涂了。
    14. 2.修正了返回地图时地图没有刷新的问题。
    15. 3.优化了结束拼图消失的问题。
    16. 另:我的设定是,第一盘赢后打开开关,但只要再进一次拼图开关就变关闭了,只要是不是
    17. 再胜利开关就是关闭状态,就是中途退出,开关就是关闭。不想要这设定的,删除166行的
    18. $game_switches[$Pt_Victory] = false。
    19. 呃,这个就是模仿刺客信条2的真相解密里的那个旋转拼图,这玩意是我用在我的游戏
    20. 里的,我需要的功能都有,所以大概就这个样子,或许写得不是很人性化。
    21. 这玩意的使用方法:方向键左右选择高亮的光标;上下是逆顺时针选择。
    22. 事件里写$scene = Scene_ZPT.new("pt") ,"pt"是一个参数,
    23. 就是游戏Graphics/Pictures/目录里的拼图图片,图片写成 pt_01、pt_02到pt_05五张。
    24. 目录里还有一张pt_00,那张是完整是图片,是最后拼完后显示的。黑色的那个back的背后
    25. 的挡板,如果有朋友换背景图片,这个高亮选中的方法不至于出现奇葩的现象。
    26. 哦,还有一个,就是刺客信条2里的这个拼图可没有这么简单,它旋转一个是时候,别的
    27. 也会跟着一起动,这个嘛,大家有需要的自己制作了,很容易旋转的when那里,别的跟着
    28. 旋转就行。
    29. BUG嘛,五个随机数,有可能出现一进游戏就胜利的情况,虽然微乎其微,但是理论上是可能滴。
    30. 我暂时没有发现。有发现的朋友说一声,能不能修复我不知道。 - -b
    31. 冲突,我想不太可能。
    32. 大家放进游戏的时候,自己添加背景图片吧,加个Sprite,再释放就行。
    33. 对了,求助一下大神,为什么旋转的时候会出现图片衔接出现有一点缝隙的?旋转到这角度
    34. 有,另一个角度就没了,不知道是不是我们PS制作得不严谨?
    35. =end
    36. class Scene_ZPT
    37.   def initialize(pic)
    38.     @pt_pic = pic
    39.   end
    40.   #--------------------------------------------------------------------------
    41.   # ● 主处理
    42.   #--------------------------------------------------------------------------
    43.   def main
    44.     #生成圆形背景图片
    45.     @ptb = Sprite.new
    46.     @ptb.bitmap = Bitmap.new("Graphics/Pictures/" + @pt_pic + "_back.png")
    47.     @ptb.x = $SITE_X
    48.     @ptb.y = $SITE_Y
    49.     @ptb.ox = @ptb.bitmap.width / 2
    50.     @ptb.oy = @ptb.bitmap.height / 2
    51.     #生成轴图片
    52.     @pt1 = Sprite.new
    53.     @pt1.bitmap = Bitmap.new("Graphics/Pictures/" + @pt_pic + "_1.png")
    54.     @pt1.x = $SITE_X
    55.     @pt1.y = $SITE_Y
    56.     @pt1.ox = @pt1.bitmap.width / 2
    57.     @pt1.oy = @pt1.bitmap.height / 2
    58.     @pt1.opacity = $OPA_N
    59.     #生成拼图 2
    60.     @pt2 = Sprite.new
    61.     @pt2.bitmap = Bitmap.new("Graphics/Pictures/" + @pt_pic + "_2.png")   
    62.     @pt2.x = @pt1.x
    63.     @pt2.y = @pt1.y
    64.     @pt2.ox = @pt2.bitmap.width / 2
    65.     @pt2.oy = @pt2.bitmap.height / 2
    66.     @pt2.opacity = $OPA_N
    67.     #生成拼图 3
    68.     @pt3 = Sprite.new
    69.     @pt3.bitmap = Bitmap.new("Graphics/Pictures/" + @pt_pic + "_3.png")  
    70.     @pt3.x = @pt1.x
    71.     @pt3.y = @pt1.y
    72.     @pt3.ox = @pt3.bitmap.width / 2
    73.     @pt3.oy = @pt3.bitmap.height / 2
    74.     @pt3.opacity = $OPA_N
    75.     #生成拼图 4
    76.     @pt4 = Sprite.new
    77.     @pt4.bitmap = Bitmap.new("Graphics/Pictures/" + @pt_pic + "_4.png")
    78.     @pt4.x = @pt1.x
    79.     @pt4.y = @pt1.y
    80.     @pt4.ox = @pt4.bitmap.width / 2
    81.     @pt4.oy = @pt4.bitmap.height / 2
    82.     @pt4.opacity = $OPA_N
    83.     #生成拼图 5
    84.     @pt5 = Sprite.new
    85.     @pt5.bitmap = Bitmap.new("Graphics/Pictures/" + @pt_pic + "_5.png")
    86.     @pt5.x = @pt1.x
    87.     @pt5.y = @pt1.y
    88.     @pt5.ox = @pt5.bitmap.width / 2
    89.     @pt5.oy = @pt5.bitmap.height / 2
    90.     @pt5.opacity = $OPA_N
    91.     #生成完整图
    92.     @pt0 = Sprite.new
    93.     @pt0.bitmap = Bitmap.new("Graphics/Pictures/" + @pt_pic + "_0.png")
    94.     @pt0.x = $SITE_X
    95.     @pt0.y = $SITE_Y
    96.     @pt0.opacity = 0
    97.     @pt0.ox = @pt1.bitmap.width / 2
    98.     @pt0.oy = @pt1.bitmap.height / 2
    99.     @update_begin = 1
    100.     @num = 1        #开始的光标亮在哪里
    101.     game_begin
    102. #--------------菜单--------------
    103.     # 生成命令窗口
    104.     s1 = "重新开始"
    105.     s2 = "退出"
    106.     @command_window = Window_Command.new(180,[s1,s2])
    107.     @command_window.x = 240
    108.     @command_window.y = 160
    109.     @command_window.z = 1000
    110.     @command_window.back_opacity = 180
    111.     @command_window.visible = false
    112.     @command_window.active = false
    113.     @command_window.index = 0
    114. #-------------------------------  
    115.     # 执行过渡
    116.     Graphics.transition(40)
    117.     # 主循环
    118.     loopdo
    119.       # 刷新游戏画面
    120.       Graphics.update
    121.       # 刷新输入信息
    122.       Input.update
    123.       # 刷新画面情报
    124.       update
    125.       # 如果画面被切换的话就中断循环
    126.       if$scene != self
    127.         break
    128.       end
    129.     end
    130.     # 准备过渡
    131.     Graphics.freeze
    132.     #释放窗口
    133.     @command_window.dispose
    134.     # 释放拼图图形
    135.     @ptb.bitmap.dispose
    136.     @ptb.dispose
    137.     @pt1.bitmap.dispose
    138.     @pt1.dispose
    139.     @pt2.bitmap.dispose
    140.     @pt2.dispose
    141.     @pt3.bitmap.dispose
    142.     @pt3.dispose
    143.     @pt4.bitmap.dispose
    144.     @pt4.dispose
    145.     @pt5.bitmap.dispose
    146.     @pt5.dispose
    147.     @pt0.bitmap.dispose
    148.     @pt0.dispose
    149.     # 执行过度
    150.     Graphics.transition(20)
    151.     # 准备过渡
    152.     Graphics.freeze
    153.   end
    154.   #--------------------------------------------------------------------------
    155.   # ● 刷新画面
    156.   #--------------------------------------------------------------------------
    157.   def update
    158.   $game_switches[$Pt_Victory] = false
    159.   case@update_begin
    160.   when1
    161.     #----呼出菜单
    162.     if Input.trigger?(Input::B)
    163.       @update_begin = 2
    164.       @command_window.visible = true
    165.       @command_window.active = true
    166.       return
    167.     end
    168.    #----
    169.    #用变量判断旋转那张图片
    170.    if@num > 1  
    171.       if Input.trigger?(Input::RIGHT)
    172.         @num -= 1
    173.         Audio.se_play("Audio/SE/002-System02", 100, 100)
    174.       end
    175.     end
    176.    if@num < 4
    177.     if Input.trigger?(Input::LEFT)
    178.       @num +=  1
    179.       Audio.se_play("Audio/SE/002-System02", 100, 100)
    180.     end
    181.   end
    182.   case@num
    183.     when1#p5
    184.       return_pic               #——还原图片透明
    185.       @pt5.opacity = $OPA_Y    #选中透明度变化
    186.       # 按 上 的情况
    187.       if Input.trigger?(Input::UP)
    188.          @pt5.angle = @pt5.angle + 15
    189.          Audio.se_play("Audio/SE/001-System01", 100, 100)
    190.        return
    191.       end
    192.       #按 下 的情况
    193.       if Input.trigger?(Input::DOWN)
    194.          @pt5.angle = @pt5.angle - 15
    195.          Audio.se_play("Audio/SE/001-System01", 100, 100)
    196.        return
    197.      end
    198.     when2#p4
    199.       return_pic
    200.       @pt4.opacity = $OPA_Y
    201.       # 按 上 的情况  
    202.       if Input.trigger?(Input::UP)
    203.          @pt4.angle = @pt4.angle + 15
    204.          Audio.se_play("Audio/SE/001-System01", 100, 100)
    205.        return
    206.       end
    207.      #按 下 的情况
    208.       if Input.trigger?(Input::DOWN)
    209.          @pt4.angle = @pt4.angle - 15
    210.          Audio.se_play("Audio/SE/001-System01", 100, 100)
    211.        return
    212.      end
    213.     when3#p3
    214.       return_pic
    215.       @pt3.opacity = $OPA_Y
    216.       # 按 上 的情况  
    217.       if Input.trigger?(Input::UP)
    218.         @pt3.angle = @pt3.angle + 15
    219.         Audio.se_play("Audio/SE/001-System01", 100, 100)
    220.       return
    221.       end
    222.       #按 下 的情况
    223.       if Input.trigger?(Input::DOWN)
    224.         @pt3.angle = @pt3.angle - 15
    225.         Audio.se_play("Audio/SE/001-System01", 100, 100)
    226.         return
    227.       end
    228.     when4#p2
    229.       return_pic
    230.       @pt2.opacity = $OPA_Y
    231.       # 按 上 的情况  
    232.       if Input.trigger?(Input::UP)
    233.         @pt2.angle = @pt2.angle + 15
    234.         Audio.se_play("Audio/SE/001-System01", 100, 100)
    235.       return
    236.      end
    237.      #按 下 的情况
    238.      if Input.trigger?(Input::DOWN)
    239.         @pt2.angle = @pt2.angle - 15
    240.         Audio.se_play("Audio/SE/001-System01", 100, 100)
    241.      return
    242.      end
    243.    end#——end case @num
    244.   victory_pt
    245. when2
    246.   update_command
    247. end#--end case @update_begin
    248. end#——end update
    249.   #--------------------------------------------------------------------------
    250.   # ● 窗口刷新画面
    251.   #--------------------------------------------------------------------------
    252.   def update_command
    253.       @command_window.update
    254.     if Input.trigger?(Input::B)
    255.       @update_begin = 1
    256.       @command_window.visible = false
    257.       @command_window.active = false
    258.   end
    259.     # 按下 C 键的情况下
    260.     if Input.trigger?(Input::C)
    261.       # 命令窗口的光标位置分支
    262.       case@command_window.index
    263.       when0
    264.       @update_begin = 1
    265.       @command_window.visible = false
    266.       @command_window.active = false
    267.       game_begin
    268.       when1
    269.       $scene = Scene_Map.new
    270.       $game_map.refresh         
    271.       end
    272.   end
    273. end#---end update_command
    274.   #--------------------------------------------------------------------------
    275.   # ● 还原透明度
    276.   #--------------------------------------------------------------------------  
    277. def return_pic
    278.   #还原选择透明度
    279.   @pt2.opacity = $OPA_N
    280.   @pt3.opacity = $OPA_N
    281.   @pt4.opacity = $OPA_N
    282.   @pt5.opacity = $OPA_N
    283. end
    284.   #--------------------------------------------------------------------------
    285.   # ● 开始处理
    286.   #--------------------------------------------------------------------------
    287. def game_begin
    288.   if@pt2.angle && @pt3.angle && @pt4.angle && @pt5.angle == 0   #我也不知道这种
    289.   @pt2.angle = rand(360) * 15                                    #方法管不管用。- -
    290.   @pt3.angle = rand(360) * 15
    291.   @pt4.angle = rand(360) * 15
    292.   @pt5.angle = rand(360) * 15
    293.    else
    294.   @pt2.angle = rand(360) * 15
    295.   @pt3.angle = rand(360) * 15
    296.   @pt4.angle = rand(360) * 15
    297.   @pt5.angle = rand(360) * 15
    298.   end
    299. end
    300.   #--------------------------------------------------------------------------
    301.   # ● 结束处理
    302.   #--------------------------------------------------------------------------
    303. def victory_pt
    304.   @finish_pt2 = @pt2.angle % 360
    305.   @finish_pt3 = @pt3.angle % 360
    306.   @finish_pt4 = @pt4.angle % 360
    307.   @finish_pt5 = @pt5.angle % 360
    308.   if@finish_pt2 ==0 && @finish_pt3 == 0 && @finish_pt4 ==0 && @finish_pt5 == 0
    309.     Audio.me_play("Audio/ME/001-Victory01", 80, 100)
    310.     for i in0..15
    311.       @pt0.opacity+=18
    312.       Graphics.update
    313.     end   
    314.     for j in0..200   #----等待,我只能想出这方法了,有别的方法告诉我一声! - -b
    315.      Graphics.update
    316.    end   
    317.    $game_switches[$Pt_Victory] = true
    318.    $scene = Scene_Map.new
    319.    $game_map.refresh          #刷新地图,奇怪了,以前没有用过,害我郁闷了半天。
    320.    return
    321.   end
    322. end
    323. 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在线咨询功能删除,谢谢。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2025-4-20 20:00 , Processed in 0.116519 second(s), 55 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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