(Vx Ace) Evento Orbitante

6 Respostas   152 Visualizações

0 Membros e 1 Visitante estão vendo este tópico.

Jardel Junior

  • *
  • Posts: 74
  • Ouros: 18
Tópico criado em: 10/06/2018 às 12:45

Fala galera, gostaria que me ajudassem a fazer eventos orbirtarem uns aos outros, pois minha tentativa de fazer isso manualmente por eventos fracassou mizeravelmente (os eventos não se sincronizavam caso o evento no centro se movesse). Tentei usar senos e cossenos, coordenadas em variáveis, mas para cada evento eram muitos dados usados, e preciso de algo mais geral pra economizar essas variáveis (e trabalho de configurar cada uma individualmente rsrsrsrs), e um código cairia como uma luva, mas meu rgss tá enferrujado, então conto com o apoio de quem de dispor a me ajudar com isso. Valeu e até a próxima.

Corvo

Resposta 1: 10/06/2018 às 12:52

Você precisa que um evento se mova em torno de outro? Precisa ser necessariamente um evento? Não garanto que eu consiga, mas imagino que uma partícula seria bem mais fácil.

Jardel Junior

  • *
  • Posts: 74
  • Ouros: 18
Resposta 2: 10/06/2018 às 12:59

Você precisa que um evento se mova em torno de outro? Precisa ser necessariamente um evento? Não garanto que eu consiga, mas imagino que uma partícula seria bem mais fácil.

infelizmente sim, pois uso abs, e o evento orbitando é um inimigo, uma partícula seria bem simples, mas não poderia ser atacada.

Corvo

Resposta 3: 10/06/2018 às 13:04

Vish, aí complica. Qual seria o ABS? Porque é possível que só fazer o evento girar em torno do outro evento não seja o suficiente, embora seja uma tentativa válida. Por exemplo, com o SAS já não funcionaria porque certamente iria conflitar com a movimentação por pixels.

Jardel Junior

  • *
  • Posts: 74
  • Ouros: 18
Resposta 4: 10/06/2018 às 13:09

Vish, aí complica. Qual seria o ABS? Porque é possível que só fazer o evento girar em torno do outro evento não seja o suficiente, embora seja uma tentativa válida. Por exemplo, com o SAS já não funcionaria porque certamente iria conflitar com a movimentação por pixels.

Uso o XAS, e não uso movimentação por pixel (pra evitar uns problemas)

Shiroyasha

  • *
  • Posts: 277
  • Ouros: 342
  • Viajando por aí.
  • Medalhas Participantes do Maps Together 2
Resposta 5: 10/06/2018 às 15:16

Bem, a esta altura você já deve ter percebido que os eventos não conseguem executar um movimento circular ao redor de outros eventos de maneira natural por causa do tamanho dos tiles pelos quais se movimentam. No entanto você pode forçar com que os sprites dos eventos circulem ao redor do evento origem.
Um script do Tomoaky permite isso inclusive.

Código: [Selecionar]
#==============================================================================
# ★ RGSS3_キャラクター表示拡張 Ver1.1
#==============================================================================
=begin

