Project1

标题: 小白提问,这个脚本怎么用,请大佬教教 [打印本页]

作者: 15120066641    时间: 2020-3-3 12:22
标题: 小白提问,这个脚本怎么用,请大佬教教
可以在不同的区设置不同的战斗前渐变效果吗?可以告诉一下吗?谢谢了


=begin

▼ 戦闘切り替えエフェクト ver. 3.0

RPGツクールVXAce用スクリプト

制作 : 木星ペンギン
URL  : http://woodpenguin.blog.fc2.com/

------------------------------------------------------------------------------
概要

□ 戦闘突入時のエフェクトをオリジナルのものにします。
  ・とにかく重いので、適当に調整してください。

□ 【オリジナルサブメニュー】と併用する場合、こちらを下にしてください。

------------------------------------------------------------------------------
使い方

□ フェードアウトエフェクト
  マップ画面から暗転までのエフェクトです。
  -1 : 暗転なし。
  0  : 通常のトランジションを行います。
  1  : 新たに設定したトランジションを行います。
  2  : 回転しながらアップになる演出を行います。
  3  : 幻影を残しながら、画面を縮小していきます。
  4  : いったん画面を縮小してから、プレイヤーを拡大します。
  5  : 波形描写を行います。
  6  : 画面を回転させながらぼかし効果を適用します。
  7  : 画面の拡大します。
  8  : 画面が割れて飛び散っていく演出を行います。
  9  : 画面が設定した方向から砕けていく演出を行います。

□ フェードインエフェクト
  暗転した状態から戦闘画面までのエフェクトです。
  0 : 通常のフェードインを行います。
  1 : 通常のトランジションを行います。
  2 : 新たに設定したトランジションを行います。
  3 : 波形描写を行います。
  4 : 画面が割れて飛び散っていく演出を行います。
  5 : 画面が設定した方向から砕けていく演出を行います。
  
=end
module WdTk
module PrBtEff
#//////////////////////////////////////////////////////////////////////////////
#
# 設定項目
#
#//////////////////////////////////////////////////////////////////////////////
=begin #---------------------------------------------------------------------

    ● エフェクト共通の設定項目の説明
      :rate     : エフェクトの更新レートです。
                  数値が大きいほどFPSは下がりますが、処理が軽くなります。
                  1 以上の数値を設定してください。
      :time     : エフェクトにかける時間を設定できます。
                  60 で 1 秒です。
      :fadeout  : 最後にフェードアウトをかける時間です。未設定の場合は30。
      :fadein   : 戦闘開始時にフェードインをかける時間です。未設定の場合は30。
      :color    : フェードアウト時の色です。未設定の場合は黒。
      
=end #-----------------------------------------------------------------------
  OUTEFF = Array.new(10) { {} }
  INEFF  = Array.new(6) { {} }
  #--------------------------------------------------------------------------
  # ● フェードアウト設定
  #     OUT_VARIABLE : 変数を使用するかどうか
  #     OUT_INDEX    :
  #       変数を使用する場合、この番号の変数の値がエフェクトの番号になる。
  #       変数を使用しない場合、この数値がそのままエフェクトの番号になる。
  #--------------------------------------------------------------------------
  OUT_VARIABLE = true
  OUT_INDEX = 2
  
  #--------------------------------------------------------------------------
  # ● フェードアウト : エフェクト 0 の設定
  #     通常のトランジションを行います。
  #--------------------------------------------------------------------------
  # 設定項目  [:time, :color]
  OUTEFF[0][:time] = 60
  
  #--------------------------------------------------------------------------
  # ● フェードアウト : エフェクト 1 の設定
  #     新たに設定したトランジションを行います。
  #     :name : トランジションのファイル名です。
  #--------------------------------------------------------------------------
  # 設定項目  [:time, :color, :name]
  OUTEFF[1][:time] = 30
  OUTEFF[1][:name] = "BattleStart"
  
  #--------------------------------------------------------------------------
  # ● フェードアウト : エフェクト 2 の設定
  #     回転しながらアップになる演出を行います。
  #--------------------------------------------------------------------------
  # 設定項目  [:rate, :time, :fadeout, :color]
  OUTEFF[2][:rate]    = 3
  OUTEFF[2][:time]    = 120
  
  #--------------------------------------------------------------------------
  # ● フェードアウト : エフェクト 3 の設定
  #     幻影を残しながら、画面を縮小していきます。
  #     :dir   : 縮小をする方向です。テンキーの位置で指定します。
  #     :blur  : ブレの強さです。
  #     :angle : 回転角度です。
  #--------------------------------------------------------------------------
  # 設定項目  [:rate, :time, :fadeout, :color, :dir, :blur, :angle]
  OUTEFF[3][:rate]    = 2
  OUTEFF[3][:time]    = 90
  OUTEFF[3][:dir]     = 7
  OUTEFF[3][:blur]    = 16
  OUTEFF[3][:angle]   = 30
  
  #--------------------------------------------------------------------------
  # ● フェードアウト : エフェクト 4 の設定
  #     いったん画面を縮小してから、プレイヤーを拡大します。
  #     :angle : 回転角度です。
  #--------------------------------------------------------------------------
  # 設定項目  [:rate, :time, :fadeout, :color, :angle]
  OUTEFF[4][:rate]    = 3
  OUTEFF[4][:time]    = 120
  OUTEFF[4][:angle]   = 30
  
  #--------------------------------------------------------------------------
  # ● フェードアウト : エフェクト 5 の設定
  #     波形描写を行います。
  #     :amp    : 波形の振幅です。
  #     :length : 波形の周期です。
  #--------------------------------------------------------------------------
  # 設定項目  [:rate, :time, :fadeout, :color, :amp, :length]
  OUTEFF[5][:rate]    = 1
  OUTEFF[5][:time]    = 120
  OUTEFF[5][:amp]     = 64
  OUTEFF[5][:length]  = 60
  
  #--------------------------------------------------------------------------
  # ● フェードアウト : エフェクト 6 の設定
  #     画面を回転させながらぼかし効果を適用します。
  #--------------------------------------------------------------------------
  # 設定項目  [:rate, :time, :fadeout, :color]
  OUTEFF[6][:rate]    = 4
  OUTEFF[6][:time]    = 100
  
  #--------------------------------------------------------------------------
  # ● フェードアウト : エフェクト 7 の設定
  #     画面の拡大します。
  #--------------------------------------------------------------------------
  # 設定項目  [:rate, :time, :fadeout, :color]
  OUTEFF[7][:rate]    = 1
  OUTEFF[7][:time]    = 12
  OUTEFF[7][:fadeout] = 10
  OUTEFF[7][:color]   = Color.new(255, 255, 255)
  
  #--------------------------------------------------------------------------
  # ● フェードアウト : エフェクト 8 の設定
  #     画面が割れて飛び散っていく演出を行います。
  #     :side   : 画面を横に分割する数です。縦も同じ長さに設定されます。
  #--------------------------------------------------------------------------
  # 設定項目  [:rate, :time, :fadeout, :color, :side]
  OUTEFF[8][:rate]    = 1
  OUTEFF[8][:time]    = 180
  OUTEFF[8][:side]    = 12
  
  #--------------------------------------------------------------------------
  # ● フェードアウト : エフェクト 9 の設定
  #     画面が設定した方向から砕けていく演出を行います。
  #     :side   : 画面を横に分割する数です。縦も同じ長さに設定されます。
  #     :dir    : 画面が砕けていく方向。テンキーの位置(2, 4, 6, 8)で指定します。
  #--------------------------------------------------------------------------
  # 設定項目  [:rate, :time, :fadeout, :color, :side, :dir]
  OUTEFF[9][:rate]    = 1
  OUTEFF[9][:time]    = 100
  OUTEFF[9][:side]    = 17
  OUTEFF[9][:dir]     = 4
  
  
  #--------------------------------------------------------------------------
  # ● フェードイン設定
  #     IN_VARIABLE : 変数を使用するかどうか
  #     IN_INDEX    :
  #       変数を使用する場合、この番号の変数の値がエフェクトの番号になる。
  #       変数を使用しない場合、この数値がそのままエフェクトの番号になる。
  #--------------------------------------------------------------------------
  IN_VARIABLE = true
  IN_INDEX = 3
  
  #--------------------------------------------------------------------------
  # ● フェードイン : エフェクト 0 の設定
  #     通常のフェードインを行います。
  #--------------------------------------------------------------------------
  # 設定項目  [:time]
  INEFF[0][:time] = 10
  
  #--------------------------------------------------------------------------
  # ● フェードイン : エフェクト 1 の設定
  #     通常のトランジションを行います。
  #--------------------------------------------------------------------------
  # 設定項目  [:time]
  INEFF[1][:time] = 15
  
  #--------------------------------------------------------------------------
  # ● フェードイン : エフェクト 2 の設定
  #     新たに設定したトランジションを行います。
  #     :name : トランジションのファイル名です。
  #--------------------------------------------------------------------------
  # 設定項目  [:time, :name]
  INEFF[2][:time] = 15
  INEFF[2][:name] = "BattleStart"
  
  #--------------------------------------------------------------------------
  # ● フェードイン : エフェクト 3 の設定
  #     波形描写を行います。
  #     :amp    : 波形の振幅です。
  #     :length : 波形の周期です。
  #--------------------------------------------------------------------------
  # 設定項目  [:rate, :time, :fadein, :color, :amp, :length]
  INEFF[3][:rate]   = 1
  INEFF[3][:time]   = 80
  INEFF[3][:amp]    = 64
  INEFF[3][:length] = 60
  
  #--------------------------------------------------------------------------
  # ● フェードイン : エフェクト 4 の設定
  #     画面が割れて飛び散っていく演出を行います。
  #     :side   : 画面を横に分割する数です。縦も同じ長さに設定されます。
  #--------------------------------------------------------------------------
  # 設定項目  [:rate, :time, :fadein, :color, :side]
  INEFF[4][:rate]   = 1
  INEFF[4][:time]   = 150
  INEFF[4][:fadein] = 150
  INEFF[4][:side]   = 12
  
  #--------------------------------------------------------------------------
  # ● フェードイン : エフェクト 5 の設定
  #     画面が設定した方向から砕けていく演出を行います。
  #     :side   : 画面を横に分割する数です。縦も同じ長さに設定されます。
  #     :dir    : 画面が砕けていく方向。テンキーの位置(2, 4, 6, 8)で指定します。
  #--------------------------------------------------------------------------
  # 設定項目  [:rate, :time, :fadein, :color, :side, :dir]
  INEFF[5][:rate]   = 1
  INEFF[5][:time]   = 100
  INEFF[5][:fadein] = 100
  INEFF[5][:side]   = 17
  INEFF[5][:dir]    = 4
  
  
