じ☆ve冰风 发表于 2024-4-18 18:59:01

萌新改造外站的多重动画脚本

转自http://mintoroom.saloon.jp/Main.html
みんとの部屋
作者:みんと
大感谢
需要和前置脚本一起使用
这脚本功能是在播放一个动画的基础下再播放新的动画 多个动画可以同时存在
多重动画脚本原版只能调用动画ID765以內的动画

萌新进行了小改造改成能调用9999的动画ID
原版调用动画ID是在SE闪烁强度为0
RGB的合计值为动画ID

萌新改成
当强度为0 持续时间为2帧时
动画ID=R+G连接成一起的值
当强度为0 持续时间为3帧时
动画ID=R+G+B连接成一起的值
例1:R99 G99 =9999
例2:R50 G0 B0 =5000
以下放脚本
RUBY 代码
#◆◇◆◇◆☆ 多重追加アニメーション ver 1.02◇◆◇◆◇
# ☆ マスタースクリプト ver 2.00 以降専用
#サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/
#   by みんと

=begin

更新履歴

ver 1.02(2009/11/24)
・イベントの解放に時間がかかる仕様を変更

ver 1.01(2008/09/07)
・F12リセットでエラー落ちするミスを修正


セクション指定上下関係

アクティブ・アニメシェイク

A・C・A・システム

このスクリプト

説明

デフォルトでは、
戦闘アニメ表示中に、新たなアニメを表示した場合、
表示中のアニメが消えてしまいますが、
多重表示できるアニメ表示機能を追加します。

設定には
アニメーションに「強さが 0」の「画面のフラッシュ」を設定してください。
そのフレームで、アニメを追加します。
アニメのIDはフラッシュの赤、青、緑の合計値になります。
なので、事実上、ID_765番までのアニメを追加表示できます。

フラッシュの条件も機能しますので、
ヒットした場合のみの追加エフェクト、
ミスした場合のみのエフェクトなど、
バリエーションが広がります。

なお、追加にACAシステムが反映されないのは仕様となっています。
(動きがおかしくなってしまうので)

またデフォルトのアニメの表示機能自体はそのままです。
マップでも反映されます。

=end

#==============================================================================
# ☆ MINTO
#------------------------------------------------------------------------------
#   様々なフラグを扱うメインモジュールです。
#==============================================================================

module MINTO

# 多重追加アニメーションを有効化( true で有効 / false で無効 )
RGSS["Array_Anima"] = true

end

ifMINTO::RGSS["Array_Anima"]

#==============================================================================
# ☆ Mint_Cache
#------------------------------------------------------------------------------
#   様々なキャッシュを扱うモジュールです。
#==============================================================================

module Mint_Cache
# キャッシュを初期化
@cache = {}
#-------------------------------------------------------------------------
# ● ビットマップのロード
#    folder_name : 読み込むフォルダ
#    filename    : 読み込むファイル
#    hue         : 色相の情報
#-------------------------------------------------------------------------
defself.load_bitmap(folder_name, filename, hue = 0)
    # ハッシュ用のパスを設定
    path = folder_name + filename
    # 未作成のアニメかそのアニメが解放されている場合
    ifnot@cache.include?(path)or@cache.disposed?
      # ファイルネームが空文字以外の場合
      if filename != ""
      # ファイルからビットマップを作成
      @cache = Bitmap.new(path)
      else
      # ビットマップを作成
      @cache = Bitmap.new(32, 32)
      end
    end
    # 色相の変換が無い場合
    if hue == 0
      # 元の画像ファイルを渡す
      return@cache
    else
      # ハッシュ用のキーを取得
      key =
      # キャッシュに存在しないかすでに解放されている場合
      ifnot@cache.include?(key)or@cache.disposed?
      # キャッシュに複製を渡す
      @cache = @cache.clone
      # 色相を変更
      @cache.hue_change(hue)
      end
      # 画像のファイルを渡す
      return@cache
    end
end
#-------------------------------------------------------------------------
# ● アニメーションの読み込み
#    filename    : 読み込むファイル
#    hue         : 色相の情報
#-------------------------------------------------------------------------
defself.animation(filename, hue)
    # 対象ファイルを読み込んで渡す
    returnself.load_bitmap("Graphics/Animations/", filename, hue)
end
#-------------------------------------------------------------------------
# ● クリア
#-------------------------------------------------------------------------
defself.clear
    # キャッシュの内容をクリア
    @cache = {}
end
end
#==============================================================================
# ■ RPG::Sprite
#------------------------------------------------------------------------------
#   ゲームで戦闘中に使用されるスプライト表示を管理するクラスです。
#==============================================================================

