2017-06-07 3 views
-1

Donc, fondamentalement, pendant des jours, j'ai essayé de comprendre l'auditeur clé dans lequel je l'ai fait pour déplacer mon objet 'Superman' avec les touches fléchées. Cela ne fonctionne que lorsque I/* */out ma boucle while de dessiner la route «en mouvement». Une fois qu'il n'est pas commenté et que je cours le programme, le Superman ne bouge pas, et je suppose que c'est parce que la boucle a la priorité sur l'image. Je crois que j'ai besoin d'aide pour filer la priorité des images. L'aide est très appréciée.Comment donner à une image une priorité sur un fond de dessin en boucle

// The "CPT" class. 
import java.applet.*; 
import java.awt.*; 
import java.awt.Image; 
import java.awt.event.*; 
import javax.swing.*; 
import java.lang.Runnable; 
import java.lang.Thread; 



public class CPT extends Applet implements KeyListener 
{ 
    // Place instance variables here 
    Image myImage; 
    int x = 100, y = 200; 

    public void init() 
    { 

     myImage = getImage (getCodeBase(), "SuperMan.png"); 
     System.out.println (getCodeBase()); 
     addKeyListener (this); 
     // Place the body of the initialization method here 
    } // init method 





    public void paint (Graphics g) 
    { 




     //Drawing sky 
     g.setColor (new Color (150, 150, 254)); 
     g.fillRect (0, 0, 1000, 500); 
     //Drawing floor 
     g.setColor (Color.black); 
     g.fillRect (0, 500, 1000, 150); 
     //Drawing road lines 





     //g.fillRect (
     //Drawing Sun 
     g.setColor (Color.yellow); 
     g.fillOval (800, 50, 75, 75); 

     //Drawing Birds 
     g.setColor (Color.black); 
     g.drawArc (100, 75, 25, 25, 0, 180); 
     g.drawArc (125, 75, 25, 25, 0, 180); 

     g.drawArc (175, 85, 25, 25, 0, 180); 
     g.drawArc (200, 85, 25, 25, 0, 180); 

     g.drawArc (250, 65, 25, 25, 0, 180); 
     g.drawArc (275, 65, 25, 25, 0, 180); 

     //Drawing Smaller Birds 

     g.drawArc (125, 55, 15, 15, 0, 180); 
     g.drawArc (140, 55, 15, 15, 0, 180); 
     while (true) 
     { 

      g.setColor (Color.black); 
      g.fillRect (-30, 575, 80, 25); 
      g.fillRect (120, 575, 80, 25); 
      g.fillRect (270, 575, 80, 25); 
      g.fillRect (420, 575, 80, 25); 
      g.fillRect (570, 575, 80, 25); 
      g.fillRect (720, 575, 80, 25); 
      g.fillRect (870, 575, 80, 25); 
      //first blocks 
      g.setColor (Color.yellow); 
      g.fillRect (50, 575, 80, 25); 
      g.fillRect (200, 575, 80, 25); 
      g.fillRect (350, 575, 80, 25); 
      g.fillRect (500, 575, 80, 25); 
      g.fillRect (650, 575, 80, 25); 
      g.fillRect (800, 575, 80, 25); 
      g.fillRect (950, 575, 80, 25); 





      for (int k = 0 ; k < 100000000 ; k++) 
       ; 
      //second blocks 

      g.setColor (Color.black); 
      g.fillRect (50, 575, 80, 25); 
      g.fillRect (200, 575, 80, 25); 
      g.fillRect (350, 575, 80, 25); 
      g.fillRect (500, 575, 80, 25); 
      g.fillRect (650, 575, 80, 25); 
      g.fillRect (800, 575, 80, 25); 
      g.fillRect (950, 575, 80, 25); 

      g.setColor (Color.orange); 
      g.fillRect (10, 575, 80, 25); 
      g.fillRect (160, 575, 80, 25); 
      g.fillRect (310, 575, 80, 25); 
      g.fillRect (460, 575, 80, 25); 
      g.fillRect (610, 575, 80, 25); 
      g.fillRect (760, 575, 80, 25); 
      g.fillRect (910, 575, 80, 25); 

      for (int z = 0 ; z < 100000000 ; z++) 
       ; 


      //third blocks 

      g.setColor (Color.black); 
      g.fillRect (10, 575, 80, 25); 
      g.fillRect (160, 575, 80, 25); 
      g.fillRect (310, 575, 80, 25); 
      g.fillRect (460, 575, 80, 25); 
      g.fillRect (610, 575, 80, 25); 
      g.fillRect (760, 575, 80, 25); 
      g.fillRect (910, 575, 80, 25); 


      g.setColor (Color.yellow); 
      g.fillRect (-30, 575, 80, 25); 
      g.fillRect (120, 575, 80, 25); 
      g.fillRect (270, 575, 80, 25); 
      g.fillRect (420, 575, 80, 25); 
      g.fillRect (570, 575, 80, 25); 
      g.fillRect (720, 575, 80, 25); 
      g.fillRect (870, 575, 80, 25); 

      for (int t = 0 ; t < 100000000 ; t++) 
       ; 



      g.drawImage (myImage, x, y, 100, 40, this); 

     } 
    } // paint method 


    public void keyReleased (KeyEvent e) 
    { 


    } 


    public void keyPressed (KeyEvent e) 
    { 
     if (e.getKeyCode() == KeyEvent.VK_RIGHT) 
     { 
      // System.out.println ("Right Key Pressed"); 
      x += 10; 
     } 

     if (e.getKeyCode() == KeyEvent.VK_LEFT) 
     { 
      // System.out.println ("Left Key Pressed"); 
      x -= 10; 
     } 

     if (e.getKeyCode() == KeyEvent.VK_UP) 
     { 
     y -= 10; 
     } 

     if (e.getKeyCode() == KeyEvent.VK_DOWN) 
     { 
     y+=10; 
     } 
     repaint(); 
    } 



    public void keyTyped (KeyEvent e) 
    { 

    } 
} // CPT class 

Répondre

1

Cette while loop gèle l'ensemble de votre application. Il continuera à dessiner des trucs sur les graphiques, mais ne permettra pas le thread de distribution d'événement Swing pour être en mesure d'actualiser l'écran avec vos graphiques.

Quelques suggestions:

1) Déplacer la boucle à l'extérieur de paint procédé et à un fil séparé. Mieux encore lu sur la façon de faire une animation appropriée dans Java Swing.

2) Lisez comment remplacer correctement la méthode du composant Swing paint.

3) Renseignez-vous sur ce qu'est Event Dispatch Thread et pourquoi vous devez éviter de le bloquer.