#//////////////////////////////////////////////////////////////////////////////
#
# 以降、変更する必要なし
#
#//////////////////////////////////////////////////////////////////////////////

  def self.snapshot_for_effect
    @effect_bitmap = Graphics.snap_to_bitmap
  end
  def self.dispose_effect_bitmap
    @effect_bitmap.dispose if @effect_bitmap
    @effect_bitmap = nil
  end
  #--------------------------------------------------------------------------
  # ● ビューポートの作成
  #--------------------------------------------------------------------------
  def self.create_main_viewport
    @viewport = Viewport.new
    @viewport.z = 500
  end
  #--------------------------------------------------------------------------
  # ● ビューポートの解放
  #--------------------------------------------------------------------------
  def self.dispose_main_viewport
    @viewport.dispose
    @viewport = nil
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新(フェードアウト用)
  #--------------------------------------------------------------------------
  def self.update_fadeout(i, d)
    Graphics.update
    @viewport.color.alpha = 255 - 255 * (180 - i) / d if d > 0
    @viewport.update
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新(フェードイン用)
  #--------------------------------------------------------------------------
  def self.update_fadein(i, d)
    @viewport2.color.alpha = 255 - 255 * i / d if d > 0
    Graphics.update
  end
  #--------------------------------------------------------------------------
  # ● フェードアウト実行
  #--------------------------------------------------------------------------
  def self.perform_fadeout
    index = OUT_VARIABLE ? $game_variables[OUT_INDEX] : OUT_INDEX
    params = OUTEFF[index]
    return fadeout_transition({}) unless params
    return if index < 0
    return fadeout_transition(params) if index == 0 || index == 1
    create_main_viewport
    @viewport.color.set(params[:color]) if params[:color]
    @viewport.color.alpha = 0
    effect_sprites = []
    Graphics.transition(0)
    Graphics.frame_rate = 60 / params[:rate]
    step = params[:rate] * 180.0 / params[:time]
    dur = 180 * (params[:fadeout] || 30) / params[:time]
    case index
    when 2
      0.step(180, step) do |i|
        sprite = make_effect_sprite1
        sprite.angle = 2 * i
        sprite.opacity = (i == 0 ? 255 : params[:rate] * 8 + 8)
        update_effect_size(sprite, 1.0 + 0.01 * i)
        effect_sprites << sprite
        update_fadeout(i, dur)
      end
    when 3
      type = params[:dir] - 1
      tx = Graphics.width  * (type % 3 == 0 ? 1 : type % 3 == 2 ? 5 : 3) / 6
      ty = Graphics.height * (type / 3 == 0 ? 5 : type / 3 == 2 ? 1 : 3) / 6
      opacity = params[:rate] * 8 + 16
      0.step(180, step) do |i|
        if effect_sprites.size > params[:blur]
          sprite = effect_sprites.shift
        else
          sprite = make_effect_sprite1
        end
        sprite.x = Graphics.width / 2 - (Graphics.width / 2 - tx) * i / 180
        sprite.y = Graphics.height / 2 - (Graphics.height / 2 - ty) * i / 180
        sprite.z = i
        sprite.angle = params[:angle] * i / 180
        d = (i > 90 ? (180 - i) : 90)
        sprite.opacity = (255 - i) * d / 90
        effect_sprites.last.opacity = opacity * d / 90 unless effect_sprites.empty?
        update_effect_size(sprite, 0.2 + 0.8 * (180 - i) ** 2 / 180 ** 2)
        effect_sprites << sprite
        update_fadeout(i, dur)
      end
    when 4
      tx = $game_player.screen_x
      ty = $game_player.screen_y - 20
      opacity = params[:rate] * 8 + 8
      0.step(180, step) do |i|
        sprite = make_effect_sprite1
        sprite.x = tx + (Graphics.width / 2 - tx) * i / 180
        sprite.y = ty + (Graphics.height / 2 - ty) * i / 180
        sprite.z = i
        sprite.ox = tx
        sprite.oy = ty
        sprite.angle = params[:angle] * i / 180
        sprite.opacity = (i == 0 ? 255 : opacity)
        m = 60 ** 2 - 30 ** 2 + (30 - i) ** 2
        update_effect_size(sprite, 1.0 * m / 60 ** 2, 1.2)
        effect_sprites << sprite
        update_fadeout(i, dur)
      end
    when 5
      effect_sprites << make_effect_sprite1 << make_effect_sprite1
      effect_sprites[1].opacity = 64
      effect_sprites[1].wave_length = params[:length]
      0.step(180, step) do |i|
        d = 180 ** 2 - (180 - i) ** 2
        effect_sprites[1].wave_amp = params[:amp] * d / 180 ** 2
        effect_sprites[1].wave_speed = i * 5
        effect_sprites[1].opacity += 1
        effect_sprites[1].update
        update_fadeout(i, dur)
      end
    when 6
      effect_sprites << make_effect_sprite1
      0.step(180, step) do |i|
        @effect_bitmap.radial_blur(i / 3, 1)
        update_fadeout(i, dur)
      end
    when 7
      effect_sprites << make_effect_sprite1
      0.step(180, step) do |i|
        sprite = make_effect_sprite1
        sprite.opacity = 32
        sprite.zoom_x = sprite.zoom_y = 1.0 + 2.0 * i / 180
        effect_sprites << sprite
        update_fadeout(i, dur)
      end
    when 8
      effect_data = {}
      max = 32 * params[:time] / 180
      make_break_sprites1(params[:side]).each do |sprite|
        effect_sprites << sprite
        effect_data[sprite] = make_effect_data1(sprite, max)
      end
      Graphics.wait(8)
      0.step(180, step) do |i|
        update_break_effect1(effect_data, params[:time], i)
        update_fadeout(i, dur)
      end
    when 9
      effect_data = {}
      max = 24 * params[:time] / 180
      make_break_sprites1(params[:side]).each do |sprite|
        effect_sprites << sprite
        effect_data[sprite] = make_effect_data2(sprite, max, params[:dir])
      end
      0.step(180, step) do |i|
        update_break_effect2(effect_data, i, params[:dir])
        update_fadeout(i, dur)
      end
    end
    snapshot_for_effect
    Graphics.freeze
    Graphics.frame_rate = 60
    dispose_main_viewport
    effect_sprites.each {|sprite| sprite.dispose }
  end
  #--------------------------------------------------------------------------
  # ● フェードイン実行
  #--------------------------------------------------------------------------
  def self.perform_fadein
    return unless @effect_bitmap
    index = IN_VARIABLE ? $game_variables[IN_INDEX] : IN_INDEX
    params = INEFF[index]
    return Graphics.transition(10) unless params
    return Graphics.transition(params[:time]) if index == 0
    if index == 1 || index == 2
      name = params[:name] || "BattleStart"
      Graphics.transition(params[:time], "Graphics/System/" << name, 100)
      return
    end
    create_main_viewport
    @viewport2 = Viewport.new
    @viewport2.z = 450
    @viewport2.color.set(params[:color]) if params[:color]
    @viewport2.color.alpha = 0
    Graphics.transition(0)
    Graphics.frame_rate = 60 / params[:rate]
    effect_sprites = []
    step = params[:rate] * 180.0 / params[:time]
    dur = 180 * (params[:fadein] || 30) / params[:time]
    case index
    when 3
      effect_sprites << make_back_sprite(@viewport2)
      effect_sprites[0].wave_length = params[:length]
      effect_sprites << make_effect_sprite1
      effect_sprites[1].z += 1
      0.step(180, step) do |i|
        m = 180 ** 2
        d = m - i ** 2
        effect_sprites[0].wave_amp = params[:amp] * d / m
        effect_sprites[0].wave_speed = (180 - i) * 5
        effect_sprites[0].opacity = (180 - i) * 3 / 2
        effect_sprites[0].update
        effect_sprites[1].opacity = 255 - 255 * i / 60
        update_fadein(i, dur)
      end
    when 4
      effect_data = {}
      max = 32 * params[:time] / 180
      make_break_sprites1(params[:side]).each do |sprite|
        effect_sprites << sprite
        effect_data[sprite] = make_effect_data1(sprite, max)
      end
      0.step(180, step) do |i|
        update_break_effect1(effect_data, params[:time], i)
        effect_data.each_key {|sprite| sprite.opacity = (180 - i) * 4 }
        update_fadein(i, dur)
      end
    when 5
      effect_data = {}
      max = 24 * params[:time] / 180
      make_break_sprites1(params[:side]).each do |sprite|
        effect_sprites << sprite
        effect_data[sprite] = make_effect_data2(sprite, max, params[:dir])
      end
      0.step(180, step) do |i|
        update_break_effect2(effect_data, i, params[:dir])
        effect_data.each_key {|sprite| sprite.opacity = (180 - i) * 8 }
        update_fadein(i, dur)
      end
    end
    dispose_main_viewport
    @viewport2.dispose
    dispose_effect_bitmap
    effect_sprites.each {|sprite| sprite.dispose }
    Graphics.frame_rate = 60
    Graphics.frame_reset
  end
  #--------------------------------------------------------------------------
  # ● エフェクトスプライトの作成 1
  #--------------------------------------------------------------------------
  def self.make_effect_sprite1
    sprite = Sprite.new(@viewport)
    sprite.bitmap = @effect_bitmap
    sprite.x = sprite.ox = Graphics.width / 2
    sprite.y = sprite.oy = Graphics.height / 2
    sprite
  end
  #--------------------------------------------------------------------------
  # ● エフェクトの大きさ設定
  #--------------------------------------------------------------------------
  def self.update_effect_size(sprite, zoom, rate = 1.0)
    sprite.zoom_x = sprite.zoom_y = zoom
    if zoom > 1
      w =  (@effect_bitmap.width / zoom * rate).to_i / 2
      h =  (@effect_bitmap.height / zoom * rate).to_i / 2
      cx = [sprite.ox - w, 0].max
      cy = [sprite.oy - h, 0].max
      cw = [sprite.ox + w, @effect_bitmap.width].min - cx
      ch = [sprite.oy + h, @effect_bitmap.height].min - cy
      sprite.ox += sprite.src_rect.x - cx
      sprite.oy += sprite.src_rect.y - cy
      sprite.src_rect.set(cx, cy, cw, ch)
      Graphics.frame_reset
    end
  end
  #--------------------------------------------------------------------------
  # ● 画面破壊用エフェクト準備 1
  #--------------------------------------------------------------------------
  def self.make_break_sprites1(side)
    sprites = []
    rect = Rect.new
    height = Graphics.width / side
    row = (Graphics.height + height / 2) / height
    side.times do |x| row.times do |y|
      rect.x = Graphics.width * x / side
      rect.y = Graphics.height * y / row
      rect.width = Graphics.width * (x + 1) / side - rect.x
      rect.height = Graphics.height * (y + 1) / row - rect.y
      sprites << make_effect_sprite2(rect, 0)
      sprites << make_effect_sprite2(rect, 2)
    end; end
    Graphics.frame_reset
    sprites
  end
  #--------------------------------------------------------------------------
  # ● エフェクトスプライトの作成 2
  #--------------------------------------------------------------------------
  def self.make_effect_sprite2(rect, pos)
    sprite = Sprite.new(@viewport)
    sprite.bitmap = Bitmap.new(rect.width, rect.height)
    sprite.bitmap.blt(0, 0, @effect_bitmap, rect)
    d = [rect.width, rect.height].max
    if pos == 0
      d.times {|i| sprite.bitmap.clear_rect(rect.width * (d - i) / d, i, i, 1) }
    else
      d.times {|i| sprite.bitmap.clear_rect(0, i, rect.width * (d - i) / d, 1) }
    end
    sprite.ox = rect.width * (pos + 1) / 4
    sprite.oy = rect.height * (pos + 1) / 4
    sprite.x = rect.x + sprite.ox
    sprite.y = rect.y + sprite.oy
    sprite
  end
  #--------------------------------------------------------------------------
  # ● 背景スプライトの作成
  #--------------------------------------------------------------------------
  def self.make_back_sprite(viewport)
    sprite = Sprite.new(viewport)
    sprite.bitmap = Graphics.snap_to_bitmap
    sprite
  end
  #--------------------------------------------------------------------------
  # ● エフェクトデータの作成 1
  #--------------------------------------------------------------------------
  def self.make_effect_data1(sprite, max)
    result = [rand(3)] # ウェイト
    sx = sprite.x - Graphics.width / 2
    sy = sprite.y - Graphics.height / 2
    result[1] = Math.asin(1 - Math.hypot(sx, sy) / 360) * rand(6) ** 2 / 10 + 1 # 拡大率
    rate = 3.5
    result[1] = rate = 20.0 if result[1] > 2.5 && rand(3) == 0
    result[2] = (sx - rand(17) + 8) * rate + Graphics.width / 2 # 移動先 X
    result[3] = sprite.x - result[2] # X 軸移動距離
    result[4] = (sy - rand(13) + 6) * rate + Graphics.height / 2 # 移動先 Y
    result[5] = sprite.y - result[4] # Y 軸移動距離
    result[6] = (rand(max) + 1) * (rand(2) == 0 ? 1 : -1) / 4.0 # 回転
    result[7] = (rand(max) + 1) * (rand(2) == 0 ? 1 : -1) / 4.0 # X 軸回転
    result[8] = rand(max + 1) * (rand(2) == 0 ? 1 : -1) / 4.0 # Y 軸回転
    result[9] = sprite.ox # X 軸原点記憶
    result
  end
  #--------------------------------------------------------------------------
  # ● 破壊エフェクトの更新 1
  #--------------------------------------------------------------------------
  def self.update_break_effect1(effect_data, time, i)
    if i < 90
      d = (45 ** 2 - (i - 45) ** 2) / 40
    else
      d = (90 - i) * 2
    end
    d *= time / 180.0
    effect_data.each do |sprite, data|
      m = i - data[0]
      next if m <= 0
      zoom = data[1] - (data[1] - 1) * (179 - m) ** 2 / 180 ** 2
      next sprite.visible = false if zoom > 6
      sprite.x = data[2] + data[3] * (179 - m) ** 2 / 180 ** 2
      sprite.y = data[4] + data[5] * (179 - m) ** 2 / 180 ** 2
      sprite.y -= d * zoom if data[1] < 16
      sprite.z = data[1] * 100
      spin_set_sprite(sprite, m, zoom, data)
    end
  end
  #--------------------------------------------------------------------------
  # ● スプライト回転
  #--------------------------------------------------------------------------
  def self.spin_set_sprite(sprite, i, zoom, data)
    zoom_x = zoom * Math.cos(i * data[7] * Math::PI / 180)
    zoom_y = zoom * Math.cos(i * data[8] * Math::PI / 180)
    sprite.mirror = (zoom_x < 0) != (zoom_y < 0)
    sprite.ox = sprite.mirror ? sprite.width - data[9] : data[9]
    sprite.zoom_x = zoom_x.abs
    sprite.zoom_y = zoom_y.abs
    sprite.angle = i * data[6] + (zoom_y < 0 ? 180 : 0)
  end
  #--------------------------------------------------------------------------
  # ● エフェクトデータの作成 2
  #--------------------------------------------------------------------------
  def self.make_effect_data2(sprite, max, dir)
    result = []
    case dir
    when 2; wait = 90 - 90 * sprite.y / Graphics.height
    when 4; wait = 90 * sprite.x / Graphics.width
    when 6; wait = 90 - 90 * sprite.x / Graphics.width
    when 8; wait = 90 * sprite.y / Graphics.height
    end
    result[0] = wait + rand(5) - 5 # ウェイト
    sx = sprite.x - Graphics.width / 2
    sy = sprite.y - Graphics.height / 2
    rate = 2.0 - result[0] / 90.0
    result[1] = 1.5 # 拡大率
    result[2] = sprite.x # 現在 X
    result[4] = sprite.y # 現在 Y
    case dir
    when 2
      result[3] = (sprite.x - Graphics.width / 2) / 2 # X 軸移動距離
      result[5] = Graphics.height * rate # Y 軸移動距離
    when 4
      result[3] = -Graphics.width * rate # X 軸移動距離
      result[5] = (sprite.y - Graphics.height / 2) / 2 # Y 軸移動距離
    when 6
      result[3] = Graphics.width * rate # X 軸移動距離
      result[5] = (sprite.y - Graphics.height / 2) / 2 # Y 軸移動距離
    when 8
      result[3] = (sprite.x - Graphics.width / 2) / 2 # X 軸移動距離
      result[5] = -Graphics.height * rate # Y 軸移動距離
    end
    result[6] = (rand(max) + 1) * (rand(2) == 0 ? 1 : -1) / 4.0 # 回転
    result[7] = (rand(max) + 1) * (rand(2) == 0 ? 1 : -1) / 4.0 # X 軸回転
    result[8] = rand(max + 1) * (rand(2) == 0 ? 1 : -1) / 4.0 # Y 軸回転
    result[9] = sprite.ox # X 軸原点記憶
    result
  end
  #--------------------------------------------------------------------------
  # ● 破壊エフェクトの更新 2
  #--------------------------------------------------------------------------
  def self.update_break_effect2(effect_data, i, dir)
    effect_data.each do |sprite, data|
      m = i - data[0]
      next if m <= 0
      next sprite.visible = false if m > 90
      zoom = data[1] - (data[1] - 1) * (90 - m) ** 2 / 90 ** 2
      next sprite.visible = false if zoom > 6
      case dir
      when 2, 8
        sprite.x = data[2] + data[3] * m / 90
        sprite.y = data[4] + data[5] * m ** 2 / 90 ** 2
      when 4, 6
        sprite.x = data[2] + data[3] * m ** 2 / 90 ** 2
        sprite.y = data[4] + data[5] * m / 90
      end
      spin_set_sprite(sprite, m, zoom, data)
    end
  end
  #--------------------------------------------------------------------------
  # ● 画面破壊用エフェクト準備 2
  #--------------------------------------------------------------------------
  def self.make_break_sprites2
    base = [$game_player.screen_x, $game_player.screen_y - 20]
    pos_data = []
    r = 2 * Math::PI / 8
    8.times do |i|
      radian = r * i
      pos = base
      begin
        d = rand(100) + 50
        r2 = radian + radian * (rand * 0.8 - 0.4)
        pos[0] -= d * Math.sin(r2)
        pos[1] -= d * Math.cos(r2)
        
        
      end while pos[0].between?(0, Graphics.width) &&
                pos[1].between?(0, Graphics.height)
    end
   
    sprites = []
    sprites
  end
  #--------------------------------------------------------------------------
  # ● トランジション実行 [フェードアウト]
  #--------------------------------------------------------------------------
  def self.fadeout_transition(params)
    d     = params[:time] || 60
    name  = params[:name] || "BattleStart"
    color = params[:color] || Color.new(0, 0, 0, 255)
    create_main_viewport
    @viewport.color.set(color)
    Graphics.transition(d, "Graphics/System/" << name, 100)
    Graphics.freeze
    snapshot_for_effect
    dispose_main_viewport
  end
