OVH Cloud OVH Cloud

Quelques questions sans réponses (débutant)

3 réponses
Avatar
sjolye
Bonjour,

Je développe un jeu en java sous GNU/linux 2.4.20 et j'ai quelques
questions auxquelles je je trouve pas de solutions.

Steph:~$ java -version
java version "1.4.2"
Java(TM) 2 Runtime Environnent, Standard Edition (build 1.4.2-b28)
Java HotSpot(TM) Client VM (build 1.4.2-b28, mixed mode)

bon bref,

Mes problèmes sont les suivant:

1)Impossibiliter de reprendre la main sur une classe audio après
écoute d'un fichier audio 'wav'
2)Comment crée ses propres événements avec ses propres classes?
3)Comment intercepter les touches du clavier sur un ihm?( ca
fonctionne pas chez moi )

1)Fichier source classe audio:( c'est sans doute pas très joli mais
bon :)

package sounds;

// Package de noyau java
import java.io.File;
import java.io.InputStream;

// Package d'extention java
import javax.sound.sampled.*;

public class Sound
{
private String bruit;
private File fl;
private Clip co;

public Sound ( String son )
{
this.bruit = "sons/"+son;
}

public void init()
{
try
{
fl = new File( bruit );
AudioInputStream is = AudioSystem.getAudioInputStream( fl );
AudioFormat format = is.getFormat();
DataLine.Info info = new DataLine.Info(
Clip.class,
format,
( (int)is.getFrameLength() *
format.getFrameSize() ) );

Clip co = (Clip)AudioSystem.getLine(info);
this.co = co;
co.open( is );
}

catch ( Exception exception)
{
System.out.println("Pb de lecture de fichier audio!");
}
}

public void play()
{
co.start();
}


Si je fais une classe de testSound, j'entend le bien le fichier audio,
mais je n'ai plus la main ensuite ?? je comprend pas :(

Pour la question n°2 c'est pour 2 classes que j'ai crée( midi et
thread). Par exemple je joue un fichier audio midi avec un classe que
j'ai appelé Midi et je souhaiterai que cette classe déclenche un
événement vers la classe parente lorsque le fichier 'mid' est fini
d'être joué. Comment procède ton? Si vous avez une documentation un
lien je suis preneur.

Pour la 3) j'ai crée une classe classe Gui de la manière suivante:

// définition du pakage
package gui;

// Packages de noyau Java.
import java.util.*;
import java.awt.*;
import java.awt.event.*;

// Packages personnel
import autres.*;
import sounds.*;
import utils.*;

// Package d'extension Java.
import javax.swing.*;
import javax.swing.JOptionPane;

public class Gui extends JFrame implements KeyListener {

code......Constructeur etc....


// méthode keyEvent
public void keyPressed( KeyEvent evt )
{
int code = evt.getKeyCode();
System.out.println("KeyPressed: "+ code);
}

// méthode keyTyped
public void keyTyped( KeyEvent evt )
{
System.out.println("KeyTyped");
}

// méthode keyreleased
public void keyReleased( KeyEvent evt )
{
System.out.println("Keyreleased");
}
code......
}

Ben, quand je clique sur la fenêtre et que j'appuie sue les touches du
clavier rien ne s'affiche dans mon xterm. A votre avis pourquoi?

Voilà j'en ai fini pour ces questions, dans cette attente je vous
remercies.

Stéphane

3 réponses

Avatar
vclassine
(tatane) wrote in message news:...
Bonjour,
Salut,


...

Mes problèmes sont les suivant:

1)Impossibiliter de reprendre la main sur une classe audio après
écoute d'un fichier audio 'wav'
2)Comment crée ses propres événements avec ses propres classes?
3)Comment intercepter les touches du clavier sur un ihm?( ca
fonctionne pas chez moi )


Très globalement, et sans méchanceté, je crois que tu n'as pas bien
compris le concept d'interface. Il faudrait que tu bosses un peu plus
la conception/programmation objet en général et en java et aussi
particulièrement sur la bonne façon de programmer (objet) en java.
Voir plus bas.

Un conseil, étudie bien l'API elle est plutôt bien foutue, elle te
fournira non seulement une super boite à outils, mais de aussi bonnes
idées pour fabriquer tes propres outils...


1)Fichier source classe audio:( c'est sans doute pas très joli mais
bon :)

package sounds;
...


public class Sound
{
...

}


Si je fais une classe de testSound, j'entend le bien le fichier audio,
mais je n'ai plus la main ensuite ?? je comprend pas :(
Postes-le code de ta classe testSound et détails ce que tu entends par

"je n'ai plus la main ensuite"

Pour la question n°2 c'est pour 2 classes que j'ai crée( midi et
thread). Par exemple je joue un fichier audio midi avec un classe que
j'ai appelé Midi et je souhaiterai que cette classe déclenche un
événement vers la classe parente lorsque le fichier 'mid' est fini
d'être joué. Comment procède ton? Si vous avez une documentation un
lien je suis preneur.


