IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Multimédia Java Discussion :

arriere plan dynamique


Sujet :

Multimédia Java

  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 379
    Par défaut arriere plan dynamique
    Hi,

    comment on fait pour que l'image de l'arriere plan de la fenetre bouge

    c'est a dire je veux que la partie d'en bas de l'image devient en haut , et ainsi de suite , donc ca sera comme L'image de l'arriere plan bouge verticalement


    vous avez une idée sur ca SVP ?


    merci


    ...

  2. #2
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 379
    Par défaut
    Citation Envoyé par Mo_Poly
    Hi,

    comment on fait pour que l'image de l'arriere plan de la fenetre bouge

    c'est a dire je veux que la partie d'en bas de l'image devient en haut , et ainsi de suite , donc ca sera comme L'image de l'arriere plan bouge verticalement


    vous avez une idée sur ca SVP ?


    merci


    ...


    personne ?



    ...

  3. #3
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 379
    Par défaut
    Up



    ...

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 913
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 913
    Billets dans le blog
    54
    Par défaut
    Il te faut rechercher du cote des methodes d'animation (et ce n'est pas forcement un probleme lie a Java, ca depend de l'etat de tes connaissances).

    Sinon pour rester en Java, ce serait plus simple si tu pouvais indiquer par quoi tu veux commencer. Ex : sais-tu deja comment afficher une image en arriere plan d'une JFrame ou d'un JPanel ?

    Sinon regarde du cote des Timer Swing car faire une animation c'est faire evoluer (position/transformation/...) dans le temps. Egalement il te faudra peut-etre aussi potasser tes cours de maths (une position/valeur qui evolue dans le temps... c'est une equation bien sur...).

    Et enfin, dernierement les gens de http://www.javadesktop.org/index.html ont parler d'une API/framework pour faire des animations dans Swing (ce qui simplifie probablement le cote mathematique de la chose), c'est peut-etre ce que tu cherches ?
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 379
    Par défaut
    Citation Envoyé par bouye
    Il te faut rechercher du cote des methodes d'animation (et ce n'est pas forcement un probleme lie a Java, ca depend de l'etat de tes connaissances).

    Sinon pour rester en Java, ce serait plus simple si tu pouvais indiquer par quoi tu veux commencer. Ex : sais-tu deja comment afficher une image en arriere plan d'une JFrame ou d'un JPanel ?

    Sinon regarde du cote des Timer Swing car faire une animation c'est faire evoluer (position/transformation/...) dans le temps. Egalement il te faudra peut-etre aussi potasser tes cours de maths (une position/valeur qui evolue dans le temps... c'est une equation bien sur...).

    Et enfin, dernierement les gens de http://www.javadesktop.org/index.html ont parler d'une API/framework pour faire des animations dans Swing (ce qui simplifie probablement le cote mathematique de la chose), c'est peut-etre ce que tu cherches ?


    en fait ce que je cherche c'est exactement ca : http://www.planetalia.com/cursos/Jav...RS-25.tutorial

    mais je n'arrive pas trop a comprendre leur facon de proceder ! oui en fait j'ai un background (j'ai pleins de choses qui marche j'ai presque fini le jeu il me reste surtout les menu et cette affaire de background)

    moi j'ai une classe scene dont le constructeur prend le nom de l'image du background en parametres, pour dessiner ce background , j'ai ce code dans la methode paint qui est toujours appelé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Graphics2D g2d = (Graphics2D) g;
                // Dessiner l'arrière plan
                double scalex = (double)this.getWidth()  / (double)image.getIconWidth();
                double scaley = (double)this.getHeight() / (double)image.getIconHeight();
                g2d.scale(scalex,scaley);
     
     
                g2d.drawImage(image.getImage(),0,0,image.getImageObserver());
    dans le liens que j'ai mis en haut , ils utilisent si j'ai bien compris les textures , je ne comprend pas pourquoi ! j'ai essayé de faire bouger la position dans g2d.drawImage(image.getImage(),0,0,image.getImageObserver()); mais ca ne fait que decaler l'image en bas, sans que la partie tout en bas ne deviennent en haut ! je suis un peu perdu quand meme la !



    merci bouye



    ...

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 913
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 913
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par Mo_Poly
    dans le liens que j'ai mis en haut , ils utilisent si j'ai bien compris les textures , je ne comprend pas pourquoi !...
    Car TexturePaint permet facilement d'avoir une image qui se repete sur toute une surface.

    Quand tu creee une texture tu specifie un image et une boite englobante (en general a la taille de l'image et avec le point superieur gauche en (0,0)). Et si tu peinds entierement une surface (toute la surface du panel ou de la fenetre) avec cette texture alors ton image se repete sur toute la surface. Le truc interessant c'est que si, au pas de temps suivant, tu fais varier les coordonnees du coin superieur gauche de la boite englobante (ou meme sa forme) ca anime la texture en deplacant l'image ou en zoomant/dezoomant/deformant l'image...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TexturePaint texture = new TexturePaint(image, new Rectangle(0, currentY, image.getWidth(), image.getHeight());
    g2d.setPaint(texture);
    g2d.fillRect(0, 0, panelWidth, panelHeight);
    C'est simple mais probablement pas la methode la plus optimisee en terme de puissance et acceleration materielle.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  7. #7
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 379
    Par défaut
    Citation Envoyé par bouye
    Car TexturePaint permet facilement d'avoir une image qui se repete sur toute une surface.

    Quand tu creee une texture tu specifie un image et une boite englobante (en general a la taille de l'image et avec le point superieur gauche en (0,0)). Et si tu peinds entierement une surface (toute la surface du panel ou de la fenetre) avec cette texture alors ton image se repete sur toute la surface. Le truc interessant c'est que si, au pas de temps suivant, tu fais varier les coordonnees du coin superieur gauche de la boite englobante (ou meme sa forme) ca anime la texture en deplacant l'image ou en zoomant/dezoomant/deformant l'image...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TexturePaint texture = new TexturePaint(image, new Rectangle(0, currentY, image.getWidth(), image.getHeight());
    g2d.setPaint(texture);
    g2d.fillRect(0, 0, panelWidth, panelHeight);
    C'est simple mais probablement pas la methode la plus optimisee en terme de puissance et acceleration materielle.


    salut

    je ne suis pas sure d'avoir tout compris a 100% , mais j'ai essayé un truc quand meme

    en fait le TexturePaint prend en paramtre un bufferedimage , donc voila ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     Graphics2D g2d = (Graphics2D) g;
                // Dessiner l'arrière plan
                double scalex = (double)this.getWidth()  / (double)image.getIconWidth();
                double scaley = (double)this.getHeight() / (double)image.getIconHeight();
                g2d.scale(scalex,scaley);
     
                background = new BufferedImage(image.getIconWidth(),image.getIconHeight(),BufferedImage.TYPE_INT_ARGB);
                g2d.setPaint(new TexturePaint(background, new Rectangle(0,t,background.getWidth(),background.getHeight())));
                g2d.fillRect(0,0,getWidth(),getHeight());
                g2d = background.createGraphics();
                g2d.drawImage(image.getImage(),0,0,image.getImageObserver());

    ce que ca fait , c'est supprimer carement le background

    c'est pour ca que je ne suis pas sure d'avoir compris, j'ai pourtant suivis la demarche a faire !



    merci pour la reponse bouye



    ...

  8. #8
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 913
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 913
    Billets dans le blog
    54
    Par défaut
    Mieux vaut un exemple plutot qu'un long discourt pas clair :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    package test;
     
    import java.io.*;
    import java.awt.*;
    import java.awt.geom.*;
    import java.awt.image.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.imageio.*;
     
    /**
     * <p>Title: </p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2006</p>
     * <p>Company: </p>
     * @author not attributable
     * @version 1.0
     */
    public class TestTextureScroll extends JPanel implements ActionListener {
      private BufferedImage image;
      private Timer timer;
      private int anchorY;
     
      /** Creates a new instance.
       * @throws IOException In case of I/O error.
       */
      public TestTextureScroll() throws IOException {
        image = ImageIO.read(new File("fbavatar.png"));
        image = toCompatibleImage(image);
        timer = new Timer(50, this);
      }
     
      /** {@inheritDoc}
       */
      @Override protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Insets insets = getInsets();
        Dimension size = getSize();
        int width = size.width - (insets.left + insets.right);
        int height = size.height - (insets.top + insets.bottom);
        Graphics2D g2d = (Graphics2D) g.create(insets.left, insets.top, width, height);
        try {
          TexturePaint texture = new TexturePaint(image, new Rectangle(0, anchorY, image.getWidth(), image.getHeight()));
          g2d.setPaint(texture);
          g2d.fillRect(0, 0, width, height);
        }
        finally {
          g2d.dispose();
        }
      }
     
      /** Stats animation.
       */
      public void start() {
        timer.restart();
      }
     
      /** Stops animation.
       */
      public void stop() {
        timer.stop();
      }
     
      ///////////////////////
      // Event management. //
      ///////////////////////
     
      /** {@inheritDoc}
       */
      public void actionPerformed(ActionEvent event) {
        anchorY = (anchorY + 2) % image.getHeight();
        repaint();
      }
     
      /////////////////////
      // Statuc methods. //
      /////////////////////
     
      /** Converts an image to a compatible image.
       * @param image The source image.
       * @return A compatible image.
       */
      public static BufferedImage toCompatibleImage(BufferedImage image) {
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsConfiguration gc = ge.getDefaultScreenDevice().getDefaultConfiguration();
        BufferedImage result = gc.createCompatibleImage(image.getWidth(null), image.getHeight(null), image.getTransparency());
        Graphics2D g2d = result.createGraphics();
        try {
          g2d.drawImage(image, 0, 0, null);
        }
        finally {
          g2d.dispose();
        }
        return image;
      }
     
      /** Program entry point.
       * @param args Arguments from the command line.
       */
      public static void main(String ...args) {
        SwingUtilities.invokeLater(new Runnable() {
          /** {@inheritDoc}
           */
          public void run() {
            try {
              final TestTextureScroll testPanel = new TestTextureScroll();
              final JToggleButton button = new JToggleButton("Animate");
              button.addActionListener(new ActionListener() {
                /** {@inheritDoc}
                 */
                public void actionPerformed(ActionEvent event) {
                  if (button.isSelected()) {
                    testPanel.start();
                    button.setText("Stop");
                  }
                  else {
                    testPanel.stop();
                    button.setText("Start");
                  }
                }
              });
              JFrame frame = new JFrame("Test");
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              frame.setContentPane(testPanel);
              frame.setLayout(new FlowLayout(FlowLayout.LEADING));
              frame.add(button);
              frame.setSize(new Dimension(400, 400));
              frame.setVisible(true);
            }
            catch (IOException ioe) {
              ioe.printStackTrace();
            }
          }
        });
      }
    }
    Comme je te l'ai dit au niveau acceleration ce n'est pas la meilleure methode mais c'est cependant la plus facile a mettre en place. Si tu aggrandi trop la fenetre ca aura tendance a saccader pas mal. Ensuite tu n'es pas forcement obliger de recreer un nouveau TexturePaint a chaque fois en fait on peut regler le decallage de l'image avec quelques transformations affines appropiees.

    Apres mieux vaut faire la mosaique qui compose le fond soit meme sans passer par un TexturePaint avec 2 boucles for et quelques calculs d'intersection avec la zone d'affichage, tu gagneras probablement plus au niveau acceleration materielle.
    Images attachées Images attachées  
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  9. #9
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 379
    Par défaut
    Citation Envoyé par bouye
    Mieux vaut un exemple plutot qu'un long discourt pas clair :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    package test;
     
    import java.io.*;
    import java.awt.*;
    import java.awt.geom.*;
    import java.awt.image.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.imageio.*;
     
    /**
     * <p>Title: </p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2006</p>
     * <p>Company: </p>
     * @author not attributable
     * @version 1.0
     */
    public class TestTextureScroll extends JPanel implements ActionListener {
      private BufferedImage image;
      private Timer timer;
      private int anchorY;
     
      /** Creates a new instance.
       * @throws IOException In case of I/O error.
       */
      public TestTextureScroll() throws IOException {
        image = ImageIO.read(new File("fbavatar.png"));
        image = toCompatibleImage(image);
        timer = new Timer(50, this);
      }
     
      /** {@inheritDoc}
       */
      @Override protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Insets insets = getInsets();
        Dimension size = getSize();
        int width = size.width - (insets.left + insets.right);
        int height = size.height - (insets.top + insets.bottom);
        Graphics2D g2d = (Graphics2D) g.create(insets.left, insets.top, width, height);
        try {
          TexturePaint texture = new TexturePaint(image, new Rectangle(0, anchorY, image.getWidth(), image.getHeight()));
          g2d.setPaint(texture);
          g2d.fillRect(0, 0, width, height);
        }
        finally {
          g2d.dispose();
        }
      }
     
      /** Stats animation.
       */
      public void start() {
        timer.restart();
      }
     
      /** Stops animation.
       */
      public void stop() {
        timer.stop();
      }
     
      ///////////////////////
      // Event management. //
      ///////////////////////
     
      /** {@inheritDoc}
       */
      public void actionPerformed(ActionEvent event) {
        anchorY = (anchorY + 2) % image.getHeight();
        repaint();
      }
     
      /////////////////////
      // Statuc methods. //
      /////////////////////
     
      /** Converts an image to a compatible image.
       * @param image The source image.
       * @return A compatible image.
       */
      public static BufferedImage toCompatibleImage(BufferedImage image) {
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsConfiguration gc = ge.getDefaultScreenDevice().getDefaultConfiguration();
        BufferedImage result = gc.createCompatibleImage(image.getWidth(null), image.getHeight(null), image.getTransparency());
        Graphics2D g2d = result.createGraphics();
        try {
          g2d.drawImage(image, 0, 0, null);
        }
        finally {
          g2d.dispose();
        }
        return image;
      }
     
      /** Program entry point.
       * @param args Arguments from the command line.
       */
      public static void main(String ...args) {
        SwingUtilities.invokeLater(new Runnable() {
          /** {@inheritDoc}
           */
          public void run() {
            try {
              final TestTextureScroll testPanel = new TestTextureScroll();
              final JToggleButton button = new JToggleButton("Animate");
              button.addActionListener(new ActionListener() {
                /** {@inheritDoc}
                 */
                public void actionPerformed(ActionEvent event) {
                  if (button.isSelected()) {
                    testPanel.start();
                    button.setText("Stop");
                  }
                  else {
                    testPanel.stop();
                    button.setText("Start");
                  }
                }
              });
              JFrame frame = new JFrame("Test");
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              frame.setContentPane(testPanel);
              frame.setLayout(new FlowLayout(FlowLayout.LEADING));
              frame.add(button);
              frame.setSize(new Dimension(400, 400));
              frame.setVisible(true);
            }
            catch (IOException ioe) {
              ioe.printStackTrace();
            }
          }
        });
      }
    }
    Comme je te l'ai dit au niveau acceleration ce n'est pas la meilleure methode mais c'est cependant la plus facile a mettre en place. Si tu aggrandi trop la fenetre ca aura tendance a saccader pas mal. Ensuite tu n'es pas forcement obliger de recreer un nouveau TexturePaint a chaque fois en fait on peut regler le decallage de l'image avec quelques transformations affines appropiees.

    Apres mieux vaut faire la mosaique qui compose le fond soit meme sans passer par un TexturePaint avec 2 boucles for et quelques calculs d'intersection avec la zone d'affichage, tu gagneras probablement plus au niveau acceleration materielle.



    j'ai essayé de suivre le code que t'as donné (meme si je ne l'ai pas compris a 100%) mais comme dhab, ca me sort plus rien quand je fais ca

    ce que j'ai fait , c'est chargé l'image du background dans un buffered image dans le constructeur de la classe Jscene (extends javax.swing.JPanel) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     public JScene(String nomimage) {
     
            image = new ImageIcon(getClass().getResource(nomimage));
            background = new BufferedImage(image.getIconWidth(),image.getIconHeight(),BufferedImage.TYPE_INT_ARGB);
            // Le vecteur et les objets
            elements = new Vector<JObject>();
     
            Hscores= new Vector<String>();
            anchorY=0;
            background= toCompatibleImage(background);
     
     
     
     
     
        }
    la fonction toCompatibleImage je l'ai copié telle quelle (vu que je n'ai pas compris ce que ca fai (doucement hein ca fai 1 mois que jai commencé a programmer en java ))

    apres dans la fonction paintcomponent jai essayé de suivre la fonction paint de ton exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    32
    33
    34
    35
    36
    37
    38
    39
        public void paintComponent(Graphics g) {
     
              super.paintComponent(g);
     
     
     
                Graphics2D g2d = (Graphics2D) g;
                // Dessiner l'arrière plan
                double scalex = (double)this.getWidth()  / (double)image.getIconWidth();
                double scaley = (double)this.getHeight() / (double)image.getIconHeight();
                g2d.scale(scalex,scaley);
                try {
                  TexturePaint texture = new TexturePaint(background, new Rectangle(0, anchorY, background.getWidth(), background.getHeight()));
                  g2d.setPaint(texture);
                  g2d.fillRect(0, 0, 1190, 610);
                }
                finally {
                  g2d.dispose();
                }
     
     
                g2d.drawImage(image.getImage(),0,0,image.getImageObserver());
                g2d.scale(1/scalex,1/scaley);
                g2d.setColor(Color.LIGHT_GRAY);
                g.setFont( new Font( "", Font.ITALIC, 24 ) );
                g2d.drawString( "Vies : "+vie+"%", 10, 30 );
                g2d.drawString( "Scores : "+score, 1100, 30 );
                g2d.drawString( "Missiles : 000 ", 1100, 60 );
     
     
                // Afficher le vecteur
                for(int i=0;i<elements.size();i++)
                {
                    elements.get(i).paintComponent(g);
                }
     
     
                anchorY++;
         }

    fai chier lol


    encore merci bouye



    ...

  10. #10
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 913
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 913
    Billets dans le blog
    54
    Par défaut
    la methode toCompatibleImage() recopie l'image lue sur le disque dans un format compatible avec la carte video. C'est a dire que l'image n'aura pas besoin d'etre transformee (par la carte) pour etre affichee a l'ecran (et donc on gagne du temps). C'est une bonne idee de passer tous tes sprites et image a travers cette moulinette avant des les utiliser une premiere fois.

    Il ne vaut SURTOUT PAS faire un dispose() sur le graphics passe en parametre de la methode paintComponent(). D'autant plus que tu dessines dedans juste apres. Si tu regardes bien, je fait dispose() sur une VUE creee par la methode g.create().

    Ce n'est pas une bonne idee que de passer un ImageObserver quand tu dessines une image avec drawImage(), mieux vaut passer null. Le mecanisme de l'ImageObserver (qui a tendance a ralentir la chose comme tous les observations asynchrones) n'est utile que si tu as charge ton image de maniere asynchrone (avec Toolkit, etc...).

    N'increment pas le pas de localisation y dans paintComponent(), cette methode pouvant etre appelee n'importe quand (et par n'importe qui) c'est une mauvaise idee de faire de la logique d'animation dedans. Mieux vaut une Thread ou un Timer bien distinct.

    Pour moi, ca ca marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
      private Font font = new Font("Dialog", Font.ITALIC, 24);
     
      public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        // Dessiner l'arrière plan
        double scalex = (double)this.getWidth() / (double) image.getWidth();
        double scaley = (double)this.getHeight() / (double) image.getHeight();
        g2d.scale(scalex, scaley);
        TexturePaint texture = new TexturePaint(image, new Rectangle(0, anchorY, image.getWidth(), image.getHeight()));
        g2d.setPaint(texture);
        g2d.fillRect(0, 0, 1190, 610);
        g2d.scale(1 / scalex, 1 / scaley);
        g2d.setColor(Color.LIGHT_GRAY);
        //g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g2d.setFont(font);
        g2d.drawString("Vies : " + vie + "%", 10, 30);
        g2d.drawString("Scores : " + score, 1100, 30);
        g2d.drawString("Missiles : 000 ", 1100, 60);
        // Afficher le vecteur
        for(int i=0;i<elements.size();i++)
        {
          elements.get(i).paintComponent(g);
        }
      }

    Et ca aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    32
    33
    34
    35
       private Font font = new Font("Dialog", Font.ITALIC, 24);
     
      public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        double scalex = (double)this.getWidth() / (double) image.getWidth();
        double scaley = (double)this.getHeight() / (double) image.getHeight();
        g2d.scale(scalex, scaley);
        fillBackground(g2d, image, anchorY, getWidth() / scalex, getHeight() / scaley);
        g2d.scale(1 / scalex, 1 / scaley);
        g2d.setColor(Color.LIGHT_GRAY);
        //g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g2d.setFont(font);
        g2d.drawString("Vies : " + vie + "%", 10, 30);
        g2d.drawString("Scores : " + score, 1100, 30);
        g2d.drawString("Missiles : 000 ", 1100, 60);
        // Afficher le vecteur
        for(int i=0;i<elements.size();i++)
        {
          elements.get(i).paintComponent(g);
        }
      }
     
      protected void fillBackground(Graphics2D g, BufferedImage image, int anchorY, double width, double height) {
        Shape oldClip = g.getClip();
        g.setClip(new Rectangle(0, 0, (int) width, (int) height));
        int imageWidth = image.getWidth();
        int imageHeight = image.getHeight();
        for (int j = -imageHeight + anchorY; j < height; j += imageHeight) {
          for (int i = 0; i < width; i += imageWidth) {
            g.drawImage(image, i, j, null);
          }
        }
        g.setClip(oldClip);
      }
    Mais c'est pareil : quand la fenetre est trop grande, ca rame. Tu devrais poser ta question sur les forums (en anglais) 2D de http://javagaming.org puiqu'une optimisation/acceleration d'un scrolling releve bien plus de techniques de jeu que de la simple programmation de GUI.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  11. #11
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 379
    Par défaut
    je crois que j'ai trouvé le probleme, vu que a chaque fois que j'utilise ton code direct ca ne compile pas

    c'est que l'image de l'arriere plan je l'ai dans une variable ImageIcon , alors que toi tu utilise un bufferedImage, si je charge l'image dans un bufferedImage, je dois supprimer le code qui affiche la premiere image alors non ?



    merci




    ...

  12. #12
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 913
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 913
    Billets dans le blog
    54
    Par défaut
    Pas tout compris. Pour charger une image de maniere synchrone tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BufferedImage image = ImageIO.read(....);
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ImageIcon icon = new ImageIcon(...);
    BufferedImage image = toBufferedImage(icon.getImage());
    avec toBufferedImage() ta methode a toi qui convertit une Image en BufferedImage (cad si source instanceof BufferedImage on ne fait rien de special, sinon on cree une nouvelle BufferedImage et on recopie la source dedans).

    je dois supprimer le code qui affiche la premiere image alors non ?
    Pourquoi faudrait-il la dessiner separement ???
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  13. #13
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 379
    Par défaut
    Citation Envoyé par bouye

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
      private Font font = new Font("Dialog", Font.ITALIC, 24);
     
      public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        // Dessiner l'arrière plan
        double scalex = (double)this.getWidth() / (double) image.getWidth();
        double scaley = (double)this.getHeight() / (double) image.getHeight();
        g2d.scale(scalex, scaley);
        TexturePaint texture = new TexturePaint(image, new Rectangle(0, anchorY, image.getWidth(), image.getHeight()));
        g2d.setPaint(texture);
        g2d.fillRect(0, 0, 1190, 610);
        g2d.scale(1 / scalex, 1 / scaley);
        g2d.setColor(Color.LIGHT_GRAY);
        //g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g2d.setFont(font);
        g2d.drawString("Vies : " + vie + "%", 10, 30);
        g2d.drawString("Scores : " + score, 1100, 30);
        g2d.drawString("Missiles : 000 ", 1100, 60);
        // Afficher le vecteur
        for(int i=0;i<elements.size();i++)
        {
          elements.get(i).paintComponent(g);
        }
      }



    mon probleme en fait est que je suis confu entre la variable imageIcon , et celle du BufferedImage

    a chaque fois que je veux essayer ton code ca ne compile pas chez moi , bon la jai essayé celui de la citation , ca compilé mais ca ma supprimé mon background, mnt jai carement plus de background

    ce que j'ai fait c'est mettre la variable ImageIcon dans un BufferedImage dans le constructeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            background= new BufferedImage(image.getIconWidth(),image.getIconHeight(),BufferedImage.TYPE_INT_ARGB);

    je l'ai fait avec cette methode car avec tes methodes que ta cité dans ton dernier message , ca na pas compilé

    aprés jai suivi ta medhode de la premiere citation a la lettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        // Dessiner l'arrière plan
        double scalex = (double)this.getWidth() / (double) background.getWidth();
        double scaley = (double)this.getHeight() / (double) background.getHeight();
        g2d.scale(scalex, scaley);
        TexturePaint texture = new TexturePaint(background, new Rectangle(0, anchorY, background.getWidth(), background.getHeight()));
        g2d.setPaint(texture);
        g2d.fillRect(0, 0, 1190, 610);
        g2d.scale(1 / scalex, 1 / scaley);
        g2d.setColor(Color.LIGHT_GRAY);
        //g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g2d.setFont(font);
        g2d.drawString("Vies : " + vie + "%", 10, 30);
        g2d.drawString("Scores : " + score, 1100, 30);
        g2d.drawString("Missiles : 000 ", 1100, 60);
        // Afficher le vecteur
        for(int i=0;i<elements.size();i++)
        {
          elements.get(i).paintComponent(g);
        }
        //anchorY++;
      }

    sans ou avec lincrementation du anchorY ca ne marche pas, jai essayé son oncrementation dans un thread , non plus , je nbtient une arriere plan grise ! ya plus la foto

    donc comme je t'ai dit mon probleme c'est que je suis confus entre la ImageIcon et le BufferedImage , j'ai limpression que l'ImageIcon on la pas utilisé, on la juste mi dans un BufferedImage c'est tout. puis je ne vois pas la fonction qui va afficher le bufferedImage dans le code .

    Je t'ai trop fatigué avec moi bouye je m'excuse vraiment (merde la honte chui nul )


    et mille merci encore



    ...

Discussions similaires

  1. Réponses: 0
    Dernier message: 23/01/2009, 06h45
  2. Installer Interbase en arriere plan depuis delphi
    Par nanaalain dans le forum Bases de données
    Réponses: 9
    Dernier message: 24/11/2003, 15h18
  3. programme en arriere plan
    Par tgx874sah dans le forum Réseau
    Réponses: 4
    Dernier message: 21/11/2003, 14h06
  4. [MFC]arriere plan pour un objet de la classe CStatic
    Par gabriel knight dans le forum MFC
    Réponses: 13
    Dernier message: 28/07/2003, 11h42
  5. j'arrive pas a arreter mon thread d'arriere-plan
    Par ms91fr dans le forum Langage
    Réponses: 6
    Dernier message: 06/06/2003, 22h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo