Project1

标题: 求QTE和连打脚本插入【闪屏】效果的方法 [打印本页]

作者: eruru    时间: 2022-1-13 13:31
标题: 求QTE和连打脚本插入【闪屏】效果的方法

QTE和连打都是基于这位的脚本开发的

https://rpg.blue/thread-409643-1-1.html
做完发现如果把QTE改成连续按某个键连打的话反馈感不够

现在想要实现每按一次按键就可以实现一次闪屏的效果   如下


目前的效果用的是喵呜大大的地图显示图片脚本
https://rpg.blue/home.php?mod=space&uid=291206&do=blog&id=16651
把图片硬做在input trigger里面,算10次变量然后触发事件成功了   弊端是不知道怎么做失败情况TAT

(如果能用脚本硬插在里的话就更好了  使用起来比较方便)


这里贴一下制作者提供的脚本
作者还附加了一个QTE UI用脚本  如果需要也可以贴上来
(不清楚能不能2此修改和开贴上传,如果该贴有冒犯到作者可以删除本贴)
RUBY 代码复制
  1. class Game_Interpreter
  2.   # QTE_RESERVED_KEYS: 仅扫描此列 QTE 按键
  3.   # 在 QTE 事件中,若按下不正确的按键,视为失败
  4.   QTE_RESERVED_KEYS = [
  5.     :DOWN, :LEFT, :RIGHT, :UP,
  6.     :A, :B, :C, :X, :Y, :Z, :L, :R,
  7.     :SHIFT, :CTRL, :ALT,
  8.     :F5, :F6, :F7, :F8, :F9
  9.   ]
  10.   alias qte_logic_update update
  11.   def update
  12.     qte_logic_update
  13.     update_qte_logic if @qte_event
  14.   end
  15.   # qte!(60, [:C, :B], 1, 2, true) {|t, key_states|  }
  16.   # duration  判定时间,一般为 60 (帧)
  17.   # keys      按键,Input.trigger? 的参数的数组,当 order=true 时需要按顺序按下
  18.   # success   判定成功时执行的公共事件 id,可以为 0, 1 ... nil
  19.   # failure   判定失败时执行的公共事件 id,可以为 0, 1 ... nil
  20.   # order     是否需要按顺序按下
  21.   # &blk      每次刷新前可以查看当前帧数和每个按键的状态 (可用于制作 UI)
  22.   def qte!(duration=60, keys=[:C], success=nil, failure=nil, order=false, &blk)
  23.     @qte_event = {
  24.       timer:    0,
  25.       duration: duration,
  26.       keys:     keys,
  27.       success:  success,
  28.       failure:  failure,
  29.       flag:     false,
  30.       order:    order,
  31.       states:   Hash[keys.group_by {|k| k }.map {|k, v| [k, v.size] }],
  32.       block:    blk,
  33.     }
  34.     Fiber.yield while @qte_event
  35.   end
  36.   def update_qte_logic
  37.     i, s, d, b = @qte_event.values_at(:keys, :states, :duration, :block)
  38.     b.call(@qte_event[:timer], s) if b
  39.     ks = i.select {|k| s[k] > 0 }
  40.     ks = [ks.first] if @qte_event[:order]
  41.     unless s.values.all?(&:zero?) or @qte_event[:flag]
  42.       QTE_RESERVED_KEYS.each do |k|
  43.         if Input.trigger?(k)
  44.           if ks.include?(k)
  45.             i.delete_at(i.index(k))
  46.             s[k] -= 1
  47.           else
  48.             break @qte_event[:flag] = true
  49.           end
  50.         end
  51.       end
  52.     end
  53.     @qte_event[:timer] += 1
  54.     if @qte_event[:timer] >= d
  55.       t, f = @qte_event.values_at(:success, :failure)
  56.       if s.values.all?(&:zero?) and not @qte_event[:flag]
  57.         $game_temp.reserve_common_event(t) if t
  58.       else
  59.         $game_temp.reserve_common_event(f) if f
  60.       end
  61.       b.call(@qte_event[:timer], s) if b
  62.       @qte_event = nil
  63.     end
  64.   end
  65.   # 是否在 QTE 事件中
  66.   def qte?
  67.     !!@qte_event
  68.   end
  69.   attr_reader :qte_event
  70.   # 注释: QTE > 5
  71.   # 注释: QTE [5] 上 上 2 [5] 左 右 左 右 1 [5] true
  72.   QTE_ALIAS = {
  73.     /8|上|UP?/i        => :UP,
  74.     /2|下|D(?:OWN)?/i  => :DOWN,
  75.     /4|左|L(?:EFT)?/i  => :LEFT,
  76.     /6|右|R(?:IGHT)?/i => :RIGHT,
  77.     /1|一|A?/i         => :X,
  78.   }
  79.   alias qte_command_108 command_108
  80.   def command_108
  81.     qte_command_108
  82.     @comments.each do |comment|
  83.       if comment[/^QTE\s*>/]
  84.         @qte_record = comment.split('>')[1].to_i
  85.       elsif comment.start_with?("QTE")
  86.         comment.gsub!(/\[(\d+)\]/) { $game_variables[$1.to_i] }
  87.         a = comment.split
  88.         order = a[-1] == 'true'
  89.         a.pop if order
  90.         qte!(
  91.           a[1].to_i,
  92.           a[2..-3].map {|k|
  93.             r, x = QTE_ALIAS.find {|q, _| k[q] }
  94.             x = x.call(r.match(k)) if x.respond_to? :call
  95.             x
  96.           },
  97.           a[-2].to_i,
  98.           a[-1].to_i,
  99.           order
  100.         ) do |t, v|
  101.           if @qte_record and v.values.all?(&:zero?)
  102.             $game_variables[@qte_record] = t
  103.             @qte_record = nil
  104.           end
  105.         end
  106.       end
  107.     end
  108.   end
  109. end
  110. class Scene_Map
  111.   alias qte_logic_update update
  112.   def update
  113.     # 当处于 QTE 事件时,禁止各种按键响应事件,仅处理地图解释器
  114.     if $game_map.interpreter.qte?
  115.       super
  116.       $game_map.update(true)
  117.       @spriteset.update
  118.     else
  119.       qte_logic_update
  120.     end
  121.   end
  122. end

