#◆◇◆◇◆ アニメ軽処理化スクリプト・RTAB ver 1・00 ◇◆◇◆◇ # 全マスタースクリプト共通スクリプト # サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/ # by みんと # リアルタイム・アクティブバトル(RTAB) ver 1.16 # 配布元・サポートURL(歯車の城) # http://members.jcom.home.ne.jp/cogwheel/ # by ショウ =begin ※ 動作確認はRTAB本体(ver 1.16)と本スクリプトのみで行っています。 それ以外のRTAB関連のスクリプトとの併用は保障しかねます。 RTAB本体の真下か、 可能な限り近いで且つ、RTAB本体よりも下の位置においてください。 説明 ツクールXPのアニメの更新処理は、 セルを16枚分、予め作成して処理しています。 しかし、 使用しているセルが何枚であろうと16枚作成しているため、 設定によっては無駄が生じていました。 そこで、作成するセルを各アニメーションごとに宣言して、 アニメの作成処理及び、更新処理を軽処理化します。 セルを16枚全て使っている場合には事実上効果はありませんが、 使用しているセルが少ない場合などにおいてはその効果を発揮します。 設定には、 技発動 ma1 といった様に アニメーションの名前 (半角のスペース)ma半角の数字 という記述をしてください。 maの後に記入された数字が使用するセルの最大数となります。 上記の記述なら no 1 までのセルを使用します。 ※ ここで言うセルの最大数とは「セル自身のIDナンバー」です。 技発動 ma1といったように宣言し、 実際にセルを一枚しか使っていない場合でも、 データベースの設定で セルの no が2以上になっている場合は表示されません。 未宣言の場合は通常と同じ処理を実行します。 =end #============================================================================== # ☆ MINTO #------------------------------------------------------------------------------ # 様々なフラグを扱うメインモジュールです。 #============================================================================== module MINTO # アニメ軽処理化スクリプトを有効化 ( true で有効 / false で無効 ) RGSS["Rapid_Animation"] = true end # アニメ軽処理化スクリプトが有効な場合に以降の処理を実行する if MINTO::RGSS["Rapid_Animation"] == true then #============================================================================== # ■ RPG::Animation #------------------------------------------------------------------------------ #  RPGXPで使用するアニメーションのデータを管理するクラスです。 #============================================================================== module RPG class Animation #------------------------------------------------------------------------ # ● アニメーション名の取得 #------------------------------------------------------------------------ def name # アニメ名から半角のスペース以降の文字を除外 name = @name.split(/ /)[0] # 名前を返す return name.to_s end #------------------------------------------------------------------------ # ● セルの最大表示数の取得 #------------------------------------------------------------------------ def cell_max # アニメーションの名前から最大数を取得する max = @name.split(/ma/)[1].to_i # 取得したデータを返す(未記入なら 16 を返す) return max != 0 ? max : 16 end end end #============================================================================== # ■ RPG::Sprite #------------------------------------------------------------------------------ #  RPGXPで使用する各種エフェクトの処理を追加したスプライトのクラスです。 #============================================================================== module RPG class Sprite < ::Sprite #-------------------------------------------------------------------------- # ● オブジェクト初期化 # viewport : ビューポート #-------------------------------------------------------------------------- def initialize(viewport = nil) # スーパークラスの処理に移行 super(viewport) # 各データを初期化 @_whiten_duration = 0 @_appear_duration = 0 @_escape_duration = 0 @_collapse_duration = 0 @_damage = [] @_animation = [] @_animation_duration = 0 @_blink = false @_cell_max = {} end #------------------------------------------------------------------------ # ● アニメーションを作成 # animation : アニメーション(RPG::Animation) # hit : ヒットしたかどうかの判定フラグ #------------------------------------------------------------------------ def animation(animation, hit) # 無効なアニメーションの場合 if animation == nil then # セル最大数を設定 @_cell_max[animation] = 1 # メソッドを返す return end # アニメーションの最大数を取得 num = @_animation.size # アニメーションの管理配列に追加 @_animation.push([animation, hit, animation.frame_max, []]) # アニメーション名を取得 animation_name = animation.animation_name # アニメーションの色調データを取得 animation_hue = animation.animation_hue # アニメーションの画像を読み込む bitmap = RPG::Cache.animation(animation_name, animation_hue) # 過去に読み込んだことのある画像だった場合 if @@_reference_count.include?(bitmap) == true then # 読み込み回数を加算 @@_reference_count[bitmap] += 1 # まだ読み込んだことのない画像だった場合 else # 読み込み回数を設定 @@_reference_count[bitmap] = 1 end # セル最大数を取得 @_cell_max[animation] = animation.cell_max # アニメの位置が 画面 以外か、読み込まれていないアニメの場合 if @_animation[num][0].position != 3 or not @@_animations.include?(animation) == false then # ループ処理(イテレータ) (0...@_cell_max[animation]).each do |i| # スプライトを作成 sprite = ::Sprite.new(self.viewport) # 読み込んだアニメーションの画像を渡す sprite.bitmap = bitmap # スプライトを不可視に設定 sprite.visible = false # 作成したスプライトを配列内に収納する @_animation[num][3].push(sprite) end # 未作成のアニメの場合 if @@_animations.include?(animation) == false then # アニメーションのデータを保管 @@_animations.push(animation) end end # アニメーションを更新 update_animation(@_animation[num]) end #------------------------------------------------------------------------ # ● ループアニメーションを作成 # animation : アニメーション(RPG::Animation) #------------------------------------------------------------------------ def loop_animation(animation) # 同じループアニメーションが要求された場合 if animation == @_loop_animation then # メソッドを返す return end # ループアニメーションを一度解放 dispose_loop_animation # ループアニメーションのデータを保存 @_loop_animation = animation # 無効なループアニメーションの場合 if @_loop_animation == nil then # セル最大数を設定 @_cell_max[animation] = 1 # メソッドを返す return end # ループアニメーションのインデックスをクリア @_loop_animation_index = 0 # キャッシュ用にアニメーションのグラフィック名を取得 animation_name = @_loop_animation.animation_name # キャッシュ用にアニメーションの色相データを取得 animation_hue = @_loop_animation.animation_hue # アニメーションの画像を読み込む bitmap = RPG::Cache.animation(animation_name, animation_hue) # 過去に読み込んだことのある画像だった場合 if @@_reference_count.include?(bitmap) == true then # 読み込み回数を加算 @@_reference_count[bitmap] += 1 # まだ読み込んだことのない画像だった場合 else # 読み込み回数を設定 @@_reference_count[bitmap] = 1 end # ループアニメーションを収納する配列を作成 @_loop_animation_sprites = [] # セル最大数を取得 @_cell_max[animation] = animation.cell_max # ループ処理(イテレータ) (0...@_cell_max[animation]).each do |i| # スプライトを作成 sprite = ::Sprite.new(self.viewport) # 読み込んだアニメーションの画像を渡す sprite.bitmap = bitmap # スプライトを不可視に設定 sprite.visible = false # 作成したスプライトを配列内に収納する @_loop_animation_sprites.push(sprite) end end #------------------------------------------------------------------------ # ● アニメーションスプライトの更新(基本) # sprites : スプライトの配列 # cell_data : セルデータ # position : アニメーションの位置 #------------------------------------------------------------------------ def animation_set_sprites(sprites, cell_data, position) # 保存したアニメーションが有効な場合 if @_save_animation != nil then # 保存したアニメを渡す anime = @_save_animation # 保存したアニメーションが無効な場合 else # ループアニメを渡す anime = @_loop_animation end # ループ処理(イテレータ) (0...@_cell_max[anime]).each do |i| # ACAシステムに関わるスクリプトが導入されている場合 if RPG::Sprite.method_defined?(:animation_set) == true then # アニメーションを更新 animation_set(sprites, cell_data, position, i) # ACAシステムに関わるスクリプトが導入されていない場合 else # アニメーションを更新 animation_update_sprite(sprites, cell_data, position, i) end end # 保存したアニメをクリア @_save_animation = nil end #------------------------------------------------------------------------ # ● アニメーションスプライトの更新(本体) # sprites : スプライトの配列 # cell_data : セルデータ # position : アニメーションの位置 # index : スプライトのインデックス #------------------------------------------------------------------------ def animation_update_sprite(sprites, cell_data, position, index) # スプライトを取得 sprite = sprites[index] # アニメセルのパターンを取得 pattern = cell_data[index, 0] # スプライトかセルのパターンのいずれかが無効な場合 if sprite == nil or pattern == nil or pattern == -1 then # スプライトが有効な場合 if sprite != nil then # スプライトを不可視にする sprite.visible = false # メソッドを返す return end end # スプライトを可視状態にする sprite.visible = true # スプライトの転送座標をセット sprite.src_rect.set(pattern % 5 * 192, pattern / 5 * 192, 192, 192) # アニメの位置が 画面 の場合 if position == 3 then # ビューポートが有効な場合 if self.viewport != nil then # スプライトの表示X座標を修正 sprite.x = self.viewport.rect.width / 2 # 現在戦闘中且つ、アニメ表示対象がエネミーの場合 if $game_temp.in_battle == true and self.battler.is_a?(Game_Enemy) == true then # スプライトの表示Y座標を修正 sprite.y = self.viewport.rect.height - 320 # 現在戦闘中でないか、アニメ表示対象がエネミー以外の場合 else # スプライトの表示Y座標を修正 sprite.y = self.viewport.rect.height - 160 end # ビューポートが無効な場合 else # スプライトを場面の中央に表示 sprite.x = 320 sprite.y = 240 end # アニメの位置が 画面 以外の場合 else # スプライトの表示X座標を修正 sprite.x = self.x + self.viewport.rect.x - self.ox + self.src_rect.width / 2 # 現在戦闘中且つ、アニメ表示対象がエネミーの場合 if $game_temp.in_battle == true and self.battler.is_a?(Game_Enemy) == true then # スプライトの表示Y座標を修正 sprite.y = self.y - self.oy * self.zoom_y / 2 + self.viewport.rect.y # アニメの位置が 上 の場合 if position == 0 then # スプライトの表示座標を上に修正 sprite.y -= self.src_rect.height * self.zoom_y / 4 # アニメの位置が 下 の場合 elsif position == 2 then # スプライトの表示座標を下に修正 sprite.y += self.src_rect.height * self.zoom_y / 4 end # 現在戦闘中でないか、アニメ表示対象がエネミー以外の場合 else # スプライトの表示Y座標を修正 sprite.y = self.y + self.viewport.rect.y - self.oy + self.src_rect.height / 2 # アニメの位置が 上 の場合 if position == 0 then # スプライトの表示座標を上に修正 sprite.y -= self.src_rect.height / 4 # アニメの位置が 下 の場合 elsif position == 2 then # スプライトの表示座標を下に修正 sprite.y += self.src_rect.height / 4 end end end # スプライトの位置にセルのデータを加算 sprite.x += cell_data[index, 1] sprite.y += cell_data[index, 2] # スプライトの奥行きを設定 sprite.z = 2000 # スプライトの転送座標を設定 sprite.ox = 96 sprite.oy = 96 # スプライトのズーム倍率を設定 sprite.zoom_x = cell_data[index, 3] / 100.0 sprite.zoom_y = cell_data[index, 3] / 100.0 # アニメの位置が 画面 以外の場合 if position != 3 then # スプライトのズーム倍率を補正 sprite.zoom_x *= self.zoom_x sprite.zoom_y *= self.zoom_y end # スプライトの回転度を設定 sprite.angle = cell_data[index, 4] # スプライトの左右反転フラグを設定 sprite.mirror = (cell_data[index, 5] == 1) # スプライトの不透明度を設定 sprite.opacity = cell_data[index, 6] * self.opacity / 255.0 # スプライトの表示方法を設定 sprite.blend_type = cell_data[index, 7] end #------------------------------------------------------------------------ # ● X座標の変更 # x : 新しいX座標 #------------------------------------------------------------------------ def x=(x) sx = x - self.x if sx != 0 for anime in @_animation if anime[3] != nil # ループ処理(イテレータ) (0...@_cell_max[anime[0]]).each do |i| anime[3][i].x += sx end end end if @_loop_animation_sprites != nil # ループ処理(イテレータ) (0...@_cell_max[@_loop_animation]).each do |i| @_loop_animation_sprites[i].x += sx end end end # スーパークラスの処理に以降 super end #------------------------------------------------------------------------ # ● Y座標の変更 # y : 新しいY座標 #------------------------------------------------------------------------ def y=(y) sy = y - self.y if sy != 0 for anime in @_animation if anime[3] != nil # ループ処理(イテレータ) (0...@_cell_max[anime[0]]).each do |i| anime[3][i].y += sy end end end if @_loop_animation_sprites != nil # ループ処理(イテレータ) (0...@_cell_max[@_loop_animation]).each do |i| @_loop_animation_sprites[i].y += sy end end end # スーパークラスの処理に以降 super end end end #============================================================================== # ■ Sprite_Battler #------------------------------------------------------------------------------ #  バトラー表示用のスプライトです。Game_Battler クラスのインスタンスを監視し、 # スプライトの状態を自動的に変化させます。 #============================================================================== class Sprite_Battler < RPG::Sprite #-------------------------------------------------------------------------- # ● フレーム更新(アニメーション) # anime : アニメーション #-------------------------------------------------------------------------- def update_animation(anime) # アニメーションを保存 @_save_animation = anime[0] # スーパークラスの処理に以降 super(anime) end end #============================================================================== # ■ Sprite_Character #------------------------------------------------------------------------------ #  キャラクター表示用のスプライトです。Game_Character クラスのインスタンスを # 監視し、スプライトの状態を自動的に変化させます。 #============================================================================== class Sprite_Character < RPG::Sprite #-------------------------------------------------------------------------- # ● フレーム更新(アニメーション) # anime : アニメーション #-------------------------------------------------------------------------- def update_animation(anime) # アニメーションを保存 @_save_animation = anime[0] # スーパークラスの処理に以降 super(anime) end end end