O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

[2.0] Dinamic Sound Areas :: modern algebra

Iniciado por LoboShow, 02/12/2012 às 20:47

Dinamic Sounds Areas


.Introdução

Este script permite que você defina um BGM, BGS, SE e ME para áreas ou eventos, ele também irá dinâmicamente ajustar o volume dependendo da distância do personagem para esta área ou evento. Criando assim a impressão de que aquele som está sendo emitido daquela área ou evento.


.Instrucoes

Coloque este script entre "Scripts Adicionais" e "Principal".

Para configurar um evento, tudo que você precisa é colocar um comentário na primeira linha de uma página com qualquer um dos códigos abaixo:

\SNDEMIT[parâmetro = valor]

Os possíveis parâmetros são:

bgm_name = Nome do BGM que você deseja emitir            (Padrão = '')
bgm_pitch = O pitch do BGM, de 50 a 150                  (Padrão = 100)
bgm_radius = O raio, em quadrados, da escala do BGM      (Padrão = 10)
bgm_max_volume = O volume máximo do BGM                  (Padrão = 100)
bgs_name = Nome do BGS que você deseja emitir            (Padrão = '')
bgs_pitch = O pitch do BGS, de 50 a 150                  (Padrão = 100)
bgs_radius = O raio, em quadrados, da escala do BGS      (Padrão = 10)
bgs_max_volume = O volume máximo do BGS                  (Padrão = 100)   
se_name = Nome do SE que deseja emitir para esta área    (Padrão = '')
se_pitch = O pitch do SE, de 50 a 150                    (Padrão = 100)
se_radius = O raio, em quadrados, da escala do SE        (Padrão = 10)
se_max_volume = O volume máximo do SE                    (Padrão = 100)
se_frames = O número de frames enquanto toca o SE        (Padrão = 20)
se_frame_variance = A variação dos se_frames             (Padrão = 0)
me_name = Nome do ME que deseja emitir para esta área    (Padrão = '')
me_pitch = O pitch do ME, de 50 a 150                    (Padrão = 100)
me_radius = O raio, em quadrados, da escala do ME        (Padrão = 10) 
me_max_volume = O volume máximo do ME                    (Padrão = 100)
me_frames = O número de frames enquanto toca o ME        (Padrão = 20)
me_frame_variance = A variação dos me_frames             (Padrão = 0)

EXEMPLO:
Configure isso no comentário de um evento:

\sndemit[se_name = 'Chicken']
\SndEmit[se_max_volume = 80]
\sNdeMit[se_frames = 440]
\SNDEMIT[se_frame_variance = 60]

E o evento irá tocar o efeito sonoro 'Chicken' com o volume máximo de 80, em uma escala de 10. Ele irá repetir esse SE entre 380 - 500 frames.

Para saber como configurar as áreas para emitir sons, veja a parte: REGIÃO CONFIGURÁVEL no script.


.Script
#==============================================================================
#  Dynamic Sound Emitting Areas (VX)
#  Versão 2.0
#  Autor: modern algebra
#  Data: 9 de Agosto, 2008
#  Tradução: Bennamy :: Amy Productions
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Descrição:
#    Este script permite que você defina um bgm, bgs, se e me para áreas ou
#    eventos, e ele irá dinâmicamente ajustar o volume dependendo da distância
#    do personagem para esta área ou evento. Criando assim a impressão de que
#    aquele som está sendo emitido daquela área ou evento.
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Instruções:
#
#    Para configurar um evento, tudo que você precisa é colocar um comentário na
#    primeira linha de uma página com qualquer um dos códigos abaixo:
#
#      \SNDEMIT[parâmetro = valor]
#
#    Os possíveis parâmetros são:
#
#      bgm_name = Nome do BGM que você deseja emitir            (Padrão = '')
#      bgm_pitch = O pitch do BGM, de 50 a 150                  (Padrão = 100)
#      bgm_radius = O raio, em quadrados, da escala do BGM      (Padrão = 10)
#      bgm_max_volume = O volume máximo do BGM                  (Padrão = 100)
#      bgs_name = Nome do BGS que você deseja emitir            (Padrão = '')
#      bgs_pitch = O pitch do BGS, de 50 a 150                  (Padrão = 100)
#      bgs_radius = O raio, em quadrados, da escala do BGS      (Padrão = 10)
#      bgs_max_volume = O volume máximo do BGS                  (Padrão = 100)    
#      se_name = Nome do SE que deseja emitir para esta área    (Padrão = '')
#      se_pitch = O pitch do SE, de 50 a 150                    (Padrão = 100)
#      se_radius = O raio, em quadrados, da escala do SE        (Padrão = 10)
#      se_max_volume = O volume máximo do SE                    (Padrão = 100)
#      se_frames = O número de frames enquanto toca o SE        (Padrão = 20)
#      se_frame_variance = A variação dos se_frames             (Padrão = 0)
#      me_name = Nome do ME que deseja emitir para esta área    (Padrão = '')
#      me_pitch = O pitch do ME, de 50 a 150                    (Padrão = 100)
#      me_radius = O raio, em quadrados, da escala do ME        (Padrão = 10)  
#      me_max_volume = O volume máximo do ME                    (Padrão = 100)
#      me_frames = O número de frames enquanto toca o ME        (Padrão = 20)
#      me_frame_variance = A variação dos me_frames             (Padrão = 0)
#
#    EXEMPLO:
#     Configure isso no comentário de um evento:
#
#      \sndemit[se_name = 'Chicken']
#      \SndEmit[se_max_volume = 80]
#      \sNdeMit[se_frames = 440]
#      \SNDEMIT[se_frame_variance = 60]
#
#    E o evento irá tocar o efeito sonoro 'Chicken' com o volume máximo de 80,
#   em uma escala de 10. Ele irá repetir esse SE entre 380 - 500 frames
#==============================================================================

