Bonjour tout le monde,
Je suis débutant en java et je dois réaliser un projet (line rider pour être précis)
Tout marchait plutôt bien avant que j'essaye de mettre de la musique d'arrière fond. J'ai un lecteur de musique java qui marche bien, seul soucis le programme s'arrête dès que la musique commence à jouer. Je pense que c'est un problème de simultanéité donc sans doute un Thread, mais je n'ai jamais utilisé cet outil et je suis un peu perdu,
Merci d'avance pour votre aide et tout vos conseils,
Je mets mon code et mon lecteur java :
package linerider2;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
public class Fenetre extends JFrame {
//cette classe hérite de la classe JFrame, c'est à dire de tout ses attributs
//LES ATTRIBUTS DU MENU
private JMenuBar menuBar = new JMenuBar();
JMenu fichier = new JMenu("File" ), //onglet "File"
edition = new JMenu("Edit" ), //onglet "Edit"
epaisseur = new JMenu("Line Width" ), //sous-onglet "Line Width" de "Edit"
couleur = new JMenu("Line Color" ), //sous-onglet "Line Color" de "Edit"
action = new JMenu("Action" ), //onglet "Action"
image = new JMenu("Picture" ), //onglet "Picture"
musique = new JMenu("Music" ); //onglet "Music"
JMenuItem nouveau = new JMenuItem("New" ), //item de l'onglet "File"
quitter = new JMenuItem("Quit" ), //item de l'onglet "File"
fin = new JMenuItem("Small" ), //item du sous-onglet "Line Width" de "Edit"
moyen = new JMenuItem("Medium" ), //item du sous-onglet "Line Width" de "Edit"
epais = new JMenuItem("Large" ), //item du sous-onglet "Line Width" de "Edit"
jaune = new JMenuItem("Yellow" ), //item du sous-onglet "Line Color" de "Edit"
orange = new JMenuItem("Orange" ), //item du sous-onglet "Line Color" de "Edit"
rose = new JMenuItem("Pink" ), //item du sous-onglet "Line Color" de "Edit"
rouge = new JMenuItem("Red" ), //item du sous-onglet "Line Color" de "Edit"
bleu = new JMenuItem("Blue" ), //item du sous-onglet "Line Color" de "Edit"
cyan = new JMenuItem("Cyan" ), //item du sous-onglet "Line Color" de "Edit"
vert = new JMenuItem("Green" ), //item du sous-onglet "Line Color" de "Edit"
gris = new JMenuItem("Gray" ), //item du sous-onglet "Line Color" de "Edit"
noir = new JMenuItem("Black" ), //item du sous-onglet "Line Color" de "Edit"
gomme = new JMenuItem("Eraser" ), //item de l'onglet "Edit"
crayon = new JMenuItem("Pencil" ),
placement = new JMenuItem("Position" ),
depart = new JMenuItem("Play" ), //item de l'onglet "Action"
stop = new JMenuItem("Stop" ), //item de l'onglet "Action"
pause = new JMenuItem("Pause" ),
playa = new JMenuItem("Vamos a la playa" ), //item de l'onglet "Music"
skibronze = new JMenuItem("Les Bronzés font du ski" ), //item de l'onglet "Music"
pharaon = new JMenuItem("Egypt" ), //item de l'onglet "Music" //à trouver
inca = new JMenuItem("Mayas" ), //item de l'onglet "Music" //à trouver
elysee = new JMenuItem("Aux Champs-Elysées" ), //item de l'onglet "Music"
ny = new JMenuItem("New York" ), //item de l'onglet "Music" //à trouver
ld = new JMenuItem("London" ), //item de l'onglet "Music" //à trouver
syd = new JMenuItem("Sydney" ), //item de l'onglet "Music" //à trouver
mika = new JMenuItem("Relax" ); //item de l'onglet "Music"
//LES ATTRIBUTS DE LA BARRE D'OUTILS
JToolBar toolBar = new JToolBar();
JButton small = new JButton(new ImageIcon("ImageIcone/images-fin.png" )), //icône trait fin
medium = new JButton(new ImageIcon("ImageIcone/images-epais.png" )), //icône trait moyen
large = new JButton(new ImageIcon("ImageIcone/images-large.png" )), //icône trait épais
yellow = new JButton(new ImageIcon("ImageIcone/images-jaune.png" )), //icône trait jaune
orange2 = new JButton(new ImageIcon("ImageIcone/images-orange.png" )), //icône trait orange
pink = new JButton(new ImageIcon("ImageIcone/images-rose.png" )), //icône trait rose
red = new JButton(new ImageIcon("ImageIcone/images-rouge.png" )), //icône trait rouge
blue = new JButton(new ImageIcon("ImageIcone/images-bleu.png" )), //icône trait bleu
cyan2 = new JButton(new ImageIcon("ImageIcone/images-cyan.png" )), //icône trait cyan
green = new JButton(new ImageIcon("ImageIcone/images-vert.png" )), //icône trait vert
grey = new JButton(new ImageIcon("ImageIcone/images-gris.png" )), //icône trait gris
black = new JButton(new ImageIcon("ImageIcone/images-noir.png" )), //icône trait noir
rubber = new JButton(new ImageIcon("ImageIcone/images-gomme.png" )), //icône gomme
pencil = new JButton(new ImageIcon("ImageIcone/images-crayon.png" )), //icône crayon
corbeille = new JButton(new ImageIcon("ImageIcone/images-corbeille.png" )), //icône corbeille
placerBille = new JButton(new ImageIcon("ImageIcone/images-bille.png" )), //icône bille
play = new JButton(new ImageIcon("ImageIcone/images-play.png" )), //icône play
stop2 = new JButton(new ImageIcon("ImageIcone/images-stop.png" )), //icône stop
pause2 = new JButton(new ImageIcon("ImageIcone/images-pause.png" )); //icône pause
//LES ATTRIBUTS DES ÉCOUTEURS
private transient FormeListener fListener = new FormeListener();
private transient CouleurListener cListener = new CouleurListener();
//LES ATTRIBUTS DE LA ZONE DE DESSIN
private DrawPanel drawPanel = new DrawPanel();
private int a = 5; //épaisseur du trait fin
private int b = 10; //épaisseur du trait moyen
private int c = 15; //épaisseur du trait épais
private int xSizeFenetre = 1300; // hauteur de la fenêtre
private int ySizeFenetre = 900; // largeur de la fenêtre
private int level;
//LE CONSTRUCTEUR
/** contructeur de la fenêtre de jeu
*/
public Fenetre(int lev) {
this.level = lev;
this.setTitle("Line Rider" ); //titre de la fenêtre
this.setSize(xSizeFenetre, ySizeFenetre); //taille de la fenêtre de jeu
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.initMenu(); //initialisation du menu
this.initToolBar(); //initialisation de la barre d'outils
this.getContentPane().add(drawPanel, BorderLayout.CENTER);
this.setVisible(true); //rendre visible la fenêtre de jeu
//this.bille = new Bille(xDepart, yDepart, RAYON); // initialisation de la bille
// initialise le DrawPanel
drawPanel.setXSizeFenetre(xSizeFenetre);
drawPanel.setYSizeFenetre(ySizeFenetre);
drawPanel.setLevel(level);
initLevel();
drawPanel.initObstacle();
drawPanel.boucleInf();
}
//INITIALISATION DU MENU
private void initMenu() {
nouveau.addActionListener(new GestionNouveau());
quitter.addActionListener(new GestionQuitter());
menuBar.add(fichier);
menuBar.add(edition);
menuBar.add(action);
menuBar.add(musique);
fichier.add(nouveau);
fichier.add(quitter);
edition.add(couleur);
edition.add(crayon);
edition.add(gomme);
crayon.addActionListener(new GestionCrayon());
gomme.addActionListener(new GestionGomme());
placement.addActionListener(new GestionBille());
epaisseur.add(fin);
epaisseur.add(moyen);
epaisseur.add(epais);
fin.addActionListener(fListener);
moyen.addActionListener(fListener);
epais.addActionListener(fListener);
action.add(depart);
action.add(stop);
action.add(pause);
depart.addActionListener(new GestionPlay());
stop.addActionListener(new GestionStop());
pause.addActionListener(new GestionPause());
couleur.add(jaune);
couleur.add(orange);
couleur.add(rose);
couleur.add(rouge);
couleur.add(bleu);
couleur.add(cyan);
couleur.add(vert);
couleur.add(gris);
couleur.add(noir);
jaune.addActionListener(cListener);
orange.addActionListener(cListener);
rose.addActionListener(cListener);
rouge.addActionListener(cListener);
cyan.addActionListener(cListener);
bleu.addActionListener(cListener);
vert.addActionListener(cListener);
gris.addActionListener(cListener);
noir.addActionListener(cListener);
image.add(plage);
image.add(montagne);
image.add(pyramide);
image.add(maya);
image.add(paris);
image.add(newyork);
image.add(sydney);
image.add(londres);
image.add(pop);
image.add(vierge);
plage.addActionListener(new GestionBackground());
montagne.addActionListener(new GestionBackground());
pyramide.addActionListener(new GestionBackground());
maya.addActionListener(new GestionBackground());
paris.addActionListener(new GestionBackground());
newyork.addActionListener(new GestionBackground());
sydney.addActionListener(new GestionBackground());
londres.addActionListener(new GestionBackground());
pop.addActionListener(new GestionBackground());
vierge.addActionListener(new GestionBackground());
musique.add(playa);
musique.add(skibronze);
musique.add(pharaon);
musique.add(inca);
musique.add(elysee);
musique.add(ny);
musique.add(ld);
musique.add(syd);
musique.add(mika);
playa.addActionListener(new GestionMusic());
skibronze.addActionListener(new GestionMusic());
pharaon.addActionListener(new GestionMusic());
inca.addActionListener(new GestionMusic());
elysee.addActionListener(new GestionMusic());
ny.addActionListener(new GestionMusic());
ld.addActionListener(new GestionMusic());
syd.addActionListener(new GestionMusic());
mika.addActionListener(new GestionMusic());
this.setJMenuBar(menuBar);
}
//INITIALISATION DE LA BARRE D'OUTIL
private void initToolBar() {
small.addActionListener(fListener);
medium.addActionListener(fListener);
large.addActionListener(fListener);
toolBar.addSeparator();
toolBar.add(yellow);
toolBar.add(orange2);
toolBar.add(pink);
toolBar.add(red);
toolBar.add(blue);
toolBar.add(cyan2);
toolBar.add(green);
toolBar.add(grey);
toolBar.add(black);
yellow.addActionListener(cListener);
orange2.addActionListener(cListener);
pink.addActionListener(cListener);
red.addActionListener(cListener);
blue.addActionListener(cListener);
cyan2.addActionListener(cListener);
green.addActionListener(cListener);
grey.addActionListener(cListener);
black.addActionListener(cListener);
toolBar.addSeparator();
toolBar.add(play);
toolBar.add(stop2);
toolBar.add(pause2);
play.addActionListener(new GestionPlay());
stop2.addActionListener(new GestionStop());
pause2.addActionListener(new GestionPause());
placerBille.addActionListener(new GestionBille());
toolBar.addSeparator();
toolBar.add(rubber);
toolBar.add(pencil);
toolBar.add(corbeille);
rubber.addActionListener(new GestionGomme());
pencil.addActionListener(new GestionCrayon());
corbeille.addActionListener(new GestionNouveau());
this.getContentPane().add(toolBar, BorderLayout.NORTH);
}
//INITIALISE LE LEVEL
private void initLevel() {
switch (level) {
case 0:
toolBar.addSeparator();
toolBar.add(placerBille);
toolBar.addSeparator();
toolBar.add(small);
toolBar.add(medium);
toolBar.add(large);
menuBar.add(image);
edition.add(placement);
edition.add(epaisseur);
setVisible(true);
placerBille.addActionListener(new GestionBille());
break;
case 1:
break;
case 2:
break;
case 3:
break;
}
}
//ÉCOUTEUR POUR LA REMISE A ZERO
class GestionNouveau implements ActionListener {
public void actionPerformed(ActionEvent arg0) {
drawPanel.setNomImage(null);
drawPanel.setStop(true);
drawPanel.setPlay(false);
drawPanel.setDraw(true);
drawPanel.setClic(false);
drawPanel.setPause(false);
drawPanel.erase();
}
}
//ÉCOUTEUR POUR QUITTER
class GestionQuitter implements ActionListener {
public void actionPerformed(ActionEvent arg0) {
System.exit(0);
}
}
//ECOUTEUR POUR CHARGER UNE MUSIQUE
public class GestionMusic implements ActionListener {
public void actionPerformed(ActionEvent e){
if (e.getSource() == playa){
Sound player = new Sound ("Musics/Beach - Vamos a la playa - Guitar Cover.mp3" );
InputStream stream = new ByteArrayInputStream(player.getSamples());
player.play(stream);
}
else if (e.getSource() == skibronze){
Sound player = new Sound ("Musics/Mountain - Les bronzes font du ski.wav" );
InputStream stream = new ByteArrayInputStream(player.getSamples());
player.play(stream);
}
else if (e.getSource() == pharaon){
Sound player = new Sound ("Musics/Egypt - Pharaoh Ramses II.wav" );
InputStream stream = new ByteArrayInputStream(player.getSamples());
player.play(stream);
}
else if (e.getSource() == inca){
Sound player = new Sound ("Musics/Maya - Christopher Tin - Baba Yetu.wav" );
InputStream stream = new ByteArrayInputStream(player.getSamples());
player.play(stream);
}
else if(e.getSource() == elysee){
Sound player = new Sound ("Musics/Paris - Les Champs Elisées.wav" );
InputStream stream = new ByteArrayInputStream(player.getSamples());
player.play(stream);
}
else if (e.getSource() == ny){
Sound player = new Sound ("Musics/NY - Frank Sinatra - New York New York.wav" );
InputStream stream = new ByteArrayInputStream(player.getSamples());
player.play(stream);
}
else if (e.getSource() == ld){
Sound player = new Sound ("Musics/London -The Clash - London Calling.wav" );
InputStream stream = new ByteArrayInputStream(player.getSamples());
player.play(stream);
}
else if (e.getSource() == syd){
Sound player = new Sound ("Musics/Sydney - Australian Aboriginal Rock Music.wav" );
InputStream stream = new ByteArrayInputStream(player.getSamples());
player.play(stream);
}
else if (e.getSource() == mika){
Sound player = new Sound ("Musics/Pop Color - Mika - Relax.wav" );
InputStream stream = new ByteArrayInputStream(player.getSamples());
player.play(stream);
}
}
}
//ECOUTEUR POUR LANCER LA SIMULATION
public class GestionPlay implements ActionListener {
public void actionPerformed(ActionEvent e) {
drawPanel.setDraw(false); //on ne peut plus dessiner
drawPanel.setPlay(true);
drawPanel.setPause(false);
}
}
//ECOUTEUR POUR ARRETER LA SIMULATION
public class GestionStop implements ActionListener {
public void actionPerformed(ActionEvent e) {
drawPanel.setStop(true);
drawPanel.setPlay(false);
drawPanel.setDraw(true);
drawPanel.setClic(false);
drawPanel.setPause(false);
}
}
//ECOUTEUR POUR METTRE LA SIMULATION EN PAUSE
public class GestionPause implements ActionListener {
public void actionPerformed(ActionEvent e) {
drawPanel.setPause(true);
drawPanel.setPlay(false);
drawPanel.setDraw(false);
drawPanel.setClic(false);
}
}
//ECOUTEUR POUR PLACER LA BILLE
public class GestionBille implements ActionListener {
public void actionPerformed(ActionEvent e) {
drawPanel.setPause(false);
drawPanel.setPlay(false);
drawPanel.setDraw(false);
drawPanel.setClic(false);
drawPanel.setPlacerBille(true);
}
}
}
Et le lecteur de musique:
package linerider2;
import java.io.DataInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import javax.sound.sampled.*;
import java.io.ByteArrayInputStream;
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();
}
}