module RPG
class Sprite < ::Sprite
    #-----------------------------------------------------------------------
    # ● 配列アニメーション作成
    #    animation : 渡されたアニメーション
    #    hit       : ヒットフラグ
    #-----------------------------------------------------------------------
    def array_animation(animation, hit)
      # 無効なアニメの場合
      if animation == nilthen
      # 処理を返す
      return
      end
      # アニメを配列の先頭に追加
      @_array_animation.unshift(animation)
      # ヒットフラグの先頭に追加
      @_array_animation_hit.unshift(hit)
      # 更新カウントの先頭に追加
      @_array_animation_duration.unshift(animation.frame_max)
      # アニメの名前を取得
      animation_name = animation.animation_name
      # アニメの色調情報を取得
      animation_hue = animation.animation_hue
      # アニメの画像をキャッシュからロード
      bitmap = Mint_Cache.animation(animation_name, animation_hue)
      # アニメのスプライトを作成して先頭に追加
      @_array_animation_sprite.unshift(sprite_set_array(bitmap))
    end
    #------------------------------------------------------------------------
    # ● スプライトセット
    #    bitmap : 読み込んだ画像
    #------------------------------------------------------------------------
    def sprite_set_array(bitmap)
      # 配列を初期化
      animation_sprites = []
      # スプライトを新規作成
      sprite = ::Sprite.new(self.viewport)
      sprite.bitmap = bitmap
      sprite.visible = false
      animation_sprites.push(sprite)
      sprite = ::Sprite.new(self.viewport)
      sprite.bitmap = bitmap
      sprite.visible = false
      animation_sprites.push(sprite)
      sprite = ::Sprite.new(self.viewport)
      sprite.bitmap = bitmap
      sprite.visible = false
      animation_sprites.push(sprite)
      sprite = ::Sprite.new(self.viewport)
      sprite.bitmap = bitmap
      sprite.visible = false
      animation_sprites.push(sprite)
      sprite = ::Sprite.new(self.viewport)
      sprite.bitmap = bitmap
      sprite.visible = false
      animation_sprites.push(sprite)
      sprite = ::Sprite.new(self.viewport)
      sprite.bitmap = bitmap
      sprite.visible = false
      animation_sprites.push(sprite)
      sprite = ::Sprite.new(self.viewport)
      sprite.bitmap = bitmap
      sprite.visible = false
      animation_sprites.push(sprite)
      sprite = ::Sprite.new(self.viewport)
      sprite.bitmap = bitmap
      sprite.visible = false
      animation_sprites.push(sprite)
      sprite = ::Sprite.new(self.viewport)
      sprite.bitmap = bitmap
      sprite.visible = false
      animation_sprites.push(sprite)
      sprite = ::Sprite.new(self.viewport)
      sprite.bitmap = bitmap
      sprite.visible = false
      animation_sprites.push(sprite)
      sprite = ::Sprite.new(self.viewport)
      sprite.bitmap = bitmap
      sprite.visible = false
      animation_sprites.push(sprite)
      sprite = ::Sprite.new(self.viewport)
      sprite.bitmap = bitmap
      sprite.visible = false
      animation_sprites.push(sprite)
      sprite = ::Sprite.new(self.viewport)
      sprite.bitmap = bitmap
      sprite.visible = false
      animation_sprites.push(sprite)
      sprite = ::Sprite.new(self.viewport)
      sprite.bitmap = bitmap
      sprite.visible = false
      animation_sprites.push(sprite)
      sprite = ::Sprite.new(self.viewport)
      sprite.bitmap = bitmap
      sprite.visible = false
      animation_sprites.push(sprite)
      sprite = ::Sprite.new(self.viewport)
      sprite.bitmap = bitmap
      sprite.visible = false
      animation_sprites.push(sprite)
      # スプライトを返す
      return animation_sprites
    end
    #------------------------------------------------------------------------
    # ● 配列アニメの更新
    #------------------------------------------------------------------------
    def update_array_anima
      # 現在表示中のアニメの数だけ繰り返す
      (0...@_array_animation_duration.size).eachdo |i|
      # グラフィックカウントが偶数の場合
      if(Graphics.frame_count % 2 == 0)then
          # アニメを取得
          anima = @_array_animation
          # 無効なアニメの場合
          if anima == nilthen
            # 次の処理へ以降
            next
          end
          # アニメーションカウントを減らす
          @_array_animation_duration -= 1
          # アニメのスプライトを取得
          sprite = @_array_animation_sprite
          # アニメのヒットフラグを取得
          hit = @_array_animation_hit
          # アニメカウントが1以上の場合
          if@_array_animation_duration >= 1then
            # 現在のフレームを取得
            frame_index = anima.frame_max - @_array_animation_duration
            # アニメのセルのデータを取得
            cell_data = anima.frames.cell_data
            # アニメのポジションデータを取得
            position = anima.position
            # 生成先のオブジェクトに応じて分岐
            caseself
            # マップキャラクターの場合
            when Sprite_Character then
            # アニメを動かす
            animation_set_sprites(sprite, cell_data, position)
            # 戦闘キャラの場合
            else
            # ターゲット二体目以降ではない場合
            ifself.battler != nilandnotself.battler.all_animethen
                # アニメを動かす
                animation_set_sprites(sprite, cell_data, position)
            end
            end
            # アニメの効果を進める
            anima.timings.eachdo |timing|
            # タイミングのフレームと現在のフレームが等しい場合
            if timing.frame == frame_index-1then
                # アニメの効果を適用
                animation_process_timing(timing, hit)
            end
            end
          # アニメのカウントが0の場合
          else
            # アニメを解放
            dispose_array_animation(i)
          end
      end
      end
    end
    #-----------------------------------------------------------------------
    # ● 配列アニメを解放
    #    index : 求められたアニメのインデックス
    #-----------------------------------------------------------------------
    def dispose_array_animation(index)
      # アニメが有効な場合
      if@_array_animation != nilthen
      # セルスプライトを順番に処理
      @_array_animation_sprite.eachdo |sprite|
          # セルスプライトを解放
          sprite.dispose
      end
      # アニメを空にする
      @_array_animation = nil
      @_array_animation_sprite = nil
      @_array_animation_duration = nil
      @_array_animation_hit = nil
      # 無効な配列を除外
      @_array_animation.compact!
      @_array_animation_sprite.compact!
      @_array_animation_duration.compact!
      @_array_animation_hit.compact!
      end
      # インデックスが -1 の場合
      if index == -1then
      # 表示中のアニメ分だけ繰り返す
      (0...@_array_animation_sprite.size).eachdo |i|
          # 対象インデックスのアニメを解放
          dispose_array_animation(i)
      end
      end
    end
    #------------------------------------------------------------------------
    # ● 追加アニメの効果適用
    #    timing : SEなどのタイミングデータ
    #    hit    : アニメのヒットフラグ改造BY:SOULSAGA 20210314
    #------------------------------------------------------------------------
    def abb_anima_effect(timing, hit)
      红色=timing.flash_color.red.to_s
      绿色=timing.flash_color.green.to_s
      蓝色=timing.flash_color.blue.to_s
      动画2=红色+绿色
      动画3=红色+绿色+蓝色
      动画2=动画2.to_i
      动画3=动画3.to_i
      # 条件が ヒット で攻撃がヒットした場合か、
      # 条件が ミス で攻撃がミスだった場合、
      # もしくは条件が なし だった場合
      if(timing.condition == 0)or
      (timing.condition == 1and hit == true)or
      (timing.condition == 2and hit == false)
      # 強さが0の画面のフラッシュが設定されている場合
      if timing.flash_color.alpha == 0and timing.flash_scope == 2then
          # 追加アニメのIDを取得(フラッシュの赤、青、緑の合計値)
          anima_id = timing.flash_color.red
          anima_id += timing.flash_color.green
          anima_id += timing.flash_color.blue
          anima_id = timing.flash_duration == 2 ? 动画2 : timing.flash_duration == 3 ? 动画3 : anima_id
          # アニメーションを読み込む
          anima = Data_Animations.data
          # 配列アニメを実行
          array_animation(anima, hit)
      end
      end
    end
