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

[转载发布] 【原创】【插件】RPG游戏中的QTE Ver 1.1

[复制链接]
累计送礼:
0 个
累计收礼:
0 个
  • TA的每日心情
    开心
    6 天前
  • 签到天数: 127 天

    连续签到: 11 天

    [LV.7]常住居民III

    2341

    主题

    417

    回帖

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    6
    卡币
    11285
    OK点
    16
    推广点
    0
    同能卷
    0
    积分
    14071

    灌水之王

    发表于 2024-4-20 02:14:59 | 显示全部楼层 |阅读模式
    废话不多说,直接上脚本和图示说明。由于自己最近玩了很多脑残的动作游戏,被里面的QTE弄疯了,因此自制了一个朴素版的插件玩玩。
    说明贴在脚本最前头了,如果有BUG什么的通知我下,懂脚本的也可以自行更正-_-||
    RUBY 代码
    1. #=============================================================================
    2. # 紧急操作事件(Quick Time Event)小插件 Ver 1.1
    3. #-----------------------------------------------------------------------------
    4. # 作者:RyanBern
    5. #=============================================================================
    6. #=============================================================================
    7. # 功能说明:
    8. #-----------------------------------------------------------------------------
    9. # 可以实现在RMXP游戏进行中的QTE,虽然把QTE放在RPG游戏中感觉很奇怪,没什么用。
    10. # 但是为了好玩,就做了一个这个。如果有全键盘脚本的话,对此插件稍微加点
    11. # 改动就可以实现更多按键的QTE。不过本脚本针对的是原装脚本的输入系统而编写的。
    12. # 插件较朴素,只是实现了一些简单的功能,有时间我会陆续添加。
    13. #-----------------------------------------------------------------------------
    14. # 这里包含两种QTE的模式:单按键瞬时紧急事件(QTE_Single)和按键组蓄力紧急事件
    15. # (QTE_Combination)。前者是在适当时间点按下规定的按键即可完成一次QTE,又分为
    16. # 有时限和无时限两种;后者是在一定时间内依照次序不断输入按键组,达到规定次数就
    17. # 可以完成QTE,也分为有时限和无时限两种。
    18. #-----------------------------------------------------------------------------
    19. # 有关脚本的兼容性,本脚本在新工程的环境下编写,新增了若干模块,对原有的脚本
    20. # 改动极小,经过简单整合就可以实现兼容。但是对于RTAB战斗系统的兼容性未经测试
    21. #=============================================================================
    22. #=============================================================================
    23. # 使用说明:
    24. #-----------------------------------------------------------------------------
    25. # 我已经在地图场景(Scene_Map)和战斗场景(Scene_Battle)添加了这两种QTE的插件
    26. # 不用的时候它们隐藏在场景中,如果使用的时候,可以通过事件“脚本”命令进行手动
    27. # 激活。
    28. #-----------------------------------------------------------------------------
    29. # 单按键瞬时紧急事件(QTE_Single)的启动方法
    30. # qte = $scene.get_QTE_single    # 取得当前场景的QTE_Single插件
    31. # qte.time_limit = XX            # 设置时限,单位是帧,如果不想设置时间限制,请设置为0
    32. # qte.keys = [XX,XX]            # 设置按键,可以设置多个,玩家必须按照次序全部按对才算QTE成功
    33. # qte.success_field = [[XX,XX], [XX,XX]]
    34. #                                # 设置有效按键区域,最大范围是[0,100]
    35. #                                  例如设置[50,60]表示只有在指针经过这个区域按下
    36. #                                  指定按键才算QTE成功,每个按键都必须设置,否则会报错。
    37. # qte.non_mistake_mode = true/false
    38. #                                # 设置是否允许按错,这里按错的定义是按错按键或者按对了
    39. #                                  但是没有在规定区域上。如果设置为true则按错一次QTE就会失败。
    40. # qte.start                      # 激活QTE插件
    41. # QTE结束后,可以使用
    42. # $scene.get_QTE_single.result   # 显示最近一次QTE结果,成功为true,失败为false
    43. #-----------------------------------------------------------------------------
    44. # 按键组蓄力紧急事件(QTE_Combination)的启动方法
    45. # qte = $scene.get_QTE_com       # 取得当前场景的QTE_Combination插件
    46. # qte.time_limit = XX            # 设置时限,单位是帧,如果不想设置时间限制,请设置为0
    47. # qte.key_set = [XX,XX,…,XX]    # 设置按键组,例如[Input::LEFT,Input::Right]
    48. #                                  表示需要按照顺序按下这一组键才能蓄力,循环操作
    49. # qte.power_need = XX            # 设置QTE成功需要的蓄力能量
    50. # qte.power_increment = XX       # 设置成功按键一次后,增加的能量
    51. # qte.power_decrement = XX       # 设置自动随时间减少的能量,单位是 能量/帧,数值不宜过
    52. #                                  大,否则会很变态。
    53. # qte.start                      # 激活QTE插件
    54. # QTE结束后,可以使用
    55. # $scene.get_QTE_single.result   # 显示最近一次QTE结果,成功为true,失败为false
    56. #-----------------------------------------------------------------------------
    57. # 注意事项(重要):
    58. #-----------------------------------------------------------------------------
    59. # 1.使用事件“脚本”指令设置并开启QTE插件后,需要设置“等待 3 帧”,然后再使用
    60. #   事件“条件分歧——脚本——$scene.get_QTE_Xx.result”进行分歧,否则事件解释
    61. #   器会提前进行判断。
    62. # 2.如果QTE组件被激活,那么场景的update会优先刷新QTE组件,而其它模块的刷新会暂
    63. #   时停止。QTE完成后,再进行正常刷新。
    64. # 3.不可以同时激活两种QTE插件。
    65. # 4.禁止在非地图场景和战斗场景里面获取相应的QTE组件。
    66. # 5.如果对技能里面使用QTE,建议把技能的效果全都放到公共事件中,效果范围设置
    67. #   为[无],之后关联公共事件,先开启QTE,然后“等待 3 帧”,再对QTE结果做伤
    68. #   害处理。
    69. #=============================================================================
    70. #=============================================================================
    71. # 更新记录
    72. #-----------------------------------------------------------------------------
    73. # Ver 1.1 : 修改 QTE_Single,增加功能可以连续点击一组按键,同时QTE_Single具备
    74. #           了按错即QTE失败的功能。原QTE_Combination功能不变。
    75. #           注:QTE_Single中的字段做了修改,和1.0不兼容。
    76. #=============================================================================
    77. #=============================================================================
    78. # 素材/基础设定
    79. #=============================================================================
    80. module QTE
    81.   # QTE 组件游标图,大小 24*24,放在Graphis/Icons下
    82.   ICON_NAME = "047-Skill04.png"
    83.   # QTE 成功播放 SE
    84.   SUCCEEDED_SE = "Audio/SE/002-System02"
    85.   # QTE 失败播放 SE
    86.   FAILED_SE = "Audio/SE/004-System04"
    87.   # 可用 QTE 按键集合及用语设定
    88.   ALL_KEYS = {
    89.               Input::A => "Z",  Input::B => "X", Input::C => "Space",
    90.               Input::UP => "↑", Input::DOWN => "↓", Input::LEFT => "←",
    91.               Input::RIGHT => "→", Input::SHIFT => "Shift",
    92.               Input::CTRL => "Ctrl", Input::ALT => "ALT"
    93.               }
    94. end
    95. module Input
    96.   defself.key_trigger?
    97.     returnQTE::ALL_KEYS.keys.any?{|key| self.trigger?(key)}
    98.   end
    99. end
    100. class Window_QTE_Base < Window_Base
    101.   attr_accessor :time_limit
    102.   attr_reader   :activated
    103.   attr_reader   :result
    104.   def initialize
    105.     super(-160, 320, 160, 96)
    106.     self.z = 999
    107.     self.visible = false
    108.     @activated = false
    109.     @result = false
    110.     @state = 0
    111.     @time_limit = 0
    112.     @time_count = 0
    113.     @arrow_sprite = Sprite.new
    114.     @arrow_sprite.bitmap =  Bitmap.new(24, 24)
    115.     ifQTE::ICON_NAME != ""
    116.       @arrow_sprite.bitmap = RPG::Cache.icon(QTE::ICON_NAME)
    117.     end
    118.     @x_increment = 16
    119.     @y_increment = 56
    120.     @arrow_sprite.x = self.x + @x_increment
    121.     @arrow_sprite.y = self.y + @y_increment
    122.     @arrow_sprite.z = self.z + 10
    123.     @arrow_sprite.ox = @arrow_sprite.bitmap.width / 2
    124.     @arrow_sprite.oy = @arrow_sprite.bitmap.height / 2
    125.   end
    126.   def visible=(val)
    127.     @arrow_sprite.visible = val if@arrow_sprite != nil
    128.     super(val)
    129.   end
    130.   def x=(new_x)
    131.     @arrow_sprite.x = new_x + @x_incrementif@arrow_sprite != nil
    132.     super(new_x)
    133.   end
    134.   def y=(new_y)
    135.     @arrow_sprite.y = new_y + @y_incrementif@arrow_sprite != nil
    136.     super(new_y)
    137.   end
    138.   def z=(new_z)
    139.     @arrow_sprite.z = new_z + 10if@arrow_sprite != nil
    140.     super(new_z)
    141.   end
    142.   def start
    143.     self.visible = true
    144.     reset
    145.     for i in0...16
    146.       self.x += 10
    147.       Graphics.update
    148.     end
    149.     @activated = true
    150.   end
    151.   def update
    152.     super
    153.   end
    154.   def dispose
    155.     @arrow_sprite.bitmap.dispose
    156.     @arrow_sprite.dispose
    157.     super
    158.   end
    159.   def reset
    160.     @x_increment = 16
    161.     self.x = -160
    162.     @time_count = 0
    163.     @state = 0
    164.     @result = false
    165.     refresh
    166.   end
    167.   def terminate(qte_result)
    168.     @result = qte_result
    169.     @activated = false
    170.     for i in0...16
    171.       self.x -= 10
    172.       Graphics.update
    173.     end
    174.     self.visible = false
    175.   end
    176. end
    177. class Window_QTE_Single < Window_QTE_Base
    178.   attr_writer   :keys
    179.   attr_writer   :success_fields
    180.   attr_accessor :non_mistake_mode
    181.   def initialize(keys, fields, non_mistake_mode = false)
    182.     super()
    183.     @keys = keys
    184.     @success_fields = fields
    185.     @non_mistake = non_mistake_mode
    186.     self.contents = Bitmap.new(width - 32, height - 32)
    187.     refresh
    188.   end
    189.   def refresh
    190.     self.contents.clear
    191.     text = QTE::ALL_KEYS[@keys[@state]] || ""
    192.     self.contents.draw_text(4, 0, 128, 32, "按下:" + text)
    193.     draw_bar
    194.   end
    195.   def draw_bar
    196.     w = 128
    197.     w1 = Integer((w-2) * @success_fields[@state][0] / 100.0)
    198.     w2 = Integer((w-2) * @success_fields[@state][1] / 100.0)
    199.     self.contents.fill_rect(0,48,w,8,Color.new(255,255,255,255))
    200.     self.contents.fill_rect(1,49,w-2,6,Color.new(0,0,0,255))
    201.     self.contents.fill_rect(w1,50,w2-w1,1,Color.new(0,150,0,255))
    202.     self.contents.fill_rect(w1,51,w2-w1,1,Color.new(0,200,0,255))
    203.     self.contents.fill_rect(w1,52,w2-w1,1,Color.new(0,150,0,255))
    204.   end
    205.   def update
    206.     super
    207.     update_arrow
    208.     if Input.key_trigger?
    209.       update_input
    210.     end
    211.     terminate(true)if@state == @keys.size
    212.     terminate(false)if@time_limit > 0 && @time_count > @time_limit
    213.   end
    214.   def update_arrow
    215.     if@time_limit == 0
    216.       if@time_count >= 100
    217.         @step = -4
    218.       end
    219.       if@time_count  w
    220.     self.contents.fill_rect(0,48,w,8,Color.new(255,255,255,255))
    221.     self.contents.fill_rect(1,49,w-2,6,Color.new(0,0,0,255))
    222.     self.contents.fill_rect(1,50,w1,1,Color.new(0,150,0,255))
    223.     self.contents.fill_rect(1,51,w1,1,Color.new(0,200,0,255))
    224.     self.contents.fill_rect(1,52,w1,1,Color.new(0,150,0,255))
    225.   end
    226.   def update
    227.     super
    228.     if@time_limit == 0
    229.       key = @key_set[@state]
    230.       if Input.trigger?(key)
    231.         self.power += @power_increment
    232.         @state += 1
    233.         @state %= @key_set.size
    234.       end
    235.       self.power -= @power_decrement
    236.       if@power >= @power_need
    237.         Audio.se_play(QTE::SUCCEEDED_SE)
    238.         terminate(true)
    239.         return
    240.       end
    241.     elsif@time_limit > 0
    242.       @time_count += 1
    243.       @x_increment = 16 + Integer(1.0 * @time_count * 128 / @time_limit)
    244.       @arrow_sprite.x = self.x + @x_increment
    245.       key = @key_set[@state]
    246.       if Input.trigger?(key)
    247.         self.power += @power_increment
    248.         @state += 1
    249.         @state %= @key_set.size
    250.       end
    251.       self.power -= @power_decrement
    252.       if@power >= @power_need
    253.         Audio.se_play(QTE::SUCCEEDED_SE)
    254.         terminate(true)
    255.         return
    256.       end
    257.       if@time_count >= @time_limit
    258.         Audio.se_play(QTE::FAILED_SE)
    259.         terminate(false)
    260.         return
    261.       end
    262.     end
    263.   end
    264. end
    265. class Scene_Map
    266.   alias qte_main main
    267.   def main
    268.     @qte_single = Window_QTE_Single.new(Input::C, [0,100])
    269.     @qte_com = Window_QTE_Combination.new([Input::C], 500, 50, 0)
    270.     qte_main
    271.     @qte_single.dispose
    272.     @qte_com.dispose
    273.   end
    274.   alias qte_update update
    275.   def update
    276.     if@qte_single.activated
    277.       @qte_single.update
    278.       return
    279.     end
    280.     if@qte_com.activated
    281.       @qte_com.update
    282.       return
    283.     end
    284.     qte_update
    285.   end
    286.   def get_QTE_single
    287.     return@qte_single
    288.   end
    289.   def get_QTE_com
    290.     return@qte_com
    291.   end
    292. end
    293. class Scene_Battle
    294.   alias qte_main main
    295.   def main
    296.     @qte_single = Window_QTE_Single.new(Input::C, [0,100])
    297.     @qte_com = Window_QTE_Combination.new([Input::C], 500, 50, 0)
    298.     qte_main
    299.     @qte_single.dispose
    300.     @qte_com.dispose
    301.   end
    302.   alias qte_update update
    303.   def update
    304.     if@qte_single.activated
    305.       @qte_single.update
    306.       return
    307.     end
    308.     if@qte_com.activated
    309.       @qte_com.update
    310.       return
    311.     end
    312.     qte_update
    313.   end
    314.   def get_QTE_single
    315.     return@qte_single
    316.   end
    317.   def get_QTE_com
    318.     return@qte_com
    319.   end
    320. end
    复制代码

    附:几个QTE组件的设置图:
    地图中的QTE开启示意图:

    战斗QTE技能设置方法及判定示意图


    地图中的QTE_Single:

    战斗中的QTE_Combination:


    范例附件:

    另外拜托版主去一下Url,这玩意出现在脚本里面太讨厌了-_-||     
                 本帖来自P1论坛作者杨广,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=366898  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。

    本帖子中包含更多资源

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

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

    使用道具 举报

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

    本版积分规则

    关闭

    幸运抽奖

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

    立即查看

    聊天机器人
    Loading...

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

    GMT+8, 2025-4-4 02:17 , Processed in 0.086637 second(s), 54 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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