星潟さまの「ピクチャの上にアニメーション・フラッシュ」のアニメーション表示位置を指定したい

GT_VXACE
記事: 10
登録日時: 2023年1月29日(日) 12:47

星潟さまの「ピクチャの上にアニメーション・フラッシュ」のアニメーション表示位置を指定したい

投稿記事by GT_VXACE » 2024年1月18日(木) 22:10

http://artificialprovidence.web.fc2.com ... icture.txt

こちらのスクリプトなのですが、ピクチャの中央位置を計算して
アニメ再生されるようになっているようですが
画像ごとにアニメを表示させたい位置を微調整したいことがあり、
相談させてもらいました

できれば、そのマップ上のイベントIDを指定して
そのイベントの位置にアニメは表示するけど、アニメのフラッシュなどの効果は
指定したピクチャに適用されて、アニメがピクチャより上に表示される
と言ったものが理想です。

ご協力お願いできますでしょうか。

アバター
工作員X
記事: 15
登録日時: 2023年9月02日(土) 13:46
連絡を取る:

Re: 星潟さまの「ピクチャの上にアニメーション・フラッシュ」のアニメーション表示位置を指定したい

投稿記事by 工作員X » 2024年1月20日(土) 14:58

暫定的ですが
「指定キャラの最前面にアニメーションを表示する」
「ピクチャに対してアニメーションのフラッシュのみを実行する」
この二つのスクリプトを作成してみました。

「最前面アニメーション」

コード: 全て選択

module TopmostAnimation
  # 表示優先度のデフォルト値
  DEFAULT_Z = 2000
 
  @animator = []
  class << self
    attr_accessor :animator

    def character(character, animation_id, mirror = false)
      @animator << Animator_Character.new(character, animation_id, mirror)
    end

    def player(animation_id, mirror = false)
      character($game_player, animation_id, mirror)
    end

    def event(event_id, animation_id, mirror = false)
      character($game_map.events[event_id], animation_id, mirror)
    end

    def clear
      @animator.clear
    end

    def update
      @animator.delete_if do |animator|
        animator.update_topmost_animation
        unless animator.animation?
          animator.dispose
          true
        else
          false
        end
      end
    end

    def dispose
      @animator.each { |animator| animator.dispose }.clear
    end
  end
 
  class Animator_Character < Sprite_Character
    def initialize(character, animation_id, mirror = false)
      super(nil, character)
      self.z = DEFAULT_Z
      self.visible = false
      start_animation($data_animations[animation_id], mirror)
    end

    def update_topmost_animation
      update_position
      update_animation
    end
  end
end

class Spriteset_Map
  alias tani_initialize initialize
  def initialize
    setup_topmost_animation
    tani_initialize
  end

  alias tani_dispose dispose
  def dispose
    dispose_topmost_animation
    tani_dispose
  end

  alias tani_update update
  def update
    update_topmost_animation
    tani_update
  end

  def setup_topmost_animation
    TopmostAnimation.dispose
  end

  def dispose_topmost_animation
    TopmostAnimation.dispose
  end

  def update_topmost_animation
    TopmostAnimation.update
  end
end



「ピクチャフラッシュ」

コード: 全て選択

module PictureFlash
  # アニメーション効果を適用した場合に効果音も再生する
  ANIMATION_SOUND = false

  class << self
    attr_accessor :pictures

    def using_picture(id)
      (picture = @pictures ? @pictures[id] : nil) and yield picture
    end

    def flash(id, duration, r, g, b, a = 255)
      using_picture(id) do |picture|
        picture.flash(Color.new(r, g, b, a), duration)
      end
    end

    def color(id, r, g, b, a = 255)
      using_picture(id) do |picture|
        picture.color = Color.new(r, g, b, a)
      end
    end
   
    def clear_color(id)
      using_picture(id) do |picture|
        picture.color.set(0, 0, 0, 0)
      end
    end

    def animation(id, animation_id, ani_rate = 4)
      using_picture(id) do |picture|
        picture.animation_effect = (
          AnimationEffector.new(picture, animation_id, ani_rate)
        )
      end
    end
  end

  class AnimationEffector
    def initialize(base_sprite, animation_id, ani_rate = 4)
      @base_sprite = base_sprite
      @animation = $data_animations[animation_id]
      @rate = ani_rate
      @count = 0
      @duration = @animation.frame_max * @rate
      @timings = @animation.timings
      @timing_size = @timings.size
      @timing_frame = @timing_size > 0 ? @timings[0].frame : 0
      @timing_index = 0
    end

    def update
      if (@duration -= 1) % @rate == 0
        if @duration > 0
          if @timing_index < @timing_size
            update_timing if @count >= @timing_frame
            @count += 1
            return false
          else
            return true
          end
        else
          return true
        end
      end
    end

    def update_timing
      while @timing_index < @timing_size
        break if @count < (@timing_frame = @timings[@timing_index].frame)
        timing = @timings[@timing_index]
        timing.se.play if PictureFlash::ANIMATION_SOUND
        timing.flash_duration * @rate
        @base_sprite.flash(timing.flash_color, timing.flash_duration * @rate)
        @timing_index += 1
      end
    end
  end
end

class Spriteset_Map
  alias fpic_create_pictures create_pictures
  def create_pictures
    fpic_create_pictures
    flash_picture_setup
  end

  alias fpic_dispose_pictures dispose_pictures
  def dispose_pictures
    fpic_dispose_pictures
    flash_picture_dispose
  end

  def flash_picture_setup
    PictureFlash.pictures = @picture_sprites
  end

  def flash_picture_dispose
    PictureFlash.pictures = nil
  end
end

class Sprite_Picture < Sprite
  attr_accessor :animation_effect
 
  alias fpic_update update
  def update
    fpic_update
    flash_picture_update
  end

  def flash_picture_update
    @animation_effect = nil if @animation_effect && @animation_effect.update
  end
end



スクリプトの機能はイベントコマンドのスクリプトから、
どちらもマップ上でのみ使用可能です。
色々と機能はありますが、ひとまずは最低限だけ紹介します。

「最前面アニメーション」

・TopmostAnimation.event(event_id, animation_id, mirror = false)

event_id -> イベントのID
animation_id -> アニメーションのID
mirror -> 反転表示フラグ(省略可)

指定したイベントにアニメーションを最前面に表示します。

例:

コード: 全て選択

TopmostAnimation.event(15, 79)


「ピクチャフラッシュ」

・PictureFlash.animation(id, animation_id)

id -> ピクチャ番号
animation_id -> アニメーションのID

指定したピクチャにアニメーションのフラッシュを適用をします。

例:

コード: 全て選択

PictureFlash.animation(1, 79)
スパイじゃなくてクラフターだっ!
RGSS3の素材とか作ってます。
https://under-overworld.hatenablog.jp/entry/rgss3-material
GT_VXACE
記事: 10
登録日時: 2023年1月29日(日) 12:47

Re: 星潟さまの「ピクチャの上にアニメーション・フラッシュ」のアニメーション表示位置を指定したい

投稿記事by GT_VXACE » 2024年1月20日(土) 17:31

ありがとうございます!

まだ確認できていませんが
後ほど確認してみます!

“VX / Ace:質問” へ戻る