Fusion Graphics2D et AffineTransform [Résolu/Fermé]

omcougar 152 Messages postés mardi 4 mai 2004Date d'inscription 8 octobre 2008 Dernière intervention - 28 août 2006 à 13:05 - Dernière réponse : Twinuts 5266 Messages postés dimanche 4 mai 2003Date d'inscription 19 juin 2018 Dernière intervention
- 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);





}
Afficher la suite 

5 réponses

Meilleure réponse
tucobouch 207 Messages postés vendredi 17 février 2006Date d'inscription 1 mai 2009 Dernière intervention - 28 août 2006 à 13:39
3
Merci
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] -

Merci tucobouch 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 125 internautes ce mois-ci

Commenter la réponse de tucobouch
Twinuts 5266 Messages postés dimanche 4 mai 2003Date d'inscription 19 juin 2018 Dernière intervention - 28 août 2006 à 13:41
0
Merci
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
Commenter la réponse de Twinuts
omcougar 152 Messages postés mardi 4 mai 2004Date d'inscription 8 octobre 2008 Dernière intervention - 28 août 2006 à 15:26
0
Merci
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 :,(
Commenter la réponse de omcougar
omcougar 152 Messages postés mardi 4 mai 2004Date d'inscription 8 octobre 2008 Dernière intervention - 28 août 2006 à 15:45
0
Merci
Ta methode dessine bien un rectangle noir partiellement transparent, mais ce nerdnier ne vient pas s'ajouter au dessin final
Commenter la réponse de omcougar
Twinuts 5266 Messages postés dimanche 4 mai 2003Date d'inscription 19 juin 2018 Dernière intervention - 28 août 2006 à 15:53
0
Merci
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
Commenter la réponse de Twinuts

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.