Les évènements c'est un concept. Le concept c'est un message envoyé à
un récepteur à un instant indéterminable par le récepteur.
Concrètement ça se trraduit par un appel de méthode (avec
éventuellement des paramètre) d'une classe gestionnaire d'évenement
par une classe provocateur d'évènement...

En java ça se traduit par une interface MachinListener que doit être
implémentée par le gestionnaire d'évenement. Elle définie des méthodes
avec éventuellement en paramètre des MachinEvent. La classe
provocateur d'évènement doit supporter des méthode
addMachinListener(MachinListener) et RemoveMachinL...(..).

Pour faire un truc de bon goût, jettes un coup d'oeil dans la javadoc
aux classes et interfaces dont le nom contient Event dans java.util
ainsi qu'a l'exception TooManyListenersException du même package.

Tu peux jeter un coup d'oeil a KeyAdapter et KeyEvent et Component
dans java.awt pour voir comment c'est foutu (voir plus bas la
solution, du moins je suppose, à ton problème).

Gestionnaire d'évenement:
KeyAdapter implemente KeyListenet et java.util.EventListener
Provocateur d'évènement:

Component a les méthodes (add & remove)KeyListener
(add ne lève jamais l'exception java.util.TooManyListeners, car sa
taille de liste de KeyListener est illimitée, mais ça ne sera
peut-être pas vrai pour ta classe)

KeyEvent hérite (indirectement) de java.util.ObjectEvent

En passant regardes ce qu'il se fait dans les listener déjà définit
dans l'api. Tu n'as peut-être pas besoin de réinventer la roue...


Pour la 3) j'ai crée une classe classe Gui de la manière suivante:

// définition du pakage
package gui;

...

import javax.swing.JOptionPane;

public class Gui extends JFrame implements KeyListener {

code......Constructeur etc....


// méthode keyEvent
public void keyPressed( KeyEvent evt )
...

}
code......
}

Ben, quand je clique sur la fenêtre et que j'appuie sue les touches du
clavier rien ne s'affiche dans mon xterm. A votre avis pourquoi?


Ta classe Gui est un KeyListener valide mais KeyListener de quoi? Si
tu veux que ça "écoute" un composant, il faut l'enregistrer comme
keyListener() de ce composant en utilisant la méthode
addKeyListener(KeyListener l) de java.awt.Component. Par exemple pour
le faire directement sur ta classe Gui tu peux faire un
this.getContentPane().addKeyListener(this)
ça n'est pas garantie que ça marche directement. Sur la javadoc de la
l'interface KeyListener tu as un tutorial sur la gestion des évènement
clavier... Si tu es fainéant, tu peux aussi te mettre sous le coude un
IDE avec modeleur graphique (genre Netbeans) pour voir le code
généré...


Voilà j'en ai fini pour ces questions, dans cette attente je vous
remercies.


De rien, bon courage!!!

A+

Avatar
tatane
On Mon, 15 Sep 2003 03:26:01 -0700, Vincent wrote:

(tatane) wrote in message
news:...


Merci vincent pour m'avoir consacré du temps à mes différentes
questions, je vais suivre tes conseils.
Il va faloir que je bosse les ihm :), enfin de toute facon j'ai procédé
d'une autre manière pour mon jeu. Ca fonctionne mais le code ne doit pas
être beau à voir pour un spécialiste. Je vais le terminer un peu plus
et le mettre en ligne code ouvert comme ca on pourra me donner des
conseils pour m'améliorer en développement java.

@+ Stéphane

Avatar
vclassine
tatane wrote in message news:...
On Mon, 15 Sep 2003 03:26:01 -0700, Vincent wrote:

(tatane) wrote in message
news:...


Merci vincent pour m'avoir consacré du temps à mes différentes
questions, je vais suivre tes conseils.
De rien.


Il va faloir que je bosse les ihm :)
En fait les IHM sont, pour moi, une mauvaise école. En effet la prog

objet est difficile à aborder dans des domaines abstrait. Quand tu
codes une appli de gestion de véhicules (cas d'école) tu identifie
assez facilement les objets puisqu'il sont concret. Classe abstraite
vehicule, en hérite les classes voiture, moto... Avec les IHM c'est
plus dur car il s'agit de morceaux de programmes qui n'ont pas
réellement d'existence physique (sauf les composants) on tombe donc
assez rapidement dans le piège de la fenêtre à tout faire qui finit
par faire 5000 lignes de code avec 12 gestionnaire d'apparence 24
gestionnaire d'evenements...

Mon conseil, se fader un maximum de sujet théorique mais non graphique
pour se former, genre un gestionnaire de tâche une recherche
multicirtère sur des objets... Tous ces sujets te permettront de
progresser dans ta comprehension de l'objet...

Je vais le terminer un peu plus
et le mettre en ligne code ouvert comme ca on pourra me donner des
conseils pour m'améliorer en développement java.
wait and see



@+ Stéphane
A+