end

  @material ||= []
  @material << :PrBtEff
  def self.include?(sym)
    @material.include?(sym)
  end

end

#==============================================================================
# ■ Scene_Map
#==============================================================================
class Scene_Map
  #--------------------------------------------------------------------------
  # ◯ 終了前処理
  #--------------------------------------------------------------------------
  alias _wooden_prebteff_pre_terminate pre_terminate
  def pre_terminate
    WdTk::PrBtEff.snapshot_for_effect if SceneManager.scene_is?(Scene_Battle)
    _wooden_prebteff_pre_terminate
  end
  #--------------------------------------------------------------------------
  # ☆ 戦闘前トランジション実行
  #--------------------------------------------------------------------------
  def perform_battle_transition
    WdTk::PrBtEff.perform_fadeout
  end
end

#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle
  #--------------------------------------------------------------------------
  # ☆ トランジション実行
  #--------------------------------------------------------------------------
  def perform_transition
    return if $BTEST
    WdTk::PrBtEff.perform_fadein
    WdTk::PrBtEff.dispose_effect_bitmap
    GC.start
  end
end

if WdTk.include?(:SubMenu)
#==============================================================================
# ■ Scene_ExSubMenu
#==============================================================================
class Scene_ExSubMenu
  #--------------------------------------------------------------------------
  # ◯ 終了前処理
  #--------------------------------------------------------------------------
  alias _wooden_prebteff_pre_terminate pre_terminate
  def pre_terminate
    WdTk::PrBtEff.snapshot_for_effect if SceneManager.scene_is?(Scene_Battle)
    _wooden_prebteff_pre_terminate
  end
  #--------------------------------------------------------------------------
  # ☆ 戦闘前トランジション実行
  #--------------------------------------------------------------------------
  def perform_battle_transition
    WdTk::PrBtEff.perform_fadeout
  end