#==============================================================================
# ** RPG::Area
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Summary of Changes:
#    new instance variables - se_frames, se_frame_variance, me_frames,
#                             me_frame_variance
#    new methods - setup_sound_emissions, bgm, bgs, me, se, bgm?, bgs?, se?,
#                me?, volume, update_se, update_me
#==============================================================================

class RPG::Area
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Public Instance Variables
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  attr_reader   :sound_emission
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Setup Sound Emissions
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def setup_sound_emissions
    s = @sound_emission = RPG::Sound_Emission.new
    case @id
    #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    #  !*!*! REGIÃO CONFIGURÁVEL
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    #  Configurar esta região desta maneira:
    #    
    #    when id_área
    #      s.parâmetro = valor
    #
    #     Os parâmetros e possíveis valores são gravados no início.
    #   Você pode configurar quantos você desejar.
    #
    #  EXEMPLO:
    #    when 1 # Cachoeira (Nesta demo)
    #      # BGS
    #      s.bgs_name = 'River'
    #      s.bgs_radius = 15
    #      s.bgs_max_volume = 110
    #
    #    Isso irá fazer a Area de ID 1 emitir o BGS 'River' no volume máximo de
    #    110 dentro de um raio de 15 quadrados
    #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
    when 1 # Área 1
      s.bgs_name = 'River' # Nome do BGS que irá emitir
      s.bgs_radius = 15 # O raio em que o BGS será emitido
      s.bgs_max_volume = 110 # O volume máximo do BGS
    when 4 # Área 4
    #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
    #  !*!*! FIM DA REGIÃO CONFIGURÁVEL
    #////////////////////////////////////////////////////////////////////////
    end
    @sound_emission.rect = self.rect
    @sound_emission.initialize_frame_counts
  end
end

#==============================================================================
# ** RPG::Sound_Emission
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  This class holds data relating to a sound emitting area
#==============================================================================

class RPG::Sound_Emission
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Public Instance Variables
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  attr_accessor :rect
  attr_accessor :bgs_name
  attr_accessor :bgs_pitch
  attr_accessor :bgs_radius
  attr_accessor :bgs_max_volume
  attr_accessor :bgm_name
  attr_accessor :bgm_pitch
  attr_accessor :bgm_radius
  attr_accessor :bgm_max_volume
  attr_accessor :se_name
  attr_accessor :se_pitch
  attr_accessor :se_radius
  attr_accessor :se_max_volume
  attr_accessor :se_frames
  attr_accessor :se_frame_variance
  attr_accessor :me_name
  attr_accessor :me_pitch
  attr_accessor :me_radius
  attr_accessor :me_max_volume
  attr_accessor :me_frames
  attr_accessor :me_frame_variance
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Setup Sound Emissions
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def initialize
    # Set Default Values
    @rect = Rect.new (0, 0, 0, 0)
    # Default values
    @bgs_name, @bgs_pitch, @bgs_radius, @bgs_max_volume, @bgm_name, @bgm_pitch,
      @bgm_radius, @bgm_max_volume, @se_name, @se_pitch, @se_radius,
      @se_max_volume, @me_name, @me_pitch, @me_radius, @me_max_volume,
      @se_frames, @se_frame_variance, @me_frames, @me_frame_variance = '', 100,
      10, 100, '', 100, 10, 100, '', 100, 10, 100 , '', 100, 10, 100, 20, 0, 20, 0
    initialize_frame_counts
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Initialize Frame Counts
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def initialize_frame_counts
    @se_frame_count = @se_frames + rand (2*@se_frame_variance).floor - @se_frame_variance
    @me_frame_count = @me_frames + rand (2*@me_frame_variance).floor - @me_frame_variance
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Update Sound
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def update
    @stopped = false
    bgm.play if @bgm_name != ''
    bgs.play if @bgs_name != ''
    update_se if @se_name != ''
    update_me if @me_name != ''
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Stop Sound
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def stop
    return if @stopped
    RPG::BGM.stop if @bgm_name != ''
    RPG::BGS.stop if @bgs_name != ''
    @stopped = true
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * BGM
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def bgm
    @bgm = RPG::BGM.new (@bgm_name, 0, @bgm_pitch) if @bgm == nil
    @bgm.volume = volume (@bgm_radius, @bgm_max_volume)
    return @bgm
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * BGS
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def bgs
    @bgs = RPG::BGS.new (@bgs_name, 0, @bgs_pitch) if @bgs == nil
    @bgs.volume = volume (@bgs_radius, @bgs_max_volume)
    return @bgs
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * SE
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def se
    @se = RPG::SE.new (@se_name, 0, @se_pitch) if @se == nil
    @se.volume = volume (@se_radius, @se_max_volume)
    return @se
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * SE Update
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def update_se
    if @se_frame_count == 0
      se.play
      @se_frame_count = @se_frames + rand (2*@se_frame_variance).floor - @se_frame_variance
    else
      @se_frame_count -= 1
    end
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * ME
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def me
    @me = RPG::ME.new (@me_name, 0, @me_pitch) if @me == nil
    @me.volume = volume (@me_radius, @me_max_volume)
    return @me
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * ME Update
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def update_me
    if @me_frame_count == 0
      me.play
      @me_frame_count = @me_frames + rand (2*@me_frame_variance).floor - @me_frame_variance
    else
      @me_frame_count -= 1
    end
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Volume
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def volume (radius, max_volume)
    x, y = $game_player.x, $game_player.y
    # Determine distance between position and the sound emitting object
    xd, yd = x - @rect.x, y - @rect.y
    # Evaluate X distance
    xd > 0 ? xd = x.between? (@rect.x, @rect.x + @rect.width) ? 0 : xd - @rect.width : xd *= -1
    # Evaluate Y distance
    yd > 0 ? yd = y.between? (@rect.y, @rect.y + @rect.height) ? 0 :yd - @rect.height : yd *= -1
    # Calculate the total distance
    total_distance = Math.sqrt(xd*xd + yd*yd).ceil.to_i
    # Get the percentage of max volume
    percent = (total_distance.to_f / radius.to_f)*100
    percent = (100 - [percent, 100].min).to_f / 100.0
    return (percent*max_volume.to_f).to_i
  end
