#============================================================================== # ■ RGSS3 アニメーション機能拡張 Ver1.01 by 星潟 #------------------------------------------------------------------------------ # アニメーションについて、以下の機能を追加します。 # 処理の関係上、素材欄の中でも上の方に配置される事が推奨します。 #============================================================================== # ★アニメーション表示の左右逆転 # # 画面の左寄りか右寄りかで # アニメーション表示位置を逆転させます。 # それぞれ、左右どちらを本来の基準にするかを設定できます。 # (何も設定しなければ、常に本来の設定どおりのアニメーションとなります) # なお、画面中央ぴったりの場合は通常扱いとなります。 #------------------------------------------------------------------------------ # ☆設定例 #------------------------------------------------------------------------------ # 左寄りの場合に通常、右寄りの場合にアニメを反転させたい場合 # アイテム/スキルのメモ欄に<アニメ左優先>と記入する。 #------------------------------------------------------------------------------ # 右寄りの場合に通常、左寄りの場合にアニメを反転させたい場合 # アイテム/スキルのメモ欄に<アニメ右優先>と記入する。 #============================================================================== # ★アニメーションの速度 # # アニメーションの速度を設定します。 # デフォルトの値を変更する事と、個別のアニメ速度の変更が可能です。 #------------------------------------------------------------------------------ # ☆設定例 #------------------------------------------------------------------------------ # アニメーションの名前に<アニメ速度:3>と記入する事で # このアニメーションの速度は # デフォルトのアニメーション速度の1.5倍速となります。 # デフォルトの速度は4で、2で2倍、8で1/2となります。 #============================================================================== # ★ターゲットバックアニメーション # # アニメーション1、アニメーション2、あるいはその両方を # ターゲットの後方に表示させるようにします。 #------------------------------------------------------------------------------ # ☆設定例 #------------------------------------------------------------------------------ # アニメーションの名前に[1B]を含める事で # アニメーション1がターゲットの後方に表示されます。 #------------------------------------------------------------------------------ # アニメーションの名前に[2B]を含める事で # アニメーション2がターゲットの後方に表示されます。 #------------------------------------------------------------------------------ # [1B]と[2B]を両方同時に使用する事も出来ます。 #============================================================================== # ★アニメーション対象の透過度による自らの透過度変更無視化 # # 通常、透明度が0となっている対象へアニメーションを行った場合 # アニメーションも透明となってしまいますが # この設定を無効化し、本来の透過度で表示を行います。 # また、この設定は個別に無効化する事が出来ます。 #------------------------------------------------------------------------------ # ☆設定例 #------------------------------------------------------------------------------ # アニメーションの名前に<透過設定逆転>を含める事で # 設定されている透過設定を逆転する事が出来ます。 #============================================================================== # ★アニメーションの座標調整 # # アニメーション位置のX座標・Y座標を本来の位置から更に調整します。 #------------------------------------------------------------------------------ # ☆設定例 #------------------------------------------------------------------------------ # アニメーションの名前に<座標調整:50,-50>を含める事で # 表示座標の基準位置がX座標は+50、Y座標は-50されます。 #============================================================================== # ★アニメーション時のシェイク # # アニメーション時に画面のシェイクを行います。 #------------------------------------------------------------------------------ # ☆設定例 #------------------------------------------------------------------------------ # アニメーションのSE・フラッシュ設定時に # 「shake」というSEを鳴らすようにした場合 # フラッシュの赤要素が強さ、緑要素が速さ、 # 青要素がフレーム数と変換して、シェイクが実行されます。 # デフォルトでは、一定以上の強さのシェイクを行うと # 背景が見切れる事があるので注意が必要です。 # この際、「shake」というSEそのものは再生されません。 #============================================================================== # ★戦闘背景フラッシュ # # 戦闘中のアニメーション時に戦闘背景のみに対しフラッシュを行います。 #------------------------------------------------------------------------------ # ☆設定例 #------------------------------------------------------------------------------ # アニメーションのSE・フラッシュ設定時に # 「back_flash」というSEを鳴らすようにした場合 # フラッシュの対象が戦闘背景に変更されます。 # この際、「back_flash」というSEそのものは再生されません。 #============================================================================== # ★「shake」や「back_flash」といったSEデータの簡単な作り方 # # 1.メモ帳を開きます。 # # 2.「shake.ogg」や「back_flash.ogg」という名前にして保存します。 # # 3.保存先を見るとtxtファイルではなくoggファイルが生成されているので # それをそのままSEフォルダに入れます。 #============================================================================== # ★アニメーションビューポート指定消去 # # アニメーションを最前面に発生させます。 # フラッシュ等よりも更に前面に発生させるので、設定には注意が必要です。 #------------------------------------------------------------------------------ # ☆設定例 #------------------------------------------------------------------------------ # アニメーションの名前に[AVNIL]を含めると # そのアニメーションのビューポート指定が消滅し、最前面表示化されます。 #============================================================================== # Ver1.01 アニメーションのビューポート指定を消す設定が可能になりました。 #============================================================================== module STAR_ANIME_ENH #アニメーション速度を設定します。 #プリセットスクリプト(デフォ)では4です。 #数字が小さくなるほど早く、大きくなるほど遅くなります。 #1以下、もしくは小数点を含む数字を設定すると #不具合が発生するので注意してください。 #個別設定が優先されます。 ANIME_SPEED = 4 #アニメーションの透過度が対象グラフィックの透過度に #影響するかどうかを決定します。 #trueで表示、falseで非表示です。 #プリセットスクリプト(デフォ)ではfalseです。 #個別設定で逆転させる事が可能です。 TRANS_ANIME = true #通常は位置が画面のアニメーションは敵全体分重ねて表示されますが #これを1体分だけの変更するかどうかを選びます。 #trueで1体分のみ、falseで規定数分表示します。 #なお、フラッシュはしっかり規定数分発生しますのでご安心を。 #(1体分のみにする事で、大規模な画面アニメーションのアイテムやスキルを # 複数対象に行った場合、大幅な軽量化が見込めます) SCREEN_ONCE = true #左寄りの場合に通常、右寄りの場合に #アニメを反転させたい場合のキーワードを設定する。 WORD1 = "アニメ左優先" #右寄りの場合に通常、左寄りの場合に #アニメを反転させたい場合のキーワードを設定する。 WORD2 = "アニメ右優先" #個別にアニメーションの速度を設定したい際の #キーワードを設定する。 WORD3 = "アニメ速度" #アニメーション1を後方表示化する為のキーワードを設定します。 WORD4 = "[1B]" #アニメーション2を後方表示化する為のキーワードを設定します。 WORD5 = "[2B]" #透過度無効化設定を無効化したいアニメーションを #設定する場合のキーワードを設定する。 WORD6 = "透過設定逆転" #X座標・Y座標の位置を調節したいアニメーションを #設定する場合のキーワードを設定する。 WORD7 = "座標調整" #アニメーションを強制的にビューポート指定なしで再生する為の #設定用キーワードを指定します。 WORD8 = "[AVNIL]" end class Game_Temp #-------------------------------------------------------------------------- # 左右反転フラグと背景フラッシュ情報の取得。 #-------------------------------------------------------------------------- attr_accessor :lr_rev_a attr_accessor :parallax_flash end class Sprite_Base < Sprite #-------------------------------------------------------------------------- # アニメーションの開始 #-------------------------------------------------------------------------- alias start_animation_acs start_animation def start_animation(animation, mirror = false) #反転アニメ情報とスプライトの位置判定の値が同じ場合は、反転判定を逆転させる。 mirror = mirror ? false : true if $game_temp.lr_rev_a && $game_temp.lr_rev_a == lr_rev_type #透過度無効化設定判定を行う。 #全体の設定と個別の設定から、最終的な透過度設定を判断する。 @trans_void = STAR_ANIME_ENH::TRANS_ANIME ? !animation.trans_void : animation.trans_void #本来の処理を実行する。 start_animation_acs(animation, mirror) #アニメーションの個別速度設定が存在する場合はそちらを優先する。 #存在しない場合はスクリプトで設定された新たなデフォルト速度を用いる。 @ani_rate = animation.true_anime_rate != 0 ? animation.true_anime_rate : STAR_ANIME_ENH::ANIME_SPEED @ani_duration = @animation.frame_max * @ani_rate + 1 end #-------------------------------------------------------------------------- # アニメーション用ビットマップの設定 #-------------------------------------------------------------------------- alias load_animation_bitmap_anibitmap_back load_animation_bitmap def load_animation_bitmap #本来の処理を実行。 load_animation_bitmap_anibitmap_back #アニメーション1及び2の後方表示化フラグをアニメーションデータから取得します。 @anibitmap1_back = @animation.animation_1_back_flag @anibitmap2_back = @animation.animation_2_back_flag end #-------------------------------------------------------------------------- # スプライトの生成直後に設定に応じてビューポート指定の変更 #-------------------------------------------------------------------------- alias make_animation_sprites_avnil make_animation_sprites def make_animation_sprites #本来の処理を実行。 make_animation_sprites_avnil #アニメスプライトが @ani_sprites.each {|ans| ans.viewport = nil} if @animation.avnil && !@ani_sprites.empty? end #-------------------------------------------------------------------------- # スプライトの位置判定 #-------------------------------------------------------------------------- def lr_rev_type #左寄りの場合は0、右寄りの場合は1、中央の場合は2を返す。 return 2 if self.x == Graphics.width / 2 self.x < (Graphics.width / 2) ? 0 : 1 end #-------------------------------------------------------------------------- # アニメーションの原点設定 #-------------------------------------------------------------------------- alias set_animation_origin_acs set_animation_origin def set_animation_origin #本来の処理を実行する。 set_animation_origin_acs #X座標及びY座標を調整する。 @ani_ox += @animation.xy_axis_control[0] @ani_oy += @animation.xy_axis_control[1] end #-------------------------------------------------------------------------- # アニメーションスプライトの設定 #(一部、aliasで処理し難いのでやむなくオーバーライド) #-------------------------------------------------------------------------- def animation_set_sprites(frame) cell_data = frame.cell_data @ani_sprites.each_with_index do |sprite, i| next unless sprite pattern = cell_data[i, 0] if !pattern || pattern < 0 sprite.visible = false next end sprite.bitmap = pattern < 100 ? @ani_bitmap1 : @ani_bitmap2 sprite.visible = true sprite.src_rect.set(pattern % 5 * 192, pattern % 100 / 5 * 192, 192, 192) if @ani_mirror sprite.x = @ani_ox - cell_data[i, 1] sprite.y = @ani_oy + cell_data[i, 2] sprite.angle = (360 - cell_data[i, 4]) sprite.mirror = (cell_data[i, 5] == 0) else sprite.x = @ani_ox + cell_data[i, 1] sprite.y = @ani_oy + cell_data[i, 2] sprite.angle = cell_data[i, 4] sprite.mirror = (cell_data[i, 5] == 1) end sprite.z = self.z + 300 + i sprite.ox = 96 sprite.oy = 96 sprite.zoom_x = cell_data[i, 3] / 100.0 sprite.zoom_y = cell_data[i, 3] / 100.0 #この部分だけ変更が必要。 #透過度設定を指定通りに変更する。 sprite.opacity = cell_data[i, 6] * (@trans_void ? 1.0 : (self.opacity / 255.0)) sprite.blend_type = cell_data[i, 7] #パターンナンバーが100より小さく #アニメーション1後方表示化フラグがfalseの場合は飛ばす。 next if (pattern < 100 && !@anibitmap1_back) #パターンナンバーが99より大きく #アニメーション2後方表示化フラグがfalseの場合は飛ばす。 next if (pattern > 99 && !@anibitmap2_back) #後方表示用にz座標を操作する sprite.z = self.z - 16 + i end end #-------------------------------------------------------------------------- # SE とフラッシュのタイミング処理 #-------------------------------------------------------------------------- alias animation_process_timing_acs animation_process_timing def animation_process_timing(timing) #タイミングにシェイクが含まれている場合 if timing.shake != nil #マップの場合と戦闘の場合で対象を変える。 if SceneManager.scene_is?(Scene_Map) s = $game_map.screen elsif SceneManager.scene_is?(Scene_Battle) s = $game_troop.screen end #マップでも戦闘でもない場合は処理を飛ばす。 #そのどちらかの場合は対象のスクリーンをシェイクさせて #残りの処理を飛ばす。 if s != nil sd = timing.shake return s.start_shake(sd[0], sd[1], sd[2] * @ani_rate) end end #タイミングに背景フラッシュが含まれている場合 if timing.back_flash #戦闘中でない場合は処理を飛ばす。 return unless SceneManager.scene_is?(Scene_Battle) #背景フラッシュフラグを設定して、残りの処理を飛ばす。 return $game_temp.parallax_flash = [timing.flash_color, timing.flash_duration * @ani_rate] end #元の処理を実行する。 animation_process_timing_acs(timing) end end class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # フレーム更新 #-------------------------------------------------------------------------- alias update_basic_acs update_basic def update_basic #元の処理を実行する。 update_basic_acs #背景フラッシュフラグが存在する場合は背景フラッシュを実行する。 @spriteset.parallax_flash($game_temp.parallax_flash[0], $game_temp.parallax_flash[1]) if $game_temp.parallax_flash != nil end #-------------------------------------------------------------------------- # アイテム/スキルの使用 #-------------------------------------------------------------------------- alias use_item_lr_rev_a use_item def use_item #一時情報として、アイテムの反転情報を保存する。 $game_temp.lr_rev_a = @subject.current_action.item.lr_rev_a #本来の処理を実行する。 use_item_lr_rev_a #アイテムの反転情報を破棄する。 $game_temp.lr_rev_a = nil end end class Spriteset_Battle #-------------------------------------------------------------------------- # 背景フラッシュの実行 #-------------------------------------------------------------------------- def parallax_flash(color, duration) #背景の壁と床それぞれにフラッシュを設定する。 @back1_sprite.flash(color, duration) @back2_sprite.flash(color, duration) #フラッシュのフラグを消去する。 $game_temp.parallax_flash = nil end end class RPG::UsableItem #-------------------------------------------------------------------------- # 反転アニメ情報 #-------------------------------------------------------------------------- def lr_rev_a #キャッシュがある場合はキャッシュを返す。 return @lr_rev_a if @lr_rev_a != nil #メモ欄からデータを取得。 #左寄り優先の場合は1、右寄り優先の場合は0、 #取得できない場合はfalseを代入する。 if self.note.include?("<" + STAR_ANIME_ENH::WORD1 + ">") @lr_rev_a = 1 elsif self.note.include?("<" + STAR_ANIME_ENH::WORD2 + ">") @lr_rev_a = 0 else @lr_rev_a = false end #データを返す。 return @lr_rev_a end end class RPG::Animation #-------------------------------------------------------------------------- # 個別アニメーション速度 #-------------------------------------------------------------------------- def true_anime_rate #キャッシュがある場合はキャッシュを返す。 return @true_anime_rate if @true_anime_rate != nil #メモ欄からデータを取得。 memo = self.name.scan(/<#{STAR_ANIME_ENH::WORD3}[::](\S+)>/).flatten #データを取得出来無かった場合は0とする。 @true_anime_rate = memo != nil && !memo.empty? ? memo[0].to_i : 0 #データを返す。 return @true_anime_rate end #-------------------------------------------------------------------------- # アニメーション1の後方表示フラグ #-------------------------------------------------------------------------- def animation_1_back_flag #キャッシュがある場合はキャッシュを返す。 return @abf1 if @abf1 != nil #名前からデータを取得。 @abf1 = @name.include?(STAR_ANIME_ENH::WORD4) #データを返す。 return @abf1 end #-------------------------------------------------------------------------- # アニメーション2の後方表示フラグ #-------------------------------------------------------------------------- def animation_2_back_flag #キャッシュがある場合はキャッシュを返す。 return @abf2 if @abf2 != nil #名前からデータを取得。 @abf2 = @name.include?(STAR_ANIME_ENH::WORD5) #データを返す。 return @abf2 end #-------------------------------------------------------------------------- # 個別透過度設定無視フラグ #-------------------------------------------------------------------------- def trans_void #キャッシュがある場合はキャッシュを返す。 return @trans_void if @trans_void != nil #メモ欄からデータを取得。 @trans_void = self.name.include?("<" + STAR_ANIME_ENH::WORD6 + ">") #データを返す。 return @trans_void end #-------------------------------------------------------------------------- # 個別座標調整 #-------------------------------------------------------------------------- def xy_axis_control #キャッシュがある場合はキャッシュを返す。 return @xy_axis_control if @xy_axis_control != nil #名前からデータを取得。 memo = self.name.scan(/<#{STAR_ANIME_ENH::WORD7}[::](\S+),(\S+)>/).flatten #データを取得出来無かった場合は0とする。 @xy_axis_control = memo != nil && memo.size == 2 ? [memo[0].to_i, memo[1].to_i] : [0, 0] #データを返す。 return @xy_axis_control end #-------------------------------------------------------------------------- # ビューポートを指定なしにか否かのフラグを取得 #-------------------------------------------------------------------------- def avnil #キャッシュがある場合はキャッシュを返す。 return @avnil if @avnil != nil #名前からデータを取得。 @avnil = self.name.include?(STAR_ANIME_ENH::WORD8) #データを返す。 return @avnil end end class RPG::Animation::Timing #-------------------------------------------------------------------------- # シェイクデータを取得 #-------------------------------------------------------------------------- def shake if @se.name != '' && @se.name == 'shake' return [@flash_color.red, @flash_color.green, @flash_color.blue] else return nil end end #-------------------------------------------------------------------------- # 背景フラッシュデータを取得 #-------------------------------------------------------------------------- def back_flash @se.name != '' && @se.name == 'back_flash' end end #-------------------------------------------------------------------------- # 表示位置:画面のアニメーションをフラッシュを維持させつつ軽量化する作業 #-------------------------------------------------------------------------- if STAR_ANIME_ENH::SCREEN_ONCE class Game_Temp #-------------------------------------------------------------------------- # 表示位置:画面のフラグ取得。 #-------------------------------------------------------------------------- attr_accessor :a_to_s end class Sprite_Base < Sprite #-------------------------------------------------------------------------- # アニメーションの解放 #-------------------------------------------------------------------------- alias dispose_animation_acs dispose_animation def dispose_animation #本来の処理を実行する。 dispose_animation_acs #表示位置画面のアニメかどうかの判定を初期化する。 $game_temp.a_to_s = nil end end class Sprite_Battler < Sprite_Base #-------------------------------------------------------------------------- # 新しいアニメーションの設定 # (一部分がaliasでは処理し難い為オーバーライド) #-------------------------------------------------------------------------- def setup_new_animation if @battler.animation_id > 0 animation = $data_animations[@battler.animation_id].clone animation.frames = [RPG::Animation::Frame.new] * (animation.frame_max) if $game_temp.a_to_s mirror = @battler.animation_mirror start_animation(animation, mirror) @battler.animation_id = 0 $game_temp.a_to_s = true if animation.to_screen? end end end end