end
end
作者: Nil2018    时间: 2020-3-3 13:27
给你个汉化【签名档】
使用方法自己琢磨
  1. =begin

  2. ▼ 特殊战斗渐变 ver. 3.0

  3. RPGツクールVXAce用スクリプト

  4. 制作 : 木星ペンギン
  5. URL  : http://woodpenguin.blog.fc2.com/

  6. ------------------------------------------------------------------------------
  7. 介绍

  8. □ 增加新的战斗渐变效果。

  9. □ 若你还使用了脚本【オリジナルサブメニュー】请将本脚本放在其之下。

  10. ------------------------------------------------------------------------------
  11. 使用方法

  12. □ 淡出效果
  13.   由地图画面切换到全黑这一过程之间的效果。
  14.   -1 : 无渐变。
  15.   0  : 显示默认的渐变图片。
  16.   1  : 显示一个新设定的渐变图片。
  17.   2  : 一边旋转一边扩大。
  18.   3  : 显示残影然后缩小画面。
  19.   4  : 地图画面缩小,玩家画面放大。
  20.   5  : 波浪效果。
  21.   6  : 画面旋转。
  22.   7  : 放大画面。
  23.   8  : 画面破碎四溅效果。
  24.   9  : 画面朝一个方向逐渐破碎。

  25. □ 淡入效果
  26.   由全黑切换到战斗画面这一过程之间的效果。
  27.   0 : 显示默认的淡入效果。
  28.   1 : 显示默认的渐变图片。
  29.   2 : 显示一个新设定的渐变图片。
  30.   3 : 波浪效果。
  31.   4 : 画面破碎四溅效果。
  32.   5 : 画面朝一个方向逐渐破碎。
  33.   
  34. =end
  35. module WdTk
  36. module PrBtEff
  37. #//////////////////////////////////////////////////////////////////////////////
  38. #
  39. # 设定部分
  40. #
  41. #//////////////////////////////////////////////////////////////////////////////
  42. =begin #---------------------------------------------------------------------

  43.     ● 通用设定项目的解释
  44.       :rate     : 效果的更新率。
  45.                   数值越大FPS越小、处理越轻便。
  46.                   必须设定为1以上的数值。
  47.                   
  48.       :time     : 效果持续的时间,单位是帧。
  49.                   60 帧 = 1 秒。
  50.                   
  51.       :fadeout  : 淡出效果的持续时间,未设定的话默认为30。
  52.       
  53.       :fadein   : 淡入效果的持续时间,未设定的话默认为30。
  54.       
  55.       :color    : 淡出效果结束时画面的颜色,未设定的话默认为全黑。
  56.       
  57. =end #-----------------------------------------------------------------------
  58.   OUTEFF = Array.new(10) { {} }
  59.   INEFF  = Array.new(6) { {} }
  60.   #--------------------------------------------------------------------------
  61.   # ● 淡出设定
  62.   #     OUT_VARIABLE : 是否启用变量
  63.   #     OUT_INDEX    :
  64.   #       启用变量时、设定的数字代表变量的ID,此变量用于存储淡出效果的类型。
  65.   #       禁用变量时、设定的数字代表淡出效果的类型。
  66.   #--------------------------------------------------------------------------
  67.   OUT_VARIABLE = false
  68.   OUT_INDEX = 4
  69.   
  70.   #--------------------------------------------------------------------------
  71.   # ● 淡出 : 效果 0 的设定
  72.   #     显示默认渐变图片。
  73.   #--------------------------------------------------------------------------
  74.   # 设定项目  [:time, :color]
  75.   OUTEFF[0][:time] = 60
  76.   
  77.   #--------------------------------------------------------------------------
  78.   # ● 淡出 : 效果 1 的设定
  79.   #     显示新设定的渐变图片。
  80.   #     :name : 新渐变图片的文件名。
  81.   #--------------------------------------------------------------------------
  82.   # 设定项目  [:time, :color, :name]
  83.   OUTEFF[1][:time] = 30
  84.   OUTEFF[1][:name] = "BattleStart"
  85.   
  86.   #--------------------------------------------------------------------------
  87.   # ● 淡出 : 效果 2 的设定
  88.   #     一边旋转一边扩大。
  89.   #--------------------------------------------------------------------------
  90.   # 设定项目  [:rate, :time, :fadeout, :color]
  91.   OUTEFF[2][:rate]    = 3
  92.   OUTEFF[2][:time]    = 60
  93.   
  94.   #--------------------------------------------------------------------------
  95.   # ● 淡出 : 效果 3 的设定
  96.   #     显示残影然后缩小画面。
  97.   #     :dir   : 缩小的方向。设定数字与由小键盘的方向相对应。
  98.   #     :blur  : 模糊强度。
  99.   #     :angle : 旋转角度。
  100.   #--------------------------------------------------------------------------
  101.   # 设定项目  [:rate, :time, :fadeout, :color, :dir, :blur, :angle]
  102.   OUTEFF[3][:rate]    = 2
  103.   OUTEFF[3][:time]    = 60
  104.   OUTEFF[3][:dir]     = 7
  105.   OUTEFF[3][:blur]    = 16
  106.   OUTEFF[3][:angle]   = 30
  107.   
  108.   #--------------------------------------------------------------------------
  109.   # ● 淡出 : 效果 4 的设定
  110.   #     地图画面缩小,玩家画面放大。
  111.   #     :angle :  旋转角度。
  112.   #--------------------------------------------------------------------------
  113.   # 设定项目  [:rate, :time, :fadeout, :color, :angle]
  114.   OUTEFF[4][:rate]    = 2
  115.   OUTEFF[4][:time]    = 120
  116.   OUTEFF[4][:angle]   = 30
  117.   
  118.   #--------------------------------------------------------------------------
  119.   # ● 淡出 : 效果 5 的设定
  120.   #     波浪效果。
  121.   #     :amp    : 波形的振幅。
  122.   #     :length : 波形的周期。
  123.   #--------------------------------------------------------------------------
  124.   # 设定项目  [:rate, :time, :fadeout, :color, :amp, :length]
  125.   OUTEFF[5][:rate]    = 1
  126.   OUTEFF[5][:time]    = 60
  127.   OUTEFF[5][:amp]     = 64
  128.   OUTEFF[5][:length]  = 60
  129.   
  130.   #--------------------------------------------------------------------------
  131.   # ● 淡出 : 效果 6 的设定
  132.   #     画面旋转。
  133.   #--------------------------------------------------------------------------
  134.   # 设定项目  [:rate, :time, :fadeout, :color]
  135.   OUTEFF[6][:rate]    = 4
  136.   OUTEFF[6][:time]    = 60
  137.   
  138.   #--------------------------------------------------------------------------
  139.   # ● 淡出 : 效果 7 的设定
  140.   #     放大画面。
  141.   #--------------------------------------------------------------------------
  142.   # 设定项目  [:rate, :time, :fadeout, :color]
  143.   OUTEFF[7][:rate]    = 1
  144.   OUTEFF[7][:time]    = 60
  145.   OUTEFF[7][:fadeout] = 10
  146.   OUTEFF[7][:color]   = Color.new(255, 255, 255)
  147.   
  148.   #--------------------------------------------------------------------------
  149.   # ● 淡出 : 效果 8 的设定
  150.   #     画面破碎四溅效果。
  151.   #     :side   : 水平和纵向分割画面的数值,数值越大,碎片越多。
  152.   #--------------------------------------------------------------------------
  153.   # 设定项目  [:rate, :time, :fadeout, :color, :side]
  154.   OUTEFF[8][:rate]    = 1
  155.   OUTEFF[8][:time]    = 60
  156.   OUTEFF[8][:side]    = 6
  157.   
  158.   #--------------------------------------------------------------------------
  159.   # ● 淡出 : 效果 9 的设定
  160.   #     画面朝一个方向逐渐破碎。
  161.   #     :side   : 水平和纵向分割画面的数值,数值越大,碎片越多。
  162.   #     :dir    : 碎片朝哪个方向移动。设定数字与由小键盘的方向(2, 4, 6, 8)相对应。
  163.   #--------------------------------------------------------------------------
  164.   # 设定项目  [:rate, :time, :fadeout, :color, :side, :dir]
  165.   OUTEFF[9][:rate]    = 1
  166.   OUTEFF[9][:time]    = 60
  167.   OUTEFF[9][:side]    = 17
  168.   OUTEFF[9][:dir]     = 4
  169.   
  170.   
  171.   #--------------------------------------------------------------------------
  172.   # ● 淡入設定
  173.   #     IN_VARIABLE : 是否启用变量
  174.   #     IN_INDEX    :
  175.   #       启用变量时、设定的数字代表变量的ID,此变量用于存储淡出效果的类型。
  176.   #       禁用变量时、设定的数字代表淡出效果的类型。
  177.   #--------------------------------------------------------------------------
  178.   IN_VARIABLE = true
  179.   IN_INDEX = 82
  180.   
  181.   #--------------------------------------------------------------------------
  182.   # ● 淡入 : 效果 0 的设定
  183.   #     普通的淡入效果。
  184.   #--------------------------------------------------------------------------
  185.   # 设定项目  [:time]
  186.   INEFF[0][:time] = 10
  187.   
  188.   #--------------------------------------------------------------------------
  189.   # ● 淡入 : 效果 1 的设定
  190.   #     显示默认渐变图片。
  191.   #--------------------------------------------------------------------------
  192.   # 设定项目  [:time]
  193.   INEFF[1][:time] = 15
  194.   
  195.   #--------------------------------------------------------------------------
  196.   # ● 淡入 : 效果 2 的设定
  197.   #     显示新设定的渐变图片。
  198.   #     :name : 新渐变图片的文件名。
  199.   #--------------------------------------------------------------------------
  200.   # 设定项目  [:time, :name]
  201.   INEFF[2][:time] = 15
  202.   INEFF[2][:name] = "BattleStart"
  203.   
  204.   #--------------------------------------------------------------------------
  205.   # ● 淡入 : 效果 3 的设定
  206.   #     波形描写を行います。
  207.   #     :amp    : 波形的振幅。
  208.   #     :length : 波形的周期。
  209.   #--------------------------------------------------------------------------
  210.   # 设定项目  [:rate, :time, :fadein, :color, :amp, :length]
  211.   INEFF[3][:rate]   = 1
  212.   INEFF[3][:time]   = 60
  213.   INEFF[3][:amp]    = 64
  214.   INEFF[3][:length] = 60
  215.   
  216.   #--------------------------------------------------------------------------
  217.   # ● 淡入 : 效果 4 的设定
  218.   #     画面破碎四溅效果。
  219.   #     :side   : 水平和纵向分割画面的数值,数值越大,碎片越多。
  220.   #--------------------------------------------------------------------------
  221.   # 设定项目  [:rate, :time, :fadein, :color, :side]
  222.   INEFF[4][:rate]   = 1
  223.   INEFF[4][:time]   = 60
  224.   INEFF[4][:fadein] = 150
  225.   INEFF[4][:side]   = 12
  226.   
  227.   #--------------------------------------------------------------------------
  228.   # ● 淡入 : 效果 5 的设定
  229.   #     画面朝一个方向逐渐破碎。
  230.   #     :side   : 水平和纵向分割画面的数值,数值越大,碎片越多。
  231.   #     :dir    : 碎片朝哪个方向移动。设定数字与由小键盘的方向(2, 4, 6, 8)相对应。
  232.   #--------------------------------------------------------------------------
  233.   # 设定项目  [:rate, :time, :fadein, :color, :side, :dir]
  234.   INEFF[5][:rate]   = 1
  235.   INEFF[5][:time]   = 60
  236.   INEFF[5][:fadein] = 100
  237.   INEFF[5][:side]   = 17
  238.   INEFF[5][:dir]    = 4
  239.   
  240.   
  241. #//////////////////////////////////////////////////////////////////////////////
  242. #
  243. # 以下,不需要修改
  244. #
  245. #//////////////////////////////////////////////////////////////////////////////

  246.   def self.snapshot_for_effect
  247.     @effect_bitmap = Graphics.snap_to_bitmap
  248.   end
  249.   def self.dispose_effect_bitmap
  250.     @effect_bitmap.dispose if @effect_bitmap
  251.     @effect_bitmap = nil
  252.   end
  253.   #--------------------------------------------------------------------------
  254.   # ● ビューポート的作成
  255.   #--------------------------------------------------------------------------
  256.   def self.create_main_viewport
  257.     @viewport = Viewport.new
  258.     @viewport.z = 500
  259.   end
  260.   #--------------------------------------------------------------------------
  261.   # ● ビューポート的解放
  262.   #--------------------------------------------------------------------------
  263.   def self.dispose_main_viewport
  264.     @viewport.dispose
  265.     @viewport = nil
  266.   end
  267.   #--------------------------------------------------------------------------
  268.   # ● フレーム更新(淡出用)
  269.   #--------------------------------------------------------------------------
  270.   def self.update_fadeout(i, d)
  271.     Graphics.update
  272.     @viewport.color.alpha = 255 - 255 * (180 - i) / d if d > 0
  273.     @viewport.update
  274.   end
  275.   #--------------------------------------------------------------------------
  276.   # ● フレーム更新(淡入用)
  277.   #--------------------------------------------------------------------------
  278.   def self.update_fadein(i, d)
  279.     @viewport2.color.alpha = 255 - 255 * i / d if d > 0
  280.     Graphics.update
  281.   end
  282.   #--------------------------------------------------------------------------
  283.   # ● 淡出実行
  284.   #--------------------------------------------------------------------------
  285.   def self.perform_fadeout
  286.     index = OUT_VARIABLE ? $game_variables[OUT_INDEX] : OUT_INDEX
  287.     params = OUTEFF[index]
  288.     return fadeout_transition({}) unless params
  289.     return if index < 0
  290.     return fadeout_transition(params) if index == 0 || index == 1
  291.     create_main_viewport
  292.     @viewport.color.set(params[:color]) if params[:color]
  293.     @viewport.color.alpha = 0
  294.     effect_sprites = []
  295.     Graphics.transition(0)
  296.     Graphics.frame_rate = 60 / params[:rate]
  297.     step = params[:rate] * 180.0 / params[:time]
  298.     dur = 180 * (params[:fadeout] || 30) / params[:time]
  299.     case index
  300.     when 2
  301.       0.step(180, step) do |i|
  302.         sprite = make_effect_sprite1
  303.         sprite.angle = 2 * i
  304.         sprite.opacity = (i == 0 ? 255 : params[:rate] * 8 + 8)
  305.         update_effect_size(sprite, 1.0 + 0.01 * i)
  306.         effect_sprites << sprite
  307.         update_fadeout(i, dur)
  308.       end
  309.     when 3
  310.       type = params[:dir] - 1
  311.       tx = Graphics.width  * (type % 3 == 0 ? 1 : type % 3 == 2 ? 5 : 3) / 6
  312.       ty = Graphics.height * (type / 3 == 0 ? 5 : type / 3 == 2 ? 1 : 3) / 6
  313.       opacity = params[:rate] * 8 + 16
  314.       0.step(180, step) do |i|
  315.         if effect_sprites.size > params[:blur]
  316.           sprite = effect_sprites.shift
  317.         else
  318.           sprite = make_effect_sprite1
  319.         end
  320.         sprite.x = Graphics.width / 2 - (Graphics.width / 2 - tx) * i / 180
  321.         sprite.y = Graphics.height / 2 - (Graphics.height / 2 - ty) * i / 180
  322.         sprite.z = i
  323.         sprite.angle = params[:angle] * i / 180
  324.         d = (i > 90 ? (180 - i) : 90)
  325.         sprite.opacity = (255 - i) * d / 90
  326.         effect_sprites.last.opacity = opacity * d / 90 unless effect_sprites.empty?
  327.         update_effect_size(sprite, 0.2 + 0.8 * (180 - i) ** 2 / 180 ** 2)
  328.         effect_sprites << sprite
  329.         update_fadeout(i, dur)
  330.       end
  331.     when 4
  332.       tx = $game_player.screen_x
  333.       ty = $game_player.screen_y - 20
  334.       opacity = params[:rate] * 8 + 8
  335.       0.step(180, step) do |i|
  336.         sprite = make_effect_sprite1
  337.         sprite.x = tx + (Graphics.width / 2 - tx) * i / 180
  338.         sprite.y = ty + (Graphics.height / 2 - ty) * i / 180
  339.         sprite.z = i
  340.         sprite.ox = tx
  341.         sprite.oy = ty
  342.         sprite.angle = params[:angle] * i / 180
  343.         sprite.opacity = (i == 0 ? 255 : opacity)
  344.         m = 60 ** 2 - 30 ** 2 + (30 - i) ** 2
  345.         update_effect_size(sprite, 1.0 * m / 60 ** 2, 1.2)
  346.         effect_sprites << sprite
  347.         update_fadeout(i, dur)
  348.       end
  349.     when 5
  350.       effect_sprites << make_effect_sprite1 << make_effect_sprite1
  351.       effect_sprites[1].opacity = 64
  352.       effect_sprites[1].wave_length = params[:length]
  353.       0.step(180, step) do |i|
  354.         d = 180 ** 2 - (180 - i) ** 2
  355.         effect_sprites[1].wave_amp = params[:amp] * d / 180 ** 2
  356.         effect_sprites[1].wave_speed = i * 5
  357.         effect_sprites[1].opacity += 1
  358.         effect_sprites[1].update
  359.         update_fadeout(i, dur)
  360.       end
  361.     when 6
  362.       effect_sprites << make_effect_sprite1
  363.       0.step(180, step) do |i|
  364.         @effect_bitmap.radial_blur(i / 3, 1)
  365.         update_fadeout(i, dur)
  366.       end
  367.     when 7
  368.       effect_sprites << make_effect_sprite1
  369.       0.step(180, step) do |i|
  370.         sprite = make_effect_sprite1
  371.         sprite.opacity = 32
  372.         sprite.zoom_x = sprite.zoom_y = 1.0 + 2.0 * i / 180
  373.         effect_sprites << sprite
  374.         update_fadeout(i, dur)
  375.       end
  376.     when 8
  377.       effect_data = {}
  378.       max = 32 * params[:time] / 180
  379.       make_break_sprites1(params[:side]).each do |sprite|
  380.         effect_sprites << sprite
  381.         effect_data[sprite] = make_effect_data1(sprite, max)
  382.       end
  383.       Graphics.wait(8)
  384.       0.step(180, step) do |i|
  385.         update_break_effect1(effect_data, params[:time], i)
  386.         update_fadeout(i, dur)
  387.       end
  388.     when 9
  389.       effect_data = {}
  390.       max = 24 * params[:time] / 180
  391.       make_break_sprites1(params[:side]).each do |sprite|
  392.         effect_sprites << sprite
  393.         effect_data[sprite] = make_effect_data2(sprite, max, params[:dir])
  394.       end
  395.       0.step(180, step) do |i|
  396.         update_break_effect2(effect_data, i, params[:dir])
  397.         update_fadeout(i, dur)
  398.       end
  399.     end
  400.     snapshot_for_effect
  401.     Graphics.freeze
  402.     Graphics.frame_rate = 60
  403.     dispose_main_viewport
  404.     effect_sprites.each {|sprite| sprite.dispose }
  405.   end
  406.   #--------------------------------------------------------------------------
  407.   # ● 淡入実行
  408.   #--------------------------------------------------------------------------
  409.   def self.perform_fadein
  410.     return unless @effect_bitmap
  411.     index = IN_VARIABLE ? $game_variables[IN_INDEX] : IN_INDEX
  412.     params = INEFF[index]
  413.     return Graphics.transition(10) unless params
  414.     return Graphics.transition(params[:time]) if index == 0
  415.     if index == 1 || index == 2
  416.       name = params[:name] || "BattleStart"
  417.       Graphics.transition(params[:time], "Graphics/System/" << name, 100)
  418.       return
  419.     end
  420.     create_main_viewport
  421.     @viewport2 = Viewport.new
  422.     @viewport2.z = 450
  423.     @viewport2.color.set(params[:color]) if params[:color]
  424.     @viewport2.color.alpha = 0
  425.     Graphics.transition(0)
  426.     Graphics.frame_rate = 60 / params[:rate]
  427.     effect_sprites = []
  428.     step = params[:rate] * 180.0 / params[:time]
  429.     dur = 180 * (params[:fadein] || 30) / params[:time]
  430.     case index
  431.     when 3
  432.       effect_sprites << make_back_sprite(@viewport2)
  433.       effect_sprites[0].wave_length = params[:length]
  434.       effect_sprites << make_effect_sprite1
  435.       effect_sprites[1].z += 1
  436.       0.step(180, step) do |i|
  437.         m = 180 ** 2
  438.         d = m - i ** 2
  439.         effect_sprites[0].wave_amp = params[:amp] * d / m
  440.         effect_sprites[0].wave_speed = (180 - i) * 5
  441.         effect_sprites[0].opacity = (180 - i) * 3 / 2
  442.         effect_sprites[0].update
  443.         effect_sprites[1].opacity = 255 - 255 * i / 60
  444.         update_fadein(i, dur)
  445.       end
  446.     when 4
  447.       effect_data = {}
  448.       max = 32 * params[:time] / 180
  449.       make_break_sprites1(params[:side]).each do |sprite|
  450.         effect_sprites << sprite
  451.         effect_data[sprite] = make_effect_data1(sprite, max)
  452.       end
  453.       0.step(180, step) do |i|
  454.         update_break_effect1(effect_data, params[:time], i)
  455.         effect_data.each_key {|sprite| sprite.opacity = (180 - i) * 4 }
  456.         update_fadein(i, dur)
  457.       end
  458.     when 5
  459.       effect_data = {}
  460.       max = 24 * params[:time] / 180
  461.       make_break_sprites1(params[:side]).each do |sprite|
  462.         effect_sprites << sprite
  463.         effect_data[sprite] = make_effect_data2(sprite, max, params[:dir])
  464.       end
  465.       0.step(180, step) do |i|
  466.         update_break_effect2(effect_data, i, params[:dir])
  467.         effect_data.each_key {|sprite| sprite.opacity = (180 - i) * 8 }
  468.         update_fadein(i, dur)
  469.       end
  470.     end
  471.     dispose_main_viewport
  472.     @viewport2.dispose
  473.     dispose_effect_bitmap
  474.     effect_sprites.each {|sprite| sprite.dispose }
  475.     Graphics.frame_rate = 60
  476.     Graphics.frame_reset
  477.   end
  478.   #--------------------------------------------------------------------------
  479.   # ● 效果スプライト的作成 1
  480.   #--------------------------------------------------------------------------
  481.   def self.make_effect_sprite1
  482.     sprite = Sprite.new(@viewport)
  483.     sprite.bitmap = @effect_bitmap
  484.     sprite.x = sprite.ox = Graphics.width / 2
  485.     sprite.y = sprite.oy = Graphics.height / 2
  486.     sprite
  487.   end
  488.   #--------------------------------------------------------------------------
  489.   # ● 效果的大きさ設定
  490.   #--------------------------------------------------------------------------
  491.   def self.update_effect_size(sprite, zoom, rate = 1.0)
  492.     sprite.zoom_x = sprite.zoom_y = zoom
  493.     if zoom > 1
  494.       w =  (@effect_bitmap.width / zoom * rate).to_i / 2
  495.       h =  (@effect_bitmap.height / zoom * rate).to_i / 2
  496.       cx = [sprite.ox - w, 0].max
  497.       cy = [sprite.oy - h, 0].max
  498.       cw = [sprite.ox + w, @effect_bitmap.width].min - cx
  499.       ch = [sprite.oy + h, @effect_bitmap.height].min - cy
  500.       sprite.ox += sprite.src_rect.x - cx
  501.       sprite.oy += sprite.src_rect.y - cy
  502.       sprite.src_rect.set(cx, cy, cw, ch)
  503.       Graphics.frame_reset
  504.     end
  505.   end
  506.   #--------------------------------------------------------------------------
  507.   # ● 画面破壊用效果準備 1
  508.   #--------------------------------------------------------------------------
  509.   def self.make_break_sprites1(side)
  510.     sprites = []
  511.     rect = Rect.new
  512.     height = Graphics.width / side
  513.     row = (Graphics.height + height / 2) / height
  514.     side.times do |x| row.times do |y|
  515.       rect.x = Graphics.width * x / side
  516.       rect.y = Graphics.height * y / row
  517.       rect.width = Graphics.width * (x + 1) / side - rect.x
  518.       rect.height = Graphics.height * (y + 1) / row - rect.y
  519.       sprites << make_effect_sprite2(rect, 0)
  520.       sprites << make_effect_sprite2(rect, 2)
  521.     end; end
  522.     Graphics.frame_reset
  523.     sprites
  524.   end
  525.   #--------------------------------------------------------------------------
  526.   # ● 效果スプライト的作成 2
  527.   #--------------------------------------------------------------------------
  528.   def self.make_effect_sprite2(rect, pos)
  529.     sprite = Sprite.new(@viewport)
  530.     sprite.bitmap = Bitmap.new(rect.width, rect.height)
  531.     sprite.bitmap.blt(0, 0, @effect_bitmap, rect)
  532.     d = [rect.width, rect.height].max
  533.     if pos == 0
  534.       d.times {|i| sprite.bitmap.clear_rect(rect.width * (d - i) / d, i, i, 1) }
  535.     else
  536.       d.times {|i| sprite.bitmap.clear_rect(0, i, rect.width * (d - i) / d, 1) }
  537.     end
  538.     sprite.ox = rect.width * (pos + 1) / 4
  539.     sprite.oy = rect.height * (pos + 1) / 4
  540.     sprite.x = rect.x + sprite.ox
  541.     sprite.y = rect.y + sprite.oy
  542.     sprite
  543.   end
  544.   #--------------------------------------------------------------------------
  545.   # ● 背景スプライト的作成
  546.   #--------------------------------------------------------------------------
  547.   def self.make_back_sprite(viewport)
  548.     sprite = Sprite.new(viewport)
  549.     sprite.bitmap = Graphics.snap_to_bitmap
  550.     sprite
  551.   end
  552.   #--------------------------------------------------------------------------
  553.   # ● 效果データ的作成 1
  554.   #--------------------------------------------------------------------------
  555.   def self.make_effect_data1(sprite, max)
  556.     result = [rand(3)] # ウェイト
  557.     sx = sprite.x - Graphics.width / 2
  558.     sy = sprite.y - Graphics.height / 2
  559.     result[1] = Math.asin(1 - Math.hypot(sx, sy) / 360) * rand(6) ** 2 / 10 + 1 # 拡大率
  560.     rate = 3.5
  561.     result[1] = rate = 20.0 if result[1] > 2.5 && rand(3) == 0
  562.     result[2] = (sx - rand(17) + 8) * rate + Graphics.width / 2 # 移動先 X
  563.     result[3] = sprite.x - result[2] # X 軸移動距離
  564.     result[4] = (sy - rand(13) + 6) * rate + Graphics.height / 2 # 移動先 Y
  565.     result[5] = sprite.y - result[4] # Y 軸移動距離
  566.     result[6] = (rand(max) + 1) * (rand(2) == 0 ? 1 : -1) / 4.0 # 回転
  567.     result[7] = (rand(max) + 1) * (rand(2) == 0 ? 1 : -1) / 4.0 # X 軸回転
  568.     result[8] = rand(max + 1) * (rand(2) == 0 ? 1 : -1) / 4.0 # Y 軸回転
  569.     result[9] = sprite.ox # X 軸原点記憶
  570.     result
  571.   end
  572.   #--------------------------------------------------------------------------
  573.   # ● 破壊效果的更新 1
  574.   #--------------------------------------------------------------------------
  575.   def self.update_break_effect1(effect_data, time, i)
  576.     if i < 90
  577.       d = (45 ** 2 - (i - 45) ** 2) / 40
  578.     else
  579.       d = (90 - i) * 2
  580.     end
  581.     d *= time / 180.0
  582.     effect_data.each do |sprite, data|
  583.       m = i - data[0]
  584.       next if m <= 0
  585.       zoom = data[1] - (data[1] - 1) * (179 - m) ** 2 / 180 ** 2
  586.       next sprite.visible = false if zoom > 6
  587.       sprite.x = data[2] + data[3] * (179 - m) ** 2 / 180 ** 2
  588.       sprite.y = data[4] + data[5] * (179 - m) ** 2 / 180 ** 2
  589.       sprite.y -= d * zoom if data[1] < 16
  590.       sprite.z = data[1] * 100
  591.       spin_set_sprite(sprite, m, zoom, data)
  592.     end
  593.   end
  594.   #--------------------------------------------------------------------------
  595.   # ● スプライト回転
  596.   #--------------------------------------------------------------------------
  597.   def self.spin_set_sprite(sprite, i, zoom, data)
  598.     zoom_x = zoom * Math.cos(i * data[7] * Math::PI / 180)
  599.     zoom_y = zoom * Math.cos(i * data[8] * Math::PI / 180)
  600.     sprite.mirror = (zoom_x < 0) != (zoom_y < 0)
  601.     sprite.ox = sprite.mirror ? sprite.width - data[9] : data[9]
  602.     sprite.zoom_x = zoom_x.abs
  603.     sprite.zoom_y = zoom_y.abs
  604.     sprite.angle = i * data[6] + (zoom_y < 0 ? 180 : 0)
  605.   end
  606.   #--------------------------------------------------------------------------
  607.   # ● 效果データ的作成 2
  608.   #--------------------------------------------------------------------------
  609.   def self.make_effect_data2(sprite, max, dir)
  610.     result = []
  611.     case dir
  612.     when 2; wait = 90 - 90 * sprite.y / Graphics.height
  613.     when 4; wait = 90 * sprite.x / Graphics.width
  614.     when 6; wait = 90 - 90 * sprite.x / Graphics.width
  615.     when 8; wait = 90 * sprite.y / Graphics.height
  616.     end
  617.     result[0] = wait + rand(5) - 5 # ウェイト
  618.     sx = sprite.x - Graphics.width / 2
  619.     sy = sprite.y - Graphics.height / 2
  620.     rate = 2.0 - result[0] / 90.0
  621.     result[1] = 1.5 # 拡大率
  622.     result[2] = sprite.x # 現在 X
  623.     result[4] = sprite.y # 現在 Y
  624.     case dir
  625.     when 2
  626.       result[3] = (sprite.x - Graphics.width / 2) / 2 # X 軸移動距離
  627.       result[5] = Graphics.height * rate # Y 軸移動距離
  628.     when 4
  629.       result[3] = -Graphics.width * rate # X 軸移動距離
  630.       result[5] = (sprite.y - Graphics.height / 2) / 2 # Y 軸移動距離
  631.     when 6
  632.       result[3] = Graphics.width * rate # X 軸移動距離
  633.       result[5] = (sprite.y - Graphics.height / 2) / 2 # Y 軸移動距離
  634.     when 8
  635.       result[3] = (sprite.x - Graphics.width / 2) / 2 # X 軸移動距離
  636.       result[5] = -Graphics.height * rate # Y 軸移動距離
  637.     end
  638.     result[6] = (rand(max) + 1) * (rand(2) == 0 ? 1 : -1) / 4.0 # 回転
  639.     result[7] = (rand(max) + 1) * (rand(2) == 0 ? 1 : -1) / 4.0 # X 軸回転
  640.     result[8] = rand(max + 1) * (rand(2) == 0 ? 1 : -1) / 4.0 # Y 軸回転
  641.     result[9] = sprite.ox # X 軸原点記憶
  642.     result
  643.   end
  644.   #--------------------------------------------------------------------------
  645.   # ● 破壊效果的更新 2
  646.   #--------------------------------------------------------------------------
  647.   def self.update_break_effect2(effect_data, i, dir)
  648.     effect_data.each do |sprite, data|
  649.       m = i - data[0]
  650.       next if m <= 0
  651.       next sprite.visible = false if m > 90
  652.       zoom = data[1] - (data[1] - 1) * (90 - m) ** 2 / 90 ** 2
  653.       next sprite.visible = false if zoom > 6
  654.       case dir
  655.       when 2, 8
  656.         sprite.x = data[2] + data[3] * m / 90
  657.         sprite.y = data[4] + data[5] * m ** 2 / 90 ** 2
  658.       when 4, 6
  659.         sprite.x = data[2] + data[3] * m ** 2 / 90 ** 2
  660.         sprite.y = data[4] + data[5] * m / 90
  661.       end
  662.       spin_set_sprite(sprite, m, zoom, data)
  663.     end
  664.   end
  665.   #--------------------------------------------------------------------------
  666.   # ● 画面破壊用效果準備 2
  667.   #--------------------------------------------------------------------------
  668.   def self.make_break_sprites2
  669.     base = [$game_player.screen_x, $game_player.screen_y - 20]
  670.     pos_data = []
  671.     r = 2 * Math::PI / 8
  672.     8.times do |i|
  673.       radian = r * i
  674.       pos = base
  675.       begin
  676.         d = rand(100) + 50
  677.         r2 = radian + radian * (rand * 0.8 - 0.4)
  678.         pos[0] -= d * Math.sin(r2)
  679.         pos[1] -= d * Math.cos(r2)
  680.         
  681.         
  682.       end while pos[0].between?(0, Graphics.width) &&
  683.                 pos[1].between?(0, Graphics.height)
  684.     end
  685.    
  686.     sprites = []
  687.     sprites
  688.   end
  689.   #--------------------------------------------------------------------------
  690.   # ● トランジション実行 [淡出]
  691.   #--------------------------------------------------------------------------
  692.   def self.fadeout_transition(params)
  693.     d     = params[:time] || 60
  694.     name  = params[:name] || "BattleStart"
  695.     color = params[:color] || Color.new(0, 0, 0, 255)
  696.     create_main_viewport
  697.     @viewport.color.set(color)
  698.     Graphics.transition(d, "Graphics/System/" << name, 100)
  699.     Graphics.freeze
  700.     snapshot_for_effect
  701.     dispose_main_viewport
  702.   end
  703. end

  704.   @material ||= []
  705.   @material << :PrBtEff
  706.   def self.include?(sym)
  707.     @material.include?(sym)
  708.   end

  709. end

  710. #==============================================================================
  711. # ■ Scene_Map
  712. #==============================================================================
  713. class Scene_Map
  714.   #--------------------------------------------------------------------------
  715.   # ◯ 終了前処理
  716.   #--------------------------------------------------------------------------
  717.   alias _wooden_prebteff_pre_terminate pre_terminate
  718.   def pre_terminate
  719.     WdTk::PrBtEff.snapshot_for_effect if SceneManager.scene_is?(Scene_Battle)
  720.     _wooden_prebteff_pre_terminate
  721.   end
  722.   #--------------------------------------------------------------------------
  723.   # ☆ 戦闘前トランジション実行
  724.   #--------------------------------------------------------------------------
  725.   def perform_battle_transition
  726.     WdTk::PrBtEff.perform_fadeout
  727.   end
  728. end

  729. #==============================================================================
  730. # ■ Scene_Battle
  731. #==============================================================================
  732. class Scene_Battle
  733.   #--------------------------------------------------------------------------
  734.   # ☆ トランジション実行
  735.   #--------------------------------------------------------------------------
  736.   def perform_transition
  737.     return if $BTEST
  738.     WdTk::PrBtEff.perform_fadein
  739.     WdTk::PrBtEff.dispose_effect_bitmap
  740.     GC.start
  741.   end
  742. end

  743. if WdTk.include?(:SubMenu)
  744. #==============================================================================
  745. # ■ Scene_ExSubMenu
  746. #==============================================================================
  747. class Scene_ExSubMenu
  748.   #--------------------------------------------------------------------------
  749.   # ◯ 終了前処理
  750.   #--------------------------------------------------------------------------
  751.   alias _wooden_prebteff_pre_terminate pre_terminate
  752.   def pre_terminate
  753.     WdTk::PrBtEff.snapshot_for_effect if SceneManager.scene_is?(Scene_Battle)
  754.     _wooden_prebteff_pre_terminate
  755.   end
  756.   #--------------------------------------------------------------------------
  757.   # ☆ 戦闘前トランジション実行
  758.   #--------------------------------------------------------------------------
  759.   def perform_battle_transition
  760.     WdTk::PrBtEff.perform_fadeout
  761.   end
  762. end
  763. end
复制代码

作者: 15120066641    时间: 2020-3-3 14:07
哦,谢谢
作者: PLeaseS    时间: 2020-3-3 14:09
太强了,太强了
作者: 15120066641    时间: 2020-3-6 12:09
变量开启不会设置,这玩意太难,用默认的吧!还是感谢你的脚本。
作者: 刈飒的风    时间: 2020-3-6 12:12
猫大猫大




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