end
end
#==============================================================================
# ■ Game_Battler (分割定義 1)
#------------------------------------------------------------------------------
#  バトラーを扱うクラスです。このクラスは Game_Actor クラスと Game_Enemy クラ
# スのスーパークラスとして使用されます。
#==============================================================================

class Game_Battler
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :all_anime                # ターゲット二体目以降フラグ
end
#==============================================================================
# ■ Sprite_Battler
#------------------------------------------------------------------------------
#  バトラー表示用のスプライトです。Game_Battler クラスのインスタンスを監視し、
# スプライトの状態を自動的に変化させます。
#==============================================================================

class Sprite_Battler < RPG::Sprite
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#   viewport : ビューポート
#   battler: バトラー (Game_Battler)
#    alias   : initialize_Array_Anima
#--------------------------------------------------------------------------
alias initialize_Array_Anima initialize
def initialize(viewport, battler = nil)
    # 元の処理を実行
    initialize_Array_Anima(viewport, battler)
    @_array_animation = []
    @_array_animation_sprite = []
    @_array_animation_duration = []
    @_array_animation_hit = []
end
#--------------------------------------------------------------------------
# ● 解放
#    alias : dispose_Array_Anima
#--------------------------------------------------------------------------
alias dispose_Array_Anima dispose
def dispose
    # 元の処理を実行
    dispose_Array_Anima
    # 配列アニメを全て解放
    dispose_array_animation(-1)
    # キャッシュを解放
    Mint_Cache.clear