作者:tomoaky
webサイト:ひきも記は閉鎖しました。 (http://hikimoki.sakura.ne.jp/)

キャラクタースプライトに以下の機能を追加します。
  ・表示座標の補正
  ・任意の拡大率に変更
  ・任意の回転角度に変更
  ・拡大縮小アニメーション
  ・ふらふらアニメーション
  ・円運動アニメーション

イベントコマンド『スクリプト』で以下のコマンドが使えるようになります。
  set_shift(event_id, shift_x, shift_y)
    指定したIDのイベントのをX方向に shift_x、Y方向に shift_y だけ
    ずらして表示します。
 
  set_angle(event_id, angle)
    指定したIDのイベントの回転角度を angle に変更します(0 ~ 360)

  set_zoom(event_id, zoom_x, zoom_y)
    指定したIDのイベントの拡大率を zoom_x, zoom_y に変更します、
    zoom(1, 1.5, 3.0) とした場合はイベントID1を横1.5倍、縦3倍。
    zoom_y を省略した場合は縦横ともに zoom_x の値に変更します
 
  set_zoom_anime(event_id, flag)
    指定したIDのイベントが拡大と縮小を繰り返すようになります。
    flag が true なら機能オン、false なら機能オフ
   
  set_swing_anime(event_id, angle)
    指定したIDのイベントがふらふらと揺れるようになります。
    angle には揺れ幅を指定してください(0 ~ 360)、省略すると止まります
 
  set_circle_anime(event_id, dist)
    指定したIDのイベントが円運動をするようになります。
    dist には半径を指定してください、省略すると止まります。
    移動するのはスプライトだけなので、イベントの位置は変化しません。
 
  set_cycle(event_id, cycle)
    指定したIDのイベントのアニメーション周期を cycle に変更します、
    対象となるのは拡大縮小アニメ、ふらふらアニメ、円運動アニメの3つです。
    初期値は 256

  event_id に 0 を指定すると実行中のイベント自身が対象となり、
  -1 を指定すればプレイヤーが対象となります。

スクリプトコマンドを使う方法以外に、イベント名や注釈コマンドを使って
設定することもできます。以下の文字列をイベント名か注釈に加えてください。
  <zm 1.5, 2.0> … 拡大率の設定、横1.5倍、縦2倍
  <an 45> … 回転角度の設定、半時計回りに45度
  <za>   … 拡大縮小アニメーションを有効にする
  <sa 30> … ふらふらアニメーションを有効にする、揺れ幅30度
  <ca 16> … 円運動アニメーションを有効にする、半径16ドット
  <cy 128> … アニメーション周期の設定、1周128フレーム
 
  注釈コマンドを使う場合は必ずイベント実行内容の一番上で設定してください。
 
 
=== 注意 ===
 ・設定したパラメータはイベントページの変更などによって初期化されます、
  イベントコマンドとイベント名、注釈をうまく使い分けてください。

2015/09/10  Ver1.1
  ・表示座標を補正する set_shift コマンドを追加
  ・イベントコマンド『移動ルートの設定』に対応

2011/12/21  Ver1.01
  ・並列処理で event_id に 0 を指定するとエラーが発生する不具合を修正
 
2011/12/15 Ver1.0
  公開
 
=end

#==============================================================================
# □ コマンド
#==============================================================================
module TMSPREX
module Commands
  #--------------------------------------------------------------------------
  # ○ キャラクタースプライトの座標補正値を変更
  #--------------------------------------------------------------------------
  def set_shift(id, shift_x, shift_y)
    target = get_character(id)
    return unless target
    target.shift_x_ex = shift_x
    target.shift_y_ex = shift_y
  end
  #--------------------------------------------------------------------------
  # ○ キャラクタースプライトの回転角度を変更
  #--------------------------------------------------------------------------
  def set_angle(id, n = 0)
    target = get_character(id)
    target.angle = n if target
  end
  #--------------------------------------------------------------------------
  # ○ キャラクタースプライトの拡大率を変更
  #--------------------------------------------------------------------------
  def set_zoom(id, zoom_x, zoom_y = nil)
    target = get_character(id)
    return unless target
    zoom_y ||= zoom_x
    target.zoom_x, target.zoom_y = zoom_x, zoom_y
  end
  #--------------------------------------------------------------------------
  # ○ キャラクタースプライトのズームアニメを変更
  #--------------------------------------------------------------------------
  def set_zoom_anime(id, flag = true)
    target = get_character(id)
    target.zoom_anime = flag if target
  end
  #--------------------------------------------------------------------------
  # ○ キャラクタースプライトのふらふら状態を変更
  #--------------------------------------------------------------------------
  def set_swing_anime(id, n = nil)
    target = get_character(id)
    return unless target
    target.swing_anime = n
    target.angle = 0 unless n
  end
  #--------------------------------------------------------------------------
  # ○ キャラクタースプライトの円運動状態を変更
  #--------------------------------------------------------------------------
  def set_circle_anime(id, n = nil)
    target = get_character(id)
    target.circle_anime = n if target
  end
  #--------------------------------------------------------------------------
  # ○ キャラクタースプライトの拡張アニメーション周期を変更
  #--------------------------------------------------------------------------
  def set_cycle(id, n = 256)
    target = get_character(id)
    target.ex_count_max = n if target
  end
end
end # module TMSPREX

#==============================================================================
# ■ Game_Character
#==============================================================================
class Game_Character
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :shift_x_ex               # X方向の拡大率
  attr_accessor :shift_y_ex               # Y方向の拡大率
  attr_accessor :zoom_x                   # X方向の拡大率
  attr_accessor :zoom_y                   # Y方向の拡大率
  attr_accessor :angle                    # 回転角度
  attr_accessor :zoom_anime               # ズームアニメフラグ
  attr_accessor :swing_anime              # ふらふらフラグ
  attr_accessor :circle_anime             # 円運動フラグ
  attr_accessor :ex_count_max             # アニメーション周期
  #--------------------------------------------------------------------------
  # ● 公開メンバ変数の初期化
  #--------------------------------------------------------------------------
  alias tmsprex_game_character_init_public_members init_public_members
  def init_public_members
    tmsprex_game_character_init_public_members
    clear_ex_param
  end
  #--------------------------------------------------------------------------
  # ● 画面 X 座標の取得
  #--------------------------------------------------------------------------
  def screen_x
    super + @shift_x_ex
  end
  #--------------------------------------------------------------------------
  # ● 画面 Y 座標の取得
  #--------------------------------------------------------------------------
  def screen_y
    super + @shift_y_ex
  end
  #--------------------------------------------------------------------------
  # ○ キャラクター拡張用パラメータの初期化
  #--------------------------------------------------------------------------
  def clear_ex_param
    @shift_x_ex = 0
    @shift_y_ex = 0
    @zoom_x = 1.0
    @zoom_y = 1.0
    @angle = 0
    @zoom_anime = false
    @swing_anime = nil
    @circle_anime = nil
    @ex_count_max = 256
  end
end

#==============================================================================
# ■ Game_Event
#==============================================================================
class Game_Event < Game_Character
  include TMSPREX::Commands
  #--------------------------------------------------------------------------
  # ● イベントページの設定をセットアップ
  #--------------------------------------------------------------------------
  alias tmsprex_game_event_setup_page_settings setup_page_settings
  def setup_page_settings
    tmsprex_game_event_setup_page_settings
    clear_ex_param
    if @list
      if /<zm\s+(\d+(?:\.\d+)?)\s*\,\s*(\d+(?:\.\d+)?)>/i =~ @event.name
        @zoom_x, @zoom_y = $1.to_f, $2.to_f
      end
      @angle = $1.to_i if /<an\s*(\d+)>/i =~ @event.name
      @zoom_anime = true if /<za>/i =~ @event.name
      @swing_anime = $1.to_i if /<sa\s+(\d+)>/i =~ @event.name
      @circle_anime = $1.to_i if /<ca\s+(\d+)>/i =~ @event.name
      @ex_count_max = $1.to_i if /<cy\s+(\d+)>/i =~ @event.name
      @list.each do |list|
        if list.code == 108 || list.code == 408
          text = list.parameters[0]
          if /<zm\s+(\d+(?:\.\d+)?)\s*\,\s*(\d+(?:\.\d+)?)>/i =~ text
            @zoom_x, @zoom_y = $1.to_f, $2.to_f
          end
          @angle = $1.to_i if /<an\s*(\d+)>/i =~ text
          @zoom_anime = true if /<za>/i =~ text
          @swing_anime = $1.to_i if /<sa\s+(\d+)>/i =~ text
          @circle_anime = $1.to_i if /<ca\s+(\d+)>/i =~ text
          @ex_count_max = $1.to_i if /<cy\s+(\d+)>/i =~ text
        else
          break
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ○ キャラクターの取得
  #     param : -1 ならプレイヤー、0 ならこのイベント、それ以外はイベント ID
  #--------------------------------------------------------------------------
  def get_character(param)
    if param < 0
      $game_player
    else
      $game_map.events[param > 0 ? param : @id]
    end
  end
end

#==============================================================================
# ■ Sprite_Character
#==============================================================================
class Sprite_Character < Sprite_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     viewport  : ビューポート
  #     character : キャラクター (Game_Character)
  #--------------------------------------------------------------------------
  alias tmsprex_sprite_character_initialize initialize
  def initialize(viewport, character = nil)
    @ex_count = 0                         # 特殊演出用のカウンタ
    tmsprex_sprite_character_initialize(viewport, character)
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias tmsprex_sprite_character_update update
  def update
    tmsprex_sprite_character_update
    @ex_count = (@ex_count + 1) % @character.ex_count_max
    n = @character.ex_count_max / 2
    if @character.zoom_anime              # ズームアニメの更新
      self.zoom_x = Math.sin(Math::PI * @ex_count / n) * 0.5 + 1.5
      self.zoom_y = self.zoom_x
    else
      self.zoom_x, self.zoom_y = @character.zoom_x, @character.zoom_y
    end
    if @character.swing_anime             # ふらふら状態の更新
      self.angle = Math.sin(Math::PI * @ex_count / n) * @character.swing_anime
    else
      self.angle = @character.angle
    end
    if @character.circle_anime            # 円運動状態の更新
      a = Math::PI * @ex_count / n
      self.x += Math.sin(a) * @character.circle_anime
      self.y += Math.cos(a) * @character.circle_anime
    end
  end
end

#==============================================================================
# ■ Game_Interpreter
#==============================================================================
class Game_Interpreter
  include TMSPREX::Commands
end



Então você pode, por exemplo, incluir um comentário em um evento inimigo com:

Código: [Selecionar]
<ca 32>
<cy 128>

e definir uma rota para que ele siga o herói definindo sua prioridade para abaixo do mesmo de modo que ele sempre esteja abaixo do personagem.
Deste modo o sprite do evento executará um movimento circular perfeito, mas você ainda terá que usar algum outro meio para determinar se o sprite será acertável ou não (direção do personagem em relação onde o sprite está, etc...). Não é a solução mais simples, mas no momento é o mais próximo que me recordo já ter visto.

Este script está disponível em uma demo funcional presente aqui. Muito embora só exista um exemplo de uso nela (siga ao norte e procure uma borboleta azul) talvez seja útil.

o/

Jardel Junior

  • *
  • Posts: 74
  • Ouros: 18
Resposta 6: 10/06/2018 às 16:34

Bem, a esta altura você já deve ter percebido que os eventos não conseguem executar um movimento circular ao redor de outros eventos de maneira natural por causa do tamanho dos tiles pelos quais se movimentam. No entanto você pode forçar com que os sprites dos eventos circulem ao redor do evento origem.
Um script do Tomoaky permite isso inclusive.

Código: [Selecionar]
#==============================================================================
# ★ RGSS3_キャラクター表示拡張 Ver1.1
#==============================================================================
=begin

作者:tomoaky
webサイト:ひきも記は閉鎖しました。 (http://hikimoki.sakura.ne.jp/)

キャラクタースプライトに以下の機能を追加します。
  ・表示座標の補正
  ・任意の拡大率に変更
  ・任意の回転角度に変更
  ・拡大縮小アニメーション
  ・ふらふらアニメーション
  ・円運動アニメーション

イベントコマンド『スクリプト』で以下のコマンドが使えるようになります。
  set_shift(event_id, shift_x, shift_y)
    指定したIDのイベントのをX方向に shift_x、Y方向に shift_y だけ
    ずらして表示します。
 
  set_angle(event_id, angle)
    指定したIDのイベントの回転角度を angle に変更します(0 ~ 360)

  set_zoom(event_id, zoom_x, zoom_y)
    指定したIDのイベントの拡大率を zoom_x, zoom_y に変更します、
    zoom(1, 1.5, 3.0) とした場合はイベントID1を横1.5倍、縦3倍。
    zoom_y を省略した場合は縦横ともに zoom_x の値に変更します
 
  set_zoom_anime(event_id, flag)
    指定したIDのイベントが拡大と縮小を繰り返すようになります。
    flag が true なら機能オン、false なら機能オフ
   
  set_swing_anime(event_id, angle)
    指定したIDのイベントがふらふらと揺れるようになります。
    angle には揺れ幅を指定してください(0 ~ 360)、省略すると止まります
 
  set_circle_anime(event_id, dist)
    指定したIDのイベントが円運動をするようになります。
    dist には半径を指定してください、省略すると止まります。
    移動するのはスプライトだけなので、イベントの位置は変化しません。
 
  set_cycle(event_id, cycle)
    指定したIDのイベントのアニメーション周期を cycle に変更します、
    対象となるのは拡大縮小アニメ、ふらふらアニメ、円運動アニメの3つです。
    初期値は 256

  event_id に 0 を指定すると実行中のイベント自身が対象となり、
  -1 を指定すればプレイヤーが対象となります。

スクリプトコマンドを使う方法以外に、イベント名や注釈コマンドを使って
設定することもできます。以下の文字列をイベント名か注釈に加えてください。
  <zm 1.5, 2.0> … 拡大率の設定、横1.5倍、縦2倍
  <an 45> … 回転角度の設定、半時計回りに45度
  <za>   … 拡大縮小アニメーションを有効にする
  <sa 30> … ふらふらアニメーションを有効にする、揺れ幅30度
  <ca 16> … 円運動アニメーションを有効にする、半径16ドット
  <cy 128> … アニメーション周期の設定、1周128フレーム
 
  注釈コマンドを使う場合は必ずイベント実行内容の一番上で設定してください。
 
 
=== 注意 ===
 ・設定したパラメータはイベントページの変更などによって初期化されます、
  イベントコマンドとイベント名、注釈をうまく使い分けてください。

2015/09/10  Ver1.1
  ・表示座標を補正する set_shift コマンドを追加
  ・イベントコマンド『移動ルートの設定』に対応

2011/12/21  Ver1.01
  ・並列処理で event_id に 0 を指定するとエラーが発生する不具合を修正
 
2011/12/15 Ver1.0
  公開
 
=end

#==============================================================================
# □ コマンド
#==============================================================================
module TMSPREX
module Commands
  #--------------------------------------------------------------------------
  # ○ キャラクタースプライトの座標補正値を変更
  #--------------------------------------------------------------------------
  def set_shift(id, shift_x, shift_y)
    target = get_character(id)
    return unless target
    target.shift_x_ex = shift_x
    target.shift_y_ex = shift_y
  end
  #--------------------------------------------------------------------------
  # ○ キャラクタースプライトの回転角度を変更
  #--------------------------------------------------------------------------
  def set_angle(id, n = 0)
    target = get_character(id)
    target.angle = n if target
  end
  #--------------------------------------------------------------------------
  # ○ キャラクタースプライトの拡大率を変更
  #--------------------------------------------------------------------------
  def set_zoom(id, zoom_x, zoom_y = nil)
    target = get_character(id)
    return unless target
    zoom_y ||= zoom_x
    target.zoom_x, target.zoom_y = zoom_x, zoom_y
  end
  #--------------------------------------------------------------------------
  # ○ キャラクタースプライトのズームアニメを変更
  #--------------------------------------------------------------------------
  def set_zoom_anime(id, flag = true)
    target = get_character(id)
    target.zoom_anime = flag if target
  end
  #--------------------------------------------------------------------------
  # ○ キャラクタースプライトのふらふら状態を変更
  #--------------------------------------------------------------------------
  def set_swing_anime(id, n = nil)
    target = get_character(id)
    return unless target
    target.swing_anime = n
    target.angle = 0 unless n
  end
  #--------------------------------------------------------------------------
  # ○ キャラクタースプライトの円運動状態を変更
  #--------------------------------------------------------------------------
  def set_circle_anime(id, n = nil)
    target = get_character(id)
    target.circle_anime = n if target
  end
  #--------------------------------------------------------------------------
  # ○ キャラクタースプライトの拡張アニメーション周期を変更
  #--------------------------------------------------------------------------
  def set_cycle(id, n = 256)
    target = get_character(id)
    target.ex_count_max = n if target
  end
end
end # module TMSPREX

#==============================================================================
# ■ Game_Character
#==============================================================================
class Game_Character
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :shift_x_ex               # X方向の拡大率
  attr_accessor :shift_y_ex               # Y方向の拡大率
  attr_accessor :zoom_x                   # X方向の拡大率
  attr_accessor :zoom_y                   # Y方向の拡大率
  attr_accessor :angle                    # 回転角度
  attr_accessor :zoom_anime               # ズームアニメフラグ
  attr_accessor :swing_anime              # ふらふらフラグ
  attr_accessor :circle_anime             # 円運動フラグ
  attr_accessor :ex_count_max             # アニメーション周期
  #--------------------------------------------------------------------------
  # ● 公開メンバ変数の初期化
  #--------------------------------------------------------------------------
  alias tmsprex_game_character_init_public_members init_public_members
  def init_public_members
    tmsprex_game_character_init_public_members
    clear_ex_param
  end
  #--------------------------------------------------------------------------
  # ● 画面 X 座標の取得
  #--------------------------------------------------------------------------
  def screen_x
    super + @shift_x_ex
  end
  #--------------------------------------------------------------------------
  # ● 画面 Y 座標の取得
  #--------------------------------------------------------------------------
  def screen_y
    super + @shift_y_ex
  end
  #--------------------------------------------------------------------------
  # ○ キャラクター拡張用パラメータの初期化
  #--------------------------------------------------------------------------
  def clear_ex_param
    @shift_x_ex = 0
    @shift_y_ex = 0
    @zoom_x = 1.0
    @zoom_y = 1.0
    @angle = 0
    @zoom_anime = false
    @swing_anime = nil
    @circle_anime = nil
    @ex_count_max = 256
  end
end

#==============================================================================
# ■ Game_Event
#==============================================================================
class Game_Event < Game_Character
  include TMSPREX::Commands
  #--------------------------------------------------------------------------
  # ● イベントページの設定をセットアップ
  #--------------------------------------------------------------------------
  alias tmsprex_game_event_setup_page_settings setup_page_settings
  def setup_page_settings
    tmsprex_game_event_setup_page_settings
    clear_ex_param
    if @list
      if /<zm\s+(\d+(?:\.\d+)?)\s*\,\s*(\d+(?:\.\d+)?)>/i =~ @event.name
        @zoom_x, @zoom_y = $1.to_f, $2.to_f
      end
      @angle = $1.to_i if /<an\s*(\d+)>/i =~ @event.name
      @zoom_anime = true if /<za>/i =~ @event.name
      @swing_anime = $1.to_i if /<sa\s+(\d+)>/i =~ @event.name
      @circle_anime = $1.to_i if /<ca\s+(\d+)>/i =~ @event.name
      @ex_count_max = $1.to_i if /<cy\s+(\d+)>/i =~ @event.name
      @list.each do |list|
        if list.code == 108 || list.code == 408
          text = list.parameters[0]
          if /<zm\s+(\d+(?:\.\d+)?)\s*\,\s*(\d+(?:\.\d+)?)>/i =~ text
            @zoom_x, @zoom_y = $1.to_f, $2.to_f
          end
          @angle = $1.to_i if /<an\s*(\d+)>/i =~ text
          @zoom_anime = true if /<za>/i =~ text
          @swing_anime = $1.to_i if /<sa\s+(\d+)>/i =~ text
          @circle_anime = $1.to_i if /<ca\s+(\d+)>/i =~ text
          @ex_count_max = $1.to_i if /<cy\s+(\d+)>/i =~ text
        else
          break
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ○ キャラクターの取得
  #     param : -1 ならプレイヤー、0 ならこのイベント、それ以外はイベント ID
  #--------------------------------------------------------------------------
  def get_character(param)
    if param < 0
      $game_player
    else
      $game_map.events[param > 0 ? param : @id]
    end
  end
end

#==============================================================================
# ■ Sprite_Character
#==============================================================================
class Sprite_Character < Sprite_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     viewport  : ビューポート
  #     character : キャラクター (Game_Character)
  #--------------------------------------------------------------------------
  alias tmsprex_sprite_character_initialize initialize
  def initialize(viewport, character = nil)
    @ex_count = 0                         # 特殊演出用のカウンタ
    tmsprex_sprite_character_initialize(viewport, character)
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias tmsprex_sprite_character_update update
  def update
    tmsprex_sprite_character_update
    @ex_count = (@ex_count + 1) % @character.ex_count_max
    n = @character.ex_count_max / 2
    if @character.zoom_anime              # ズームアニメの更新
      self.zoom_x = Math.sin(Math::PI * @ex_count / n) * 0.5 + 1.5
      self.zoom_y = self.zoom_x
    else
      self.zoom_x, self.zoom_y = @character.zoom_x, @character.zoom_y
    end
    if @character.swing_anime             # ふらふら状態の更新
      self.angle = Math.sin(Math::PI * @ex_count / n) * @character.swing_anime
    else
      self.angle = @character.angle
    end
    if @character.circle_anime            # 円運動状態の更新
      a = Math::PI * @ex_count / n
      self.x += Math.sin(a) * @character.circle_anime
      self.y += Math.cos(a) * @character.circle_anime
    end
  end
end

#==============================================================================
# ■ Game_Interpreter
#==============================================================================
class Game_Interpreter
  include TMSPREX::Commands
end



Então você pode, por exemplo, incluir um comentário em um evento inimigo com:

Código: [Selecionar]
<ca 32>
<cy 128>

e definir uma rota para que ele siga o herói definindo sua prioridade para abaixo do mesmo de modo que ele sempre esteja abaixo do personagem.
Deste modo o sprite do evento executará um movimento circular perfeito, mas você ainda terá que usar algum outro meio para determinar se o sprite será acertável ou não (direção do personagem em relação onde o sprite está, etc...). Não é a solução mais simples, mas no momento é o mais próximo que me recordo já ter visto.

Este script está disponível em uma demo funcional presente aqui. Muito embora só exista um exemplo de uso nela (siga ao norte e procure uma borboleta azul) talvez seja útil.

o/

acho que isso é o máximo possível mesmo. . . o script funcionou aqui, mas o que eu buscava era algo além do sprite se movendo, podia ser até um evento se movendo ao redor de outro em uma órbita quadrada kkkkkkkkk mas obrigado pela consideração, vou continuar tentando aqui