#◆◇◆◇◆ アニメ軽処理化スクリプト ver 1・00 ◇◆◇◆◇ # 全マスタースクリプト共通スクリプト # サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/ # by みんと =begin ● 削除される仕様 このスクリプトを導入すると アニメ表示中に表示対象が動いた場合、 対象に合わせてアニメ自身も動くというXPの仕様は削除されます。 ※ 戦闘中においては、 そもそも表示対象が動くこと事態がないのと、 マップ画面においてもアニメまで一緒に動いてしまっては、 かえって不自然に見えるため。 説明 ツクール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 #------------------------------------------------------------------------ # ● アニメーションを作成 # animation : アニメーション(RPG::Animation) # hit : ヒットしたかどうかの判定フラグ #------------------------------------------------------------------------ def animation(animation, hit) # アニメーションを一度解放 dispose_animation # アニメーションのデータを保存 @_animation = animation # 無効なアニメーションの場合 if @_animation == nil then # メソッドを返す return end # アニメーションのヒットフラグを取得 @_animation_hit = hit # アニメーションの更新カウントを設定 @_animation_duration = @_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 # アニメーションを収納する配列を作成 @_animation_sprites = [] # セル最大数を取得 @_cell_max = @_animation.cell_max # アニメの位置が 画面 以外か、読み込まれていないアニメの場合 if @_animation.position != 3 or @@_animations.include?(animation) == false then # ループ処理(イテレータ) (0...@_cell_max).each do |i| # スプライトを作成 sprite = ::Sprite.new(self.viewport) # 読み込んだアニメーションの画像を渡す sprite.bitmap = bitmap # スプライトを不可視に設定 sprite.visible = false # 作成したスプライトを配列内に収納する @_animation_sprites.push(sprite) end # 未作成のアニメの場合 if @@_animations.include?(animation) == false then # アニメーションのデータを保管 @@_animations.push(animation) end end # アニメーションを更新 update_animation 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 # メソッドを返す 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 = [] # ループ処理(イテレータ) (0...@_cell_max).each do |i| # スプライトを作成 sprite = ::Sprite.new(self.viewport) # 読み込んだアニメーションの画像を渡す sprite.bitmap = bitmap # スプライトを不可視に設定 sprite.visible = false # 作成したスプライトを配列内に収納する @_loop_animation_sprites.push(sprite) end # ループアニメーションを更新 update_loop_animation end #------------------------------------------------------------------------ # ● アニメーションスプライトの更新(基本) # sprites : スプライトの配列 # cell_data : セルデータ # position : アニメーションの位置 #------------------------------------------------------------------------ def animation_set_sprites(sprites, cell_data, position) # ループ処理(イテレータ) (0...@_cell_max).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 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 # スプライトの表示座標を修正 sprite.x = self.viewport.rect.width / 2 sprite.y = self.viewport.rect.height - 160 # ビューポートが無効な場合 else # スプライトを場面の中央に表示 sprite.x = 320 sprite.y = 240 end # アニメの位置が 画面 以外の場合 else # スプライトの基本表示座標をセット sprite.x = self.x - self.ox + self.src_rect.width / 2 sprite.y = self.y - self.oy + self.src_rect.height / 2 # アニメの位置が 上 の場合 if position == 0 then # スプライトの表示座標を上に修正 sprite.y -= self.src_rect.height / 4 end # アニメの位置が 下 の場合 if position == 2 then # スプライトの表示座標を下に修正 sprite.y += self.src_rect.height / 4 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 # スプライトの回転度を設定 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) # スーパークラスの処理に以降 super end #------------------------------------------------------------------------ # ● Y座標の変更 # y : 新しいY座標 #------------------------------------------------------------------------ def y=(y) # スーパークラスの処理に以降 super end end end end