Aquarium en 2d, probleme initialisation type java.awt.Graphics
Cornellus1985
Messages postés22Date d'inscriptiondimanche 26 avril 2009StatutMembreDernière intervention 7 juillet 2009
-
26 avril 2009 à 20:00
Cornellus1985
Messages postés22Date d'inscriptiondimanche 26 avril 2009StatutMembreDernière intervention 7 juillet 2009
-
1 mai 2009 à 11:37
Bonjour,
Je suis en train de developper un petit projet en java SE.
Il s'agit de creer un aquarium en utilisant des java.awt.image.BufferedImage afin de permettre un chargement de l'image en arriere plan avant de l'afficher.
Le projet se constitue de 4 classes, une classe Aquarium, une classe Tank, une classe Main et une classe Fish.
Je me sers de trois images afin de dessiner l'aquarium et les poissons. Ces images au format .gif sont stocker dans un dossier nomme "images" lui-meme place dans le dossier source (src) du projet.
Enfin je developpe sur Mac, avec Netbeans 6.5 et le jdk1.6.
public void drawFishImage(Graphics g){
if (velocity.x < 0) {
g.drawImage( image1 , location.x , location.y , tank );
}
else {
g.drawImage( image2 , location.x , location.y , tank );
}
}
}
LA CLASSE MAIN
package aquarium;
/**
*
* @author Cornellus1985
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Aquarium aquarium = new Aquarium();
}
}
L'erreur survenue a ete marque en gras.
Voici l'erreur survenue :
Exception in thread "main" java.lang.NullPointerException
at aquarium.Tank.(Tank.java:60)
at aquarium.Aquarium.(Aquarium.java:21)
at aquarium.Main.main(Main.java:18)
Java Result: 1
Je pense qu'il s'agit d'une erreur d'initialisation de l'attribut "memoryGraphics" de la classe Tank. Je ne sais pas comment remedier a ce probleme. Dois je surcharger ou surdefinir toutes les methodes de la classe abstraite Graphics ?
Toute aide sera la bienvenue, n'aidez pas a me poser vos questions si certains points restent obscures.
Cornellus1985
Messages postés22Date d'inscriptiondimanche 26 avril 2009StatutMembreDernière intervention 7 juillet 2009 27 avril 2009 à 18:25
L'erreur se situe a cette ligne dans la classe Tank :
memoryGraphics = memoryImage.getGraphics();
Il se trouve que l'attribut memoryImage en mode debugg ne s'initialise pas correctement.
Il en resulte une erreur d'initialisation (NullPointerException).
Je voudrais savoir comment recuperer dans une variable de type java.awt.Graphics une ou plusieurs Images du type BufferedImage ??
Le but est de modeliser en arriere plan toutes les images avant d'afficher le resultat pour empecher le "flickering".
Merci d'avance pour votre aide.
A+
Twinuts
Messages postés5375Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention14 juin 2023111 29 avril 2009 à 12:47
Salut,
si tu utilises createImage il faut que isHeadless soit faux et que isDisplayable soit vrai
et pour avoir isDisplayable à vrai il faut en gros que le panel soit affiché à l'écran...
la comme ça je vois bien 2 solutions :
1 - tu attends que isDisplayable soit vrai...
2 - tu remplaces simplement la ligne :
memoryImage = (BufferedImage) createImage(getSize().width, getSize().height);
par la ligne :
memoryImage = new BufferedImage(getSize().width, getSize().height, BufferedImage.TYPE_INT_ARGB);// le type en fonction de tes besoins
------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."
Cornellus1985
Messages postés22Date d'inscriptiondimanche 26 avril 2009StatutMembreDernière intervention 7 juillet 2009 30 avril 2009 à 11:34
Merci bien pour ton aide, comme l'application ne marchait pas (il ne faisait que dessiner le frame vide), j'ai entrepris un debug a la robinson en mettant des "sout" un peu partout.
J'ai essaye de remplacer la ligne de code comme tu l'as suggere, mais le resultat reste le meme.
Peut etre pourrais tu m'eclairer, je voudrais juste savoir a quelle occasion le contexte graphique appel la methode update ?
Parce que je me suis rendu compte au final qu'on ne passait jamais dans la methode surchargee update() sauf si j'en fait l'appel explicitement dans mon run(). Je lui passe alors en argument mon attribut "memoryGraphics".
Dans un premier temps, etant donne que le programme n'appelait jamais la methode update et que l'affichage etait nul, c'est-a-dire, pas la moindre image d'affichee, j'ai decide de voir ce qui se passe en redefinissant la mehode paint().
Random x = new Random(System.currentTimeMillis());
int random = generateRandom(x);
fishes.add( new Fish ( fishImages[random] , edges , this ));
try {
Thread.sleep(20);
}
catch (Exception e) {
System.out.println(e.getMessage());
}
}
paintOK = true;
repaint();
}
@Override
public void paint(Graphics g) {
if (paintOK) {
super.paint(g);
g.drawImage(aquariumImage, 0, 0, this);
for ( int loopIndex = 0 ; loopIndex < fishes.size() ; loopIndex++ ) {
fishes.elementAt( loopIndex ).drawFishImage( g );
}
}
}
protected static int generateRandom(Random x) {
int i = Math.abs(x.nextInt(1000));
System.out.println("Math.abs(x.nextInt()) = " + i);
int rand = i % 2;
return rand;
}
J 'obtiens un affichage cette fois-ci, avec l'image de fond de mon panel (aquariumImage), ainsi que 10 poissons positionnes aleatoirement sur mon panel.
Il ne me reste plus qu'a les faire nager et j'aurais besoin d'un petit coup de pouce.
Toute aide sera la bienvenue.
Merci d'avance
A+
Twinuts
Messages postés5375Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention14 juin 2023111 30 avril 2009 à 21:25
Salut,
là comme ça sans avoir testé le code ni même regardé le code plus en détail je ne vois pas trop ton pb. Cependant pour le type d'application que tu cherches à faire je ne comprend pas vraiment pourquoi tu t'obstines à utiliser le pain natif à java à la place du BufferStrategy + sprites & Co (utilisé pour les jeux en bypassant les paints java et te laissant gérer le tout par toi même - possibilitée d'utiliser le triple buffuring -) ce qui est (à mon sens) le plus adapté à ton cas.
Pour info ICI il y a un exemple concret d'utilisation.
------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."
OoWORAoO
Vous n’avez pas trouvé la réponse que vous recherchez ?
Cornellus1985
Messages postés22Date d'inscriptiondimanche 26 avril 2009StatutMembreDernière intervention 7 juillet 2009 1 mai 2009 à 11:37
Merci je vais y jeter un coup d'oeil mais avant je finis ce que j'ai commence. C'est presque fini a mon avis. J'ai juste a implementer la partie ou on rafraichie le dessin avec la nouvelle location des poissons en double-buffering a l'aide d'un thread et ensuite on affiche, des que la BufferedImage a ete update.
Voila voila merci pour ton aide.
A+