Fusion Graphics2D et AffineTransform

Résolu/Fermé
omcougar Messages postés 152 Date d'inscription mardi 4 mai 2004 Statut Membre Dernière intervention 8 octobre 2008 - 28 août 2006 à 13:05
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 - 28 août 2006 à 15:53
Bonjour,
je joue un peu avec les fonctions 2D et pour ce faire j'ai crée un petit jeu avec des personnagues qui courent sur un terrain... bref :)
Globalement je dessine tout mon petit monde sur un graphique 2D surlequel j'ai préalablement appliqué une transformation affine correspondant au zoom sur une partie précise du dessin.

Mon probleme est que je voudrais par dessus ma zone zoomée, ajouter des éléments qui ne sont pas soumis au zoom... mon idée était de créer un segond Graphics2D sans fonction affine que je fusionne avec le premier avant de l'afficher à l'ecran mais je ne sais pas comment m'y prendre.



voici mon code, merci de votre aide...




public







void



paintComponent(Graphics g){


   // Je préparre le graphique


   Graphics2D gTmp = (Graphics2D) g;
   gTmp.setRenderingHint(
      RenderingHints.


KEY_ANTIALIASING




,
      RenderingHints.


VALUE_ANTIALIAS_ON




   );



   super



.paintComponent(g);











   // je crée la transformation affine pour zoomer sur une zone du décor

   AT_Globale
=


new



AffineTransform();


   AT_Globale
.translate(

Xmin
,

Ymin


);


   AT_Globale
.scale(1.0/

Zoom
,1.0/

Zoom


); 
   gTmp.setTransform(

AT_Globale


);






   // puis ici j'appelle ma méthode pour dessiner le fond et mes personnages
   Dessine(gTmp);





}

5 réponses

tucobouch Messages postés 194 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 1 mai 2009 50
28 août 2006 à 13:39
Bonjour,
pas besoin d'un deuxieme Graphics, tu dessine tous tes objets zoomé en appliquant ton AffineTransform de zoom et ensuite tu enleve cette cette transformation du graphics pour afficher les objets non soumis au zoom.

En gros :

paintComponent :

//sauvegarde l'AffineTransform par defaut :
AffineTransform t=gTmp.getTransform();

//affiche avec le zoom :
gTmp.setTransform(AT_Globale);

//etc..

//enleve le zoom :
gTmp.setTransform(t);
//dessine  les objets non zoomés

- [TucoBouch] -
3
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
28 août 2006 à 13:41
Salut,

pour dessiner au dessus de ta zone tu peux ajouter une image transparente contenant le dessin :

public
void paintComponent(Graphics g){

   // Je préparre le graphique
   Graphics2D gTmp = (Graphics2D) g;
   gTmp.setRenderingHint(
      RenderingHints.
KEY_ANTIALIASING ,
      RenderingHints.
VALUE_ANTIALIAS_ON
   );

   super .paintComponent(g);

   // je crée la transformation affine pour zoomer sur une zone du décor
   AT_Globale =
new AffineTransform();

   AT_Globale.translate(
Xmin,
Ymin);

   AT_Globale.scale(1.0/
Zoom,1.0/
Zoom); 
   gTmp.setTransform(
AT_Globale);

   // puis ici j'appelle ma méthode pour dessiner le fond et mes personnages
   Dessine(gTmp);

    //ici tu peux dessinner ce que tu veux en superposant les images

    drawMyImage(this, g, new Rectangle(50, 50, 100, 100));

}

public void drawMyImage(Component c, Graphics g, Rectangle bounds ){
    //tu creer une image transparente
    BufferedImage bi = new BufferedImage(bounds.width, bounds.height, BufferedImage.TYPE_INT_ARGB);
    //tu récupere le graphique de l'image
    Graphics2D g2 = bi.createGraphics();

    //juste pour le fun tu ajoute une petite transparence sur le nouveau dessin 0.0f <= alpha <= 1.0f (1 == pas de transparence)
    float alpha = .5f;
    g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
    //ici tu commence à dessiner ce que tu veux
    g2.setColor(Color.BLACK);
    g2.fillRect(0, 0, bounds.width - 1, bounds.height - 1);

    //tu dessine l'image  
    g.drawImage(bi, bounds.x, bounds.y, c);
    //tu relache les ressources du Graphics2D
    g2.dispose();
}

Bref ce n'est qu'un exemple pour te donner une petite idée.

