Som em uma aplicação - o que há de errado?

2 respostas
renatoes

Boa tarde,

Estou fazendo um jogo para uma disciplina da faculdade e desenvolvi uma classe (bem simples) para fazer o controle de som. Alguém poderia me ajudar a identificar pq nada toca (obviamente, os arquivos de som estão nas pastas corretas, antes que perguntem). Aí vai o código:

public class SomManager {
   
    public static final int ACERTO = 0, //Constante para o som de acerto,
                            ERRO = 1,   //erro,
                            VITORIA = 2, //vitória,
                            DERROTA = 3, //derrota e
                            BEM_VINDO = 4; //bem-vindo
    
    private static AudioClip acerto,   //Som de acerto do navio
                               erro,   //Som de erro do navio
                            vitoria,   //Som de vitoria para um jogador
                            derrota,   //Som de derrota para um jogador
                            bem_vindo; //Som de bem vindo ao jogo 
    static{
   
        try{
            
            acerto = Applet.newAudioClip(new File("acerto.wav").toURI().toURL());
            erro = Applet.newAudioClip(new File("erro.wav").toURI().toURL());
            vitoria = Applet.newAudioClip(new File("vitoria.wav").toURI().toURL());
            derrota = Applet.newAudioClip(new File("derrota.wav").toURI().toURL());
            bem_vindo = Applet.newAudioClip(new File("welcome.wav").toURI().toURL());
            
        }catch(MalformedURLException excp){
            
            excp.printStackTrace();
        }

    }
    
    public static void playAudio(int som){
    
        switch(som){
            
            case ACERTO: acerto.play(); break;
            case ERRO: erro.play(); break;
            case VITORIA: vitoria.play(); break;
            case DERROTA: derrota.play(); break;
            case BEM_VINDO: bem_vindo.play(); break;
            default: JOptionPane.showMessageDialog(null,"Som requisitado não existe");
        }
    }
}

Pelo que li no site da Sun, sobre a API de som, existe a possibilidade de usar outras classes, mas por se tratar de algo muito simples (fazer um som quando ocorre um acerto ou erro, por exemplo), não vejo a necessidade de algo mais sofisticado.

Agradeço a ajuda desde já

2 Respostas

ViniGodoy

Ao invés de pegar o File desse jeito, tente com o
SomManager.class.getResourceAsStream("/acerto.wav");

Ao invés de enums usando static, seria também melhor concentrar tudo num enum do Java, a menos é claro que você seja partidário do Java 1, ao invés do Java 5 ou superior. Nesse caso, use o typesafe enum pattern, que ainda sim é mais seguro e eficiente, com descrito aqui no item 21 do Effective Java. A vantagem é que o enum já conteria o audio-clip a ser tocado, além de outras informações de cada um desses estados.

Se você é partidário do Java 5 ou 6, dê uma olhada na classe SoundManager desse jogo que eu deixei por aqui. Elas usam a API do Java 5, e são realmente fáceis de integrar na aplicação. Por usarem um threadpool, também são bem mais eficientes.

renatoes

ViniGodoy,

Muito obrigado pelas explicações e disponibilização do código fonte, sempre uma chance a mais de aprendizado ao estudar alguma solução já encontrada!
Valeu :stuck_out_tongue:

Criado 2 de setembro de 2007
Ultima resposta 3 de set. de 2007
Respostas 2
Participantes 2