end
#--------------------------------------------------------------------------
# ● フレーム更新
#    alias : update_Array_Anima
#--------------------------------------------------------------------------
alias update_Array_Anima update
def update
    # 元の処理を実行
    update_Array_Anima
    # 配列アニメを更新
    update_array_anima
end
#-------------------------------------------------------------------------
# ● エフェクト表示中判定
#-------------------------------------------------------------------------
def effect?
    # スーパークラスを実行
    bool = super
    bool or@_array_animation_duration.size > 0
end
#--------------------------------------------------------------------------
# ● アニメーション・プロセスタイミング
#    timing : SEなどのデータ
#    hit    : ヒットフラグ
#--------------------------------------------------------------------------
def animation_process_timing(timing, hit)
    # 追加アニメ判定
    abb_anima_effect(timing, hit)
    # スーパークラスメソッドを実行
    super(timing, hit)
    # アクティブ・アニメシェイクが有効ではない場合
    ifnotMINTO::RGSS["Active_Shake"]then
      # 処理を返す
      return
    end
    # 条件が ヒット で攻撃がヒットした場合か、
    # 条件が ミス で攻撃がミスだった場合、
    # もしくは条件が なし だった場合
    if(timing.condition == 0)or
      (timing.condition == 1and hit == true)or
      (timing.condition == 2and hit == false)
      # 対象無しのフラッシュが設定されている場合
      if timing.flash_scope == 0then
      # フラッシュの赤と緑が0の場合
      if timing.flash_color.red == 0and timing.flash_color.green == 0then
          # シェイクの強さ(フラッシュの強さ)
          s_alpha = .min
          # シェイクの早さ(フラッシュの青)
          s_speed = .min
          # シェイクの時間(フラッシュの時間)
          s_thyme = timing.flash_duration.to_i * 2
          # 画面をシェイク
          $game_screen.start_shake(s_alpha, s_speed, s_thyme)
      end
      end
    end
end
end
#==============================================================================
# ■ Sprite_Character
#------------------------------------------------------------------------------
#  キャラクター表示用のスプライトです。Game_Character クラスのインスタンスを
# 監視し、スプライトの状態を自動的に変化させます。
#==============================================================================

class Sprite_Character < RPG::Sprite
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#   viewport: ビューポート
#   character : キャラクター (Game_Character)
#   alias   : initialize_Array_Anima
#--------------------------------------------------------------------------
alias initialize_Array_Anima initialize
def initialize(viewport, character = nil)
    @_array_animation = []
    @_array_animation_sprite = []
    @_array_animation_duration = []
    @_array_animation_hit = []
    # 元の処理を実行
    initialize_Array_Anima(viewport, character)
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
def dispose
    super
    # 配列アニメを全て解放
    dispose_array_animation(-1)
    # キャッシュを解放
    Mint_Cache.clear
end
#--------------------------------------------------------------------------
# ● フレーム更新
#    alias : update_Array_Anima
#--------------------------------------------------------------------------
alias update_Array_Anima update
def update
    # 元の処理を実行
    update_Array_Anima
    # 配列アニメを更新
    update_array_anima
end
#--------------------------------------------------------------------------
# ● アニメーション・プロセスタイミング
#    timing : SEなどのデータ
#    hit    : ヒットフラグ
#--------------------------------------------------------------------------
def animation_process_timing(timing, hit)
    # 追加アニメ判定
    abb_anima_effect(timing, hit)
    # スーパークラスメソッドを実行
    super(timing, hit)
    # アクティブ・アニメシェイクが有効ではない場合
    ifnotMINTO::RGSS["Active_Shake"]then
      # 処理を返す
      return
    end
    # 条件が ヒット で攻撃がヒットした場合か、
    # 条件が ミス で攻撃がミスだった場合、
    # もしくは条件が なし だった場合
    if(timing.condition == 0)or
      (timing.condition == 1and hit == true)or
      (timing.condition == 2and hit == false)
      # 対象無しのフラッシュが設定されている場合
      if timing.flash_scope == 0then
      # フラッシュの赤と緑が0の場合
      if timing.flash_color.red == 0and timing.flash_color.green == 0then
          # シェイクの強さ(フラッシュの強さ)
          s_alpha = .min
          # シェイクの早さ(フラッシュの青)
          s_speed = .min
          # シェイクの時間(フラッシュの時間)
          s_thyme = timing.flash_duration.to_i * 2
          # 画面をシェイク
          $game_screen.start_shake(s_alpha, s_speed, s_thyme)
      end
      end
    end
end
end

end

             本帖来自P1论坛作者soulsaga,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=484983若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页: [1]
查看完整版本: 萌新改造外站的多重动画脚本