作者: 百里_飞柳    时间: 2022-1-13 21:41
额,如果要加入图片的话就有点麻烦(懒)

但如果直接调用 事件指令-画面闪烁 就很容易了
脚本 41 行开始
  1.     unless s.values.all?(&:zero?) or @qte_event[:flag]
  2.       QTE_RESERVED_KEYS.each do |k|
  3.         if Input.trigger?(k)
  4.           if ks.include?(k)
  5.             i.delete_at(i.index(k))
  6.             s[k] -= 1
  7.             # --------这里添加按键成功的处理--------
  8.             c = Color.new(255, 255, 255)  # 闪烁颜色,和事件指令中的RGB对应
  9.             t = 20   # 闪烁持续帧数
  10.             $game_map.screen.start_flash(c, t)
  11.             # 当然,这里没有那样的等待至闪烁结束
  12.             # --------------------------------------
  13.           else
  14.             # --------这里是失败的处理--------
  15.             c = Color.new(255, 0, 0)  # 闪烁颜色,和事件指令中的RGB对应
  16.             t = 20   # 闪烁持续帧数
  17.             $game_map.screen.start_flash(c, t)
  18.             # --------------------------------------
  19.             break @qte_event[:flag] = true
  20.           end
  21.         end
  22.       end
  23.     end
复制代码


作者: eruru    时间: 2022-1-13 22:20
百里_飞柳 发表于 2022-1-13 21:41
额,如果要加入图片的话就有点麻烦(懒)

但如果直接调用 事件指令-画面闪烁 就很容易了

成功了!!!非常感谢!还写了错误闪屏非常贴心




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1