end

#==============================================================================
# ** Game_Event
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Summary of Changes:
#    aliased method - setup, update
#==============================================================================

class Game_Event
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Setup
  #    page : the new page
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias ma_sound_emit_obj_stp_event_pg_85nd setup
  def setup (new_page)
    # Run Original Method
    ma_sound_emit_obj_stp_event_pg_85nd (new_page)
    @sound_emission.stop unless @sound_emission.nil?
    # If page is legitimate
    unless @page == nil
      s = @sound_emission = RPG::Sound_Emission.new
      @sound_emission.rect = Rect.new (@x, @y, 1, 1)
      # Evaluate comments
      comments = []
      @page.list.each { |i| i.code == 108 || i.code == 408 ? comments.push (i) : break }
      # Evaluate comments for \SNDEMIT codes
      comments.each { |i|
        text = i.parameters[0].dup
        while text.sub! (/\\SNDEMIT\[(.+)\]/i) { '' } != nil
          eval ("@sound_emission." + $1.to_s)
        end
      }
    end
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Frame Update
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias modalg_snd_emssn_script_upd_evnt_4n2 update
  def update
    # Run Original Event
    modalg_snd_emssn_script_upd_evnt_4n2
    @sound_emission.rect.x, @sound_emission.rect.y = @x, @y
    @sound_emission.update
  end
end

#==============================================================================
# ** Game_Map
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Summary of Changes:
#    aliased method - update, setup
#==============================================================================

class Game_Map
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Setup
  #    map_id : the ID of the map
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias modalg_dynamic_snd_emit_stup_rn4 setup
  def setup(map_id)
    @areas.each { |area| area.sound_emission.stop } unless @areas.nil?
    # Run Original Method
    modalg_dynamic_snd_emit_stup_rn4 (map_id)
    # Get all areas that belong to this map
    @areas = []
    $data_areas.values.each { |area| @areas.push (area) if map_id == area.map_id }
    # Ensure Area Sound Effects are setup
    @areas.each { |i| i.setup_sound_emissions if i.sound_emission == nil }
    @advanced_areas = false
    begin
      # Test for exception thrown on .active?
      $data_areas[1].active?
      @advanced_areas = true
    rescue
    end
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Update
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias modalg_dyn_sound_emitting_objects_upd_4h3 update
  def update
    # Run Original Maphttp://centrorpg.com/Themes/CRM/images/bbc/hr.gif
    modalg_dyn_sound_emitting_objects_upd_4h3
    # For all area
    @areas.each { |area|
      @advanced_areas && !area.active? ? area.sound_emission.stop : area.sound_emission.update
      }
  end
end



Demo - Download


Créditos
Criador: modern algebra

Nossa esse script é show *-*, acho que é melhor do que o meu para o Ace, vou dar uma olhada geral para ver como foi feito, vlws por postar esse em especial vai me ajudar :D