Avec les Sprites les références aux resources images sont maintenant facilement exploitables sans perte de vitesse (surtout pour le chargement des images) et procurent un accès facilité au double-buffering. Une classe utilisant ces Sprite's pour afficher en passif ou actif en passant par le double-buffering (déjà disponible avec tous les composants Swing) permet de ne pas perdre du temps à recharger les resources relatives au rendu graphique direct à l'écran. Ainsi, RenderingScene est une classe de rendu graphique pouvant se placer au coeur de toute application nécessitant un cadre scénique pour les animations ou graphisme divers.
Les librairies JAI/JIIO doivent être installées. Des raccourcis clavier ont été implémentés ainsi qu'une console de logging du STDOUT, malheureusement encore en phase de développement. Libre à vous de vous inspirer pour votre propre recherche et/ou développement.
Pour l'utiliser, tout se simplifie grâce à 2 Timers Swing intégrés dont un sert au rendu offscreen :
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| final Canvas scene = new RenderingScene(new Dimension((int)largeur, (int)hauteur));
// ajouter une action de rendu
((RenderingScene)scene).addActionOffscreen(new AbstractAction() { public void actionPerformed(ActionEvent e) {
// récupérer le buffer off
Sprite buffer = ((RenderingScene)scene).getOffscreen();
Image offscreen = buffer.getImage();
// et faire son rendu en une passe !
// par ex. pour dessiner un ovale 30*30 dans le coin superieur droit
Graphics g = offscreen.getGraphics();
Color clr = graphics.getColor();
graphics.setColor(Color.GREEN);
graphics.drawOval(scene.getWidth() - 30, 0, 30, 30);
graphics.fillOval(scene.getWidth() - 30, 0, 30, 30);
graphics.setColor(clr);
}});
// préparer une fenetre
JFrame frame = new JFrame("rendering scene");
frame.getContentPane().add(scene);
frame.pack();
frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {
System.exit(0);
}});
frame.setLocationRelativeTo(null);
frame.setVisible(true);
// démarrer le rendu
((RenderingScene)scene).resume();
// faire un loop si nécessaire pour eviter de quitter en fin de methode
while(frame.isShowing()) {
System.out.println("-loop-");
Thread.sleep(500);
} |
Note: Tout se passe bien avec Java 1.5+ sur PC ou Mac (Linux pas testé car je n'ai pas les librairies et le pc.... lol)