petit conseil pour un jeux n'utilise pas les jpanel ou autre merdasse du genre qui te bouffe plus de ressource qu'autre chose, prefere l'utilisation de sprites et des buffer strategie (ci dessous un lien utilisant cette technique) :
http://www.javafr.com/codes/JEU-SHOOT-REALISER-AVEC-CLASS-SPRITE_18353.aspx

ce qui rendra ton jeu tout de suite plus fluide.

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
0
omcougar Messages postés 152 Date d'inscription mardi 4 mai 2004 Statut Membre Dernière intervention 8 octobre 2008 1
28 août 2006 à 15:26
Ma classe est un JPanel... j'utilise ca en attendant mieux...
j'avais déja téléchagé le shoot'n up mais je n'ai pas trop saisis ... et peu cherché je dois l'avouer :) ... par contre ta methode ne bug pas mais rien ne s'affiche :,(
0
omcougar Messages postés 152 Date d'inscription mardi 4 mai 2004 Statut Membre Dernière intervention 8 octobre 2008 1
28 août 2006 à 15:45
Ta methode dessine bien un rectangle noir partiellement transparent, mais ce nerdnier ne vient pas s'ajouter au dessin final
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
28 août 2006 à 15:53
Salut,


oki pas de malaise voici un exemple concret de ce que je voulais te dire


import java.awt.AlphaComposite;

import java.awt.Color;

import java.awt.Component;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.Rectangle;

import java.awt.RenderingHints;

import java.awt.Shape;

import java.awt.geom.Ellipse2D;

import java.awt.geom.Rectangle2D;

import java.awt.image.BufferedImage;


import javax.swing.JFrame;

import javax.swing.JPanel;


public class Test extends JPanel{


    private static final long    serialVersionUID    = -1570645570118871214L;


    public Test(){ }

   

   

    public void paintComponent(Graphics g){

        drawImage1(this, g, new Rectangle(0, 0, getWidth(), getHeight()));

       

        drawImage2(this, g, new Rectangle(10, 20, 100, 100), .7f);

        drawImage2(this, g, new Rectangle(50, 50, 100, 100), .2f);

        drawImage2(this, g, new Rectangle(70, 100, 100, 100), .4f);

    }

   

    public void drawImage1(Component c, Graphics g, Rectangle bounds ){

        //tu creer une image transparente

        BufferedImage bi = new
BufferedImage(bounds.width, bounds.height, BufferedImage.TYPE_INT_ARGB);

        //tu récupere le graphique de l'image

        Graphics2D g2 = bi.createGraphics();

        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        g2.setColor(Color.RED);

        Shape circle1 = new Ellipse2D.Double(0, 0, 200, 200);

        Shape circle2 = new Ellipse2D.Double(50, 50, 200, 200);

        g2.fill(circle1);

        g2.setColor(Color.YELLOW);

        g2.clip(circle1);

        g2.fill(circle2);

         //tu dessine l'image 

        g.drawImage(bi, bounds.x, bounds.y, c);

        //tu relache les ressources du Graphics2D

        g2.dispose();

    }

   

    public void drawImage2(Component c, Graphics g, Rectangle bounds, float alpha ){

        //tu creer une image transparente

        BufferedImage bi = new
BufferedImage(bounds.width, bounds.height, BufferedImage.TYPE_INT_ARGB);

        //tu récupere le graphique de l'image

        Graphics2D g2 = bi.createGraphics();


        //juste pour le fun tu ajoute une
petite transparence sur le nouveau dessin 0.0f <= alpha <= 1.0f
(1 == pas de transparence)

        g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));

        //ici tu commence à dessiner ce que tu veux

        g2.setColor(Color.BLACK);

        Shape rect = new Rectangle2D.Double(0, 0, bounds.width - 1, bounds.height - 1);

        g2.fill(rect);

       

        //tu dessine l'image 

        g.drawImage(bi, bounds.x, bounds.y, c);

        //tu relache les ressources du Graphics2D

        g2.dispose();

    }

   

   

    public static void main(String [] args){

        JFrame f = new JFrame();

        f.setDefaultCloseOperation(3);

        f.setSize(300, 300);

        f.setLocationRelativeTo(null);

        f.setContentPane(new Test());

        f.setVisible(true);

    }


}


comme tu pourras le voir tu peut superposer plein de choses.


concernant les buffer strategy une fois que tu as compris le truc c'est vraiment un jeu d'enfant :P

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
0
Rejoignez-nous