Partage
  • Partager sur Facebook
  • Partager sur Twitter

Classes pour implémenter du son dans un jeu

    26 mars 2019 à 18:49:05

    Bonjour, je fais partie d'une équipe chargée de la réalisation d'un jeu de type "Bomberman" en Java. Je dois m'occuper du son : musiques de fond, /animation lors de l'explosion d'une bombe etc ...).

    Je me suis longuement renseigné et j'ai trouvé quelques solutions mais aucunes ne me convient parfaitement, de plus les exemples sur le sites d'oracle ne sont plus accessibles.

    Je vous met quand meme ce que j'ai pour le moment.

    package son;
    import java.io.DataInputStream;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import javax.sound.sampled.*;
    
    public class Sound {
        private AudioFormat format;
        private byte[] samples;
        /**
         * 
         * @param filename le lien vers le fichier song (URL ou absolute path)
         */
        public Sound(String filename){
         try{
          AudioInputStream stream = AudioSystem.getAudioInputStream(new File(filename));
          format = stream.getFormat();
          samples = getSamples(stream);
         }
         catch (UnsupportedAudioFileException e){
          e.printStackTrace();
         }
         catch (IOException e){
          e.printStackTrace();
         }
        }
        public byte[] getSamples(){
         return samples;
        }
        public byte[] getSamples(AudioInputStream stream){
         int length = (int)(stream.getFrameLength() * format.getFrameSize());
         byte[] samples = new byte[length];
         DataInputStream in = new DataInputStream(stream);
         try{
          in.readFully(samples);
         }
         catch (IOException e){
          e.printStackTrace();
         }
         return samples;
        }
        public void play(InputStream source) {
         int bufferSize = format.getFrameSize() * Math.round(format.getSampleRate() / 10);
         byte[] buffer = new byte[bufferSize];
         SourceDataLine line;
         try{
          DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
          line = (SourceDataLine)AudioSystem.getLine(info);
          line.open(format, bufferSize);
         }
         catch (LineUnavailableException e){
          e.printStackTrace();
          return;
         }
         line.start();
         try{
          int numBytesRead = 0;
          while (numBytesRead != -1){
           numBytesRead = source.read(buffer, 0, buffer.length);
           if (numBytesRead != -1)
            line.write(buffer, 0, numBytesRead);
          }
         }
         catch (IOException e){
         e.printStackTrace();
         }
         line.drain();
         line.close();
        }
    }
    package son;
    
    import java.io.ByteArrayInputStream;
    import java.io.InputStream;
    import java.util.Scanner;
    
    public class main {
    	public static void main(String[] args) {
    		
    	   /* boolean lancerPartie=false;
    	    boolean stopPartie=false;
    	    boolean pause= false;
    	    boolean declenchementBombe= false;:*/
    	    
    		
    		while(true) {
    	      Scanner sc = new Scanner(System.in);
    	      System.out.println("Appuyez sur 1 pour lancer la musique et 2 pour une bombe :");
    	      int nombre = sc.nextInt();
    	      if (nombre==1)
    	      {
    	      Sound player = new Sound("Yeah.wav");
    	     InputStream stream = new ByteArrayInputStream(player.getSamples()); 
    	    player.play(stream);
    	}
    	      else if (nombre==2) {
    	    	  Sound player = new Sound("bombe.wav");
    	 	     InputStream stream = new ByteArrayInputStream(player.getSamples()); 
    	 	    player.play(stream);
    	      }
    }
    }
    }

    La j'arrive à lancer un son mais moi je voudrais que ce sont intervienne en arriere plan, en meme temps que le jeu utilisant Java2D.

    Merci à tous


    • Partager sur Facebook
    • Partager sur Twitter
      26 mars 2019 à 19:55:20

      Bonjour,

      A ta place j'essaierai d'autres méthodes en m'inspirant des codes sources d'autres jeux. Par exemple, il y a un membre du forum qui a fait un jeu de Uno (tu peux télécharger les sources ici : https://adeprez.com/projects/) et en regardant sa classe sur le son, on voit qu'il utilise le modèle singleton (design pattern), cela peut peut-être résoudre le problème. Voilà un extrait du code :

      import java.io.IOException;
      import java.util.HashMap;
      import java.util.Map;
      
      import javax.sound.sampled.AudioSystem;
      import javax.sound.sampled.Clip;
      import javax.sound.sampled.LineUnavailableException;
      import javax.sound.sampled.UnsupportedAudioFileException;
      
      /**
       * Singleton permettant de jouer des sons via le repertoire "sons", devant etre place au meme endroit que le jar executable
       */
      public class Sons {
      	private static final String PATH = "/sons/";
      	private static Sons instance;
      	private final Map<String, Clip> sons;
      	private boolean desactive;
      
      
      	/**
      	 * Design-pattern singleton. Cree l'unique instance de cet objet s'il n'existe pas encore
      	 * @return l'unique instance de cet classe
      	 */
      	public static Sons getInstance() {
      		synchronized(Images.class) {
      			if(instance == null)
      				instance = new Sons();
      			return instance;
      		}
      	}
      
      	/**
      	 * Constructeur prive, selon le design-pattern singleton
      	 */
      	private Sons() {
      		sons = new HashMap<String, Clip>();
      	}
      	
      	/**
      	 * Charge le son selon son nom, depuis le repertoire "sons", devant etre place au meme endroit que le jar executable
      	 * @param nom le nom du son a jouer
      	 * @throws UnsupportedAudioFileException si le format de fichiers n'est pas supporte
      	 * @throws IOException si une erreur d'entree/sortie survient
      	 * @throws LineUnavailableException si une erreur survient a la lecture de ce fichier
      	 */
      	public void charger(String nom) throws UnsupportedAudioFileException, IOException, LineUnavailableException {
      		Clip clip = AudioSystem.getClip();
      		clip.open(AudioSystem.getAudioInputStream(getClass().getResourceAsStream(PATH + nom)));
      		sons.put(nom, clip);
      	}
      	
      	/**
      	 * Si le son n'a pas ete charge, memorise le son via la methode {@link #charger(String)}
      	 * @param nom le nom du son a jouer
      	 * @return le son
      	 * @throws UnsupportedAudioFileException si le format de fichiers n'est pas supporte
      	 * @throws IOException si une erreur d'entree/sortie survient
      	 * @throws LineUnavailableException si une erreur survient a la lecture de ce fichier
      	 */
      	public Clip getSon(String nom) throws UnsupportedAudioFileException, IOException, LineUnavailableException {
      		if(!sons.containsKey(nom))
      			charger(nom);
      		return sons.get(nom);
      	}
      	
      	/**
      	 * Joue le son. Si le son n'a pas ete charge, memorise le son via la methode {@link #charger(String)}
      	 * @param son le nom du son a jouer
      	 */
      	public void jouer(String son) {
      		if(!desactive) try {
      			Clip c = getSon(son);
      			c.setFramePosition(0);
      			c.start();
      		} catch(Exception e) {
      			System.err.println("Impossible de jouer le son " + son + ". En consequence, les sons ont ete desactives");
      			desactive = true;
      		}
      	}
      
      }
      


      Après si ça marche pas, tu peux t'inspirer d'autres codes qui sont ici : https://codes-sources.commentcamarche.net/source/list/java-9/276-jeux/last

      • Partager sur Facebook
      • Partager sur Twitter

      Classes pour implémenter du son dans un jeu

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown