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

[RMVX Ace] - Meu Primeiro Código - Ajudinha

Iniciado por Xogum, 29/10/2017 às 20:44

29/10/2017 às 20:44 Última edição: 30/10/2017 às 07:36 por Corvo
Saudações  :bruxo:

Bem pessoal, eu tenho assistido as aulas são ótimas do sir Alisson e tenho aprendido bastante coisa sobre Ruby, ainda não sei taaanta coisa assim e me enrolo bastante nessa área, mas estou gostando muito de ´´mexer´´ na matrix kkkk bem, infelizmente eu não tenho nenhum ´´talento´´ natural para lidar com essa área, realmente fico meio perdido e sinto uma dificuldade para entender algumas coisas muitas com isso eu venho humildemente pedir uma pequena ajudinha para vocês.

Tipo, eu estou tentando escrever um código que me permita tocar uma BGM no menu (aquele que você pressiona x) até ai tudo bem, eu quebrei a cabeça por umas horinhas e consegui chegar no seguinte código

class Scene_Menu < Scene_MenuBase 

  alias :prime_start :start 
  alias :prime_terminate :terminate
  alias :prime_command_window :create_command_window
  def start 
   prime_start 
   $audio_prime = RPG::BGM.new("IceTomb", 100, 100).play
   RPG::BGS.stop
   RPG::SE.stop 
  end
  
#----------------------------------------------------------------------------
# Finalização do Processo 
#----------------------------------------------------------------------------
  def terminate
   prime_terminate
   super
   dispose_background
   $audio_prime = RPG::BGM.stop
 end
end


Mas ele está com dois erros, pelo menos foi os que eu detectei por enquanto.

O 1º: Quando eu acesso o menu, as coisas funcionam como eu planejei. A música do mapa para e a do menu toca, mas quando eu entro em uma tela diferente do menu, tipo: item, equipamento, habilidade, etc... a música para, mas quando eu volto para o menu ela volta a tocar.

O 2º: Quando eu abro o menu a música e a BGS do mapa em que você estiver para de tocar. Até ai tudo bem, mas quando eu fecho o menu elas não voltam a tocar.

Tipo, como eu poderia resolver isso ?
Ou que área eu deveria dar uma revisada nos estudos e acrescentar um tempo extra para poder resolver essas questões; inclusive o Gerar comentou comigo para eu começar pelo Scene_Status, mas eu não consegui pensar o que eu poderia fazer por lá ou modificar, então tentei fazer isso, que eu acredito não ser tão difícil, mas exige um pouco de entendimento. Não que seja relevante, mas eu me perco muito, é realmente uma coisa bem nova pra mim.

Qualquer dúvida (caso eu tenha te deixado confuso) é só comentar que eu tento dar uma explicada melhor  :ded:

1 - Justamente ela para de tocar porque são cenas diferentes XD

Tipo você tá saindo da Scene_Menu que é onde você fez os comandos e indo pra outra.

Basicamente, executando o terminate desse aí (você colocou pra parar a música) e abrindo uma nova scene, por exemplo, Scene_Equip, e lá no initialize da Scene_Equip não tem nada definindo pra tocar música, etc XD


PS: Uma maneira legal pra fazer tocar em todas é fazer na Scene que é comum a todos esses Menus aí, que é a Scene_MenuBase.
Exemplo como você pode ver, a Scene_Menu é filha da Scene_MenuBase. Scene_Equip também e as outras em geral tem parentesco.

Então se você fizer tocar a música no initialize da Scene_MenuBase, como é usado por todas as scenes de Menu vai ocorrer o que você quer. (Que é tocar a música logo quando a scene é inicializada)
PS²: Não testei, mas logicamente deve ser assim, qualquer coisa me dê um toque XD




2 - Quando você entra nessa Scene_Menu aí, você executa o initialize dela, onde você pôs pra parar a BGS e SE's.

Ao sair da Scene_Menu, executa o terminate, você pode por pra religar elas e talz .-. (Só dando ideia)




  

Citação de: felipefalcon online 29/10/2017 às 21:01
1 - Justamente ela para de tocar porque são cenas diferentes XD

Tipo você tá saindo da Scene_Menu que é onde você fez os comandos e indo pra outra.

Basicamente, executando o terminate desse aí (você colocou pra parar a música) e abrindo uma nova scene, por exemplo, Scene_Equip, e lá no initialize da Scene_Equip não tem nada definindo pra tocar música, etc XD


PS: Uma maneira legal pra fazer tocar em todas é fazer na Scene que é comum a todos esses Menus aí, que é a Scene_MenuBase.
Exemplo como você pode ver, a Scene_Menu é filha da Scene_MenuBase. Scene_Equip também e as outras em geral tem parentesco.

Então se você fizer tocar a música no initialize da Scene_MenuBase, como é usado por todas as scenes de Menu vai ocorrer o que você quer. (Que é tocar a música logo quando a scene é inicializada)
PS²: Não testei, mas logicamente deve ser assim, qualquer coisa me dê um toque XD




2 - Quando você entra nessa Scene_Menu aí, você executa o initialize dela, onde você pôs pra parar a BGS e SE's.

Ao sair da Scene_Menu, executa o terminate, você pode por pra religar elas e talz .-. (Só dando ideia)

Olá Falcon, como vai ?  :XD:

