Partage
  • Partager sur Facebook
  • Partager sur Twitter

Java JPanel double buffer aide

2D JPanel

    1 avril 2015 à 0:59:01

    Bonjours a tous !

    J'essaye de coder en ce moment un petit jeu en java, mais lors de la réalisation de celui si je suis arriver a la création d'un scrolling et la c'est le bug !
    Je m'explique, je veux faire bouger mon image de fond, et la deux problèmes ce posent a moi:

    - mon image a un effet de "cliping" , affichage qui fait mal au yeux et l'ajout d'un double buffer ne semble pas améliorer la situation !
    - je n'arrive pas a trouver un maniérè d'augmenter la vitesse de défilement du scrolling car il se déplace de 1 ( ou 5 ) pixel par tour de boucle, et augmenter cette valeur pour un deplacement plus rapide provoque que plus de saccade et une image non fluide.

    Bref je suis perdu, que faire... voici le code pour y voir plus clair !

    Fenetre.java

    package trianglescrolling;
    
    import java.awt.Graphics2D;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;
    import java.awt.image.BufferStrategy;
    
    import javax.swing.JFrame;
    
    public class Fenetre extends JFrame implements MouseListener {
    	
    	  private SousFenetreAffichage sfa = new SousFenetreAffichage();  
    	  private BufferStrategy          strategy;
    	  private FenetreMenu mFenetre;
    	  
    	  private int  xSourie;
    	  private int  ySourie;
    	
    	  
    	public Fenetre(){
    		
    		 //caracteristique propre a la fenetre de Jeux
    	    this.setTitle("Jeux");	//son nom
    	    this.setSize(1920, 1080);	//sa taille
    	    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	//pouvoir la fermer
    	    this.setLocationRelativeTo(null);
    	    this.setContentPane(sfa);
    	    this.setVisible(true);
    	    this.setResizable(false);
    	    mFenetre = new FenetreMenu();
    	    
            createBufferStrategy( 2 );
            strategy = getBufferStrategy();        
    	    
    	    this.addMouseMotionListener(new MouseMotionListener(){
    	        public void mouseDragged(MouseEvent e) {
    
    	        }
    	        
    	        public void mouseMoved(MouseEvent e) {
    	        	xSourie = e.getX();
    	        	ySourie = e.getY();
    	        	
    	        	//System.out.println("xCoordonneSourie et yCoordonneSourie :" + xSourie + " " + ySourie);
    	        	
    	        }
    	      });
    
            
    	    go();
    	}
    	
    	private void go(){
    
    		
            Graphics2D graphics2D;
    		
    		while(true){
    	      int x = sfa.getPosX(), y = sfa.getPosY();
    
    	      
    	      if(xSourie > 1870){
    	    	  x=x-5;
    	      }
    	      if(xSourie < 50){
    	    	  x=x+5;
    	      }
    	      if(ySourie > 1030){
    	    	  y=y-5;
    	      }
    	      if(ySourie < 50){
    	    	  y=y+5;
    	      }      
    	      
              graphics2D = (Graphics2D) strategy.getDrawGraphics();
    	      sfa.setPosX(x);
    	      sfa.setPosY(y);
    	      sfa.paintComponent(graphics2D); 
              strategy.show();
    	      try {
    	        Thread.sleep(3);
    	      } catch (InterruptedException e) {
    	        e.printStackTrace();
    	      }
    		}
    	  }
    
    	@Override
    	public void mouseClicked(MouseEvent e) {
    		
    		
    	}
    
    	@Override
    	public void mouseEntered(MouseEvent e) {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void mouseExited(MouseEvent e) {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void mousePressed(MouseEvent e) {
    		
    		
    	}
    
    	@Override
    	public void mouseReleased(MouseEvent e) {
    		// TODO Auto-generated method stub
    		
    	}
    	
    }

    SousFenetreAffichage.java

    package trianglescrolling;
    
    import java.awt.BasicStroke;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.Point;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionListener;
    import java.awt.image.BufferStrategy;
    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    
    import javax.imageio.ImageIO;
    import javax.swing.JPanel;
     
    public class SousFenetreAffichage extends JPanel {
    	
    	  private int xFenetre = 50;
    	  private int yFenetre = 50;
    	  
    	  private ArrayList<TriangleTileset> triangleTileset = new ArrayList<TriangleTileset>();
    	 
    	  
      public void paintComponent(Graphics2D g){ 
        try {
        	
          Image img = ImageIO.read(new File("./images/terraintest.jpg"));
          g.fillRect(0, 0, 3000, 3000);
          
          g.drawImage(img, xFenetre, yFenetre, this);
          
          g.setStroke(new BasicStroke(5));
          for(int i=0;i<triangleTileset.size();i++){
        	  g.drawLine(triangleTileset.get(i).getPosAll(1), triangleTileset.get(i).getPosAll(4), triangleTileset.get(i).getPosAll(2), triangleTileset.get(i).getPosAll(5));
        	  g.drawLine(triangleTileset.get(i).getPosAll(2), triangleTileset.get(i).getPosAll(5), triangleTileset.get(i).getPosAll(3), triangleTileset.get(i).getPosAll(6));
        	  g.drawLine(triangleTileset.get(i).getPosAll(3), triangleTileset.get(i).getPosAll(6), triangleTileset.get(i).getPosAll(1), triangleTileset.get(i).getPosAll(4));
              g.drawLine(0,0,900,800);
          }
          
        //  if(xFenetre>51)
       //   g.drawLine(0,0,900,800);
          
          //Pour une image de fond
          //g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this);
        } catch (IOException e) {
          e.printStackTrace();
        }    
      }
      
    
      
      public int getPosX() {
    	    return xFenetre;
    	  }
    
      public void setPosX(int posX) {
    	    xFenetre = posX;
    	  }
    
    	public int getPosY() {
    	    return yFenetre;
    	  }
    
    	public void setPosY(int posY) {
    	    yFenetre = posY;
    	  }  
    	
    	public ArrayList getArrayTriangle() {
    	    return triangleTileset;
    	  }  
    	
    	public void majArrayTriangle(TriangleTileset t) {
    	    triangleTileset.add(t);
    	  }  
      
    }

    merci d'avance !


    • Partager sur Facebook
    • Partager sur Twitter

    Java JPanel double buffer aide

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown