查看: 2534|回复: 2

[已经解决] 求QTE和连打脚本插入【闪屏】效果的方法

[复制链接]
梦石
0
星屑
128
在线时间
13 小时
注册时间
2021-10-23
回帖
2
发表于 2022-1-13 13:31:10 | 显示全部楼层 |阅读模式

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

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

×

QTE和连打都是基于这位的脚本开发的
QQ图片20180806232550.png
https://rpg.blue/thread-409643-1-1.html
做完发现如果把QTE改成连续按某个键连打的话反馈感不够

现在想要实现每按一次按键就可以实现一次闪屏的效果   如下
6f28b8355b477b87c0809b081117c7b9 (2) (1) (1).gif

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

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


这里贴一下制作者提供的脚本
作者还附加了一个QTE UI用脚本  如果需要也可以贴上来
(不清楚能不能2此修改和开贴上传,如果该贴有冒犯到作者可以删除本贴)
[pre lang="ruby"]
class Game_Interpreter
  # QTE_RESERVED_KEYS: 仅扫描此列 QTE 按键
  # 在 QTE 事件中,若按下不正确的按键,视为失败
  QTE_RESERVED_KEYS = [
    :DOWN, :LEFT, :RIGHT, :UP,
    :A, :B, :C, :X, :Y, :Z, :L, :R,
    :SHIFT, :CTRL, :ALT,
    :F5, :F6, :F7, :F8, :F9
  ]
  alias qte_logic_update update
  def update
    qte_logic_update
    update_qte_logic if @qte_event
  end
  # qte!(60, [:C, :B], 1, 2, true) {|t, key_states|  }
  # duration  判定时间,一般为 60 (帧)
  # keys      按键,Input.trigger? 的参数的数组,当 order=true 时需要按顺序按下
  # success   判定成功时执行的公共事件 id,可以为 0, 1 ... nil
  # failure   判定失败时执行的公共事件 id,可以为 0, 1 ... nil
  # order     是否需要按顺序按下
  # &blk      每次刷新前可以查看当前帧数和每个按键的状态 (可用于制作 UI)
  def qte!(duration=60, keys=[:C], success=nil, failure=nil, order=false, &blk)
    @qte_event = {
      timer:    0,
      duration: duration,
      keys:     keys,
      success:  success,
      failure:  failure,
      flag:     false,
      order:    order,
      states:   Hash[keys.group_by {|k| k }.map {|k, v| [k, v.size] }],
      block:    blk,
    }
    Fiber.yield while @qte_event
  end
  def update_qte_logic
    i, s, d, b = @qte_event.values_at(:keys, :states, :duration, :block)
    b.call(@qte_event[:timer], s) if b
    ks = i.select {|k| s[k] > 0 }
    ks = [ks.first] if @qte_event[:order]
    unless s.values.all?(&:zero?) or @qte_event[:flag]
      QTE_RESERVED_KEYS.each do |k|
        if Input.trigger?(k)
          if ks.include?(k)
            i.delete_at(i.index(k))
            s[k] -= 1
          else
            break @qte_event[:flag] = true
          end
        end
      end
    end
    @qte_event[:timer] += 1
    if @qte_event[:timer] >= d
      t, f = @qte_event.values_at(:success, :failure)
      if s.values.all?(&:zero?) and not @qte_event[:flag]
        $game_temp.reserve_common_event(t) if t
      else
        $game_temp.reserve_common_event(f) if f
      end
      b.call(@qte_event[:timer], s) if b
      @qte_event = nil
    end
  end
  # 是否在 QTE 事件中
  def qte?
    !!@qte_event
  end
  attr_reader :qte_event
  # 注释: QTE > 5
  # 注释: QTE [5] 上 上 2 [5] 左 右 左 右 1 [5] true
  QTE_ALIAS = {
    /8|上|UP?/i        => :UP,
    /2|下|D(?:OWN)?/i  => :DOWN,
    /4|左|L(?:EFT)?/i  => :LEFT,
    /6|右|R(?:IGHT)?/i => :RIGHT,
    /1|一|A?/i         => :X,
  }
  alias qte_command_108 command_108
  def command_108
    qte_command_108
    @comments.each do |comment|
      if comment[/^QTE\s*>/]
        @qte_record = comment.split('>')[1].to_i
      elsif comment.start_with?("QTE")
        comment.gsub!(/\[(\d+)\]/) { $game_variables[$1.to_i] }
        a = comment.split
        order = a[-1] == 'true'
        a.pop if order
        qte!(
          a[1].to_i,
          a[2..-3].map {|k|
            r, x = QTE_ALIAS.find {|q, _| k[q] }
            x = x.call(r.match(k)) if x.respond_to? :call
            x
          },
          a[-2].to_i,
          a[-1].to_i,
          order
        ) do |t, v|
          if @qte_record and v.values.all?(&:zero?)
            $game_variables[@qte_record] = t
            @qte_record = nil
          end
        end
      end
    end
  end
end
class Scene_Map
  alias qte_logic_update update
  def update
    # 当处于 QTE 事件时,禁止各种按键响应事件,仅处理地图解释器
    if $game_map.interpreter.qte?
      super
      $game_map.update(true)
      @spriteset.update
    else
      qte_logic_update
    end
  end
end
[/pre]

老鹰

梦石
40
星屑
37812
在线时间
7091 小时
注册时间
2012-5-26
回帖
3297

极短24评委极短23参与极短22参与极短21评委老司机慢点开短篇十吟唱者组别冠军开拓者剧作品鉴家

发表于 2022-1-13 21:41:04 | 显示全部楼层
额,如果要加入图片的话就有点麻烦(懒)

但如果直接调用 事件指令-画面闪烁 就很容易了
脚本 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
复制代码

评分

参与人数 1星屑 +130 收起 理由
alexncf125 + 130 版主认可的优秀回答

查看全部评分

回复 1 0

使用道具 举报

梦石
0
星屑
128
在线时间
13 小时
注册时间
2021-10-23
回帖
2
 楼主| 发表于 2022-1-13 22:20:43 | 显示全部楼层
百里_飞柳 发表于 2022-1-13 21:41
额,如果要加入图片的话就有点麻烦(懒)

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

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

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部