Nossa muito obrigado cara, bom vamos lá! fiz o que você disse e parcialmente deu jeito, tipo no 1 problema a música está tocando no menu e dentro das outras abras (item, etc...) porém ela não fica direto, ela reinicia cada vez que você entra ou sai de uma dessas. Mas acredito que agora vai ser mais tranquilo de resolver.

Já o 2 eu não consegui, as músicas no mapa não voltam a tocar  :ded:
Mas muito obrigado pela ajuda, está me ajudando muito!  :wow:

Eu faria isso da seguinte forma:
class Game_Temp
  
  attr_accessor :musica_do_mapa
  
  alias :velho_initialize :initialize
  def initialize
    velho_initialize
    # Esta variável será responsável por guardar a música que está
    # tocando no mapa. Ela pode ser acessada de qualquer lugar usando
    # $game_temp.musica_do_mapa.
    # Isso ocorre pois $game_temp = Game_Temp.new, e nós sabemos que
    # $game_temp é uma variável global.
    @musica_do_mapa = nil
  end
  
end

class Scene_Map < Scene_Base
  
  alias :velho_call_menu :call_menu
  def call_menu
    # Este método é chamado antes do menu ser aberto, quando você pressiona B.
    
    # Vamos guardar a música do mapa. Basicamente é a música que tocou
    # por último.
    $game_temp.musica_do_mapa = RPG::BGM.last
    
    # Vamos chamar o call_menu antigo para não sobrescrever tudo.
    velho_call_menu
  end
  
end

class Scene_Menu < Scene_MenuBase
  
  alias :velho_start :start
  def start
    # Vamos chamar o start antigo para não sobrescrever tudo.
    velho_start
    
    # Agora vamos reproduzir uma música diferente.
    # Você pode passar argumentos no play para fazer a música
    # começar a partir de uma determinada posição, como
    # RPG::BGM.new('música').play(posição)
    # No update eu usei um print na posição da música para você ver como
    # funciona.
    RPG::BGM.new('Scene2').play
    
    # Não tema. Antes de reproduzir uma música, ele verifica se ela
    # é a mesma que está reproduzindo antes de tocar.
  end
  
  alias :velho_update :update
  def update
    velho_update
    p "Posição da música: #{RPG::BGM.last.pos}"
  end
  
  alias :velho_terminate :terminate
  def terminate
    # Vamos verificar se a próxima cena é a cena do mapa.
    if SceneManager.scene_is?(Scene_Map)
      # É a cena do mapa. Vamos restaurar a música.
      # Se quiser, você pode checar se o $game_temp.musica_do_mapa não é
      # nil antes de reproduzir, mas para deixar simples, vou apenas
      # reproduzir.
      $game_temp.musica_do_mapa.replay
    end
    velho_terminate
  end
  
end


Coloque em um projeto vazio e dê uma olhada no código.

Citação de: Alisson online 29/10/2017 às 22:51
Eu faria isso da seguinte forma:
class Game_Temp
  
  attr_accessor :musica_do_mapa
  
  alias :velho_initialize :initialize
  def initialize
    velho_initialize
    # Esta variável será responsável por guardar a música que está
    # tocando no mapa. Ela pode ser acessada de qualquer lugar usando
    # $game_temp.musica_do_mapa.
    # Isso ocorre pois $game_temp = Game_Temp.new, e nós sabemos que
    # $game_temp é uma variável global.
    @musica_do_mapa = nil
  end
  
end

class Scene_Map < Scene_Base
  
  alias :velho_call_menu :call_menu
  def call_menu
    # Este método é chamado antes do menu ser aberto, quando você pressiona B.
    
    # Vamos guardar a música do mapa. Basicamente é a música que tocou
    # por último.
    $game_temp.musica_do_mapa = RPG::BGM.last
    
    # Vamos chamar o call_menu antigo para não sobrescrever tudo.
    velho_call_menu
  end
  
end

class Scene_Menu < Scene_MenuBase
  
  alias :velho_start :start
  def start
    # Vamos chamar o start antigo para não sobrescrever tudo.
    velho_start
    
    # Agora vamos reproduzir uma música diferente.
    # Você pode passar argumentos no play para fazer a música
    # começar a partir de uma determinada posição, como
    # RPG::BGM.new('música').play(posição)
    # No update eu usei um print na posição da música para você ver como
    # funciona.
    RPG::BGM.new('Scene2').play
    
    # Não tema. Antes de reproduzir uma música, ele verifica se ela
    # é a mesma que está reproduzindo antes de tocar.
  end
  
  alias :velho_update :update
  def update
    velho_update
    p "Posição da música: #{RPG::BGM.last.pos}"
  end
  
  alias :velho_terminate :terminate
  def terminate
    # Vamos verificar se a próxima cena é a cena do mapa.
    if SceneManager.scene_is?(Scene_Map)
      # É a cena do mapa. Vamos restaurar a música.
      # Se quiser, você pode checar se o $game_temp.musica_do_mapa não é
      # nil antes de reproduzir, mas para deixar simples, vou apenas
      # reproduzir.
      $game_temp.musica_do_mapa.replay
    end
    velho_terminate
  end
  
end


Coloque em um projeto vazio e dê uma olhada no código.

o cara fez o script ashaush
Obrigado sir Alisson, estou dando uma estudada nele aqui, tentarei aprender melhor essas questões. Sério mesmo, foi de grande ajuda  :*-*: