2017-10-07 4 views
-1

Je suis novice en programmation Java. Récemment, je développe un mini jeu avec JSWing. Cependant, après avoir codé pendant un certain temps, le FPS en jeu a chuté terriblement. Quand je dépisté le Gestionnaire des tâches que j'avais résultat comme ceci:Les applications Java (basées sur JSwing) sont-elles consommatrices de performance?

enter image description here

Quelqu'un peut-il me dire ce qui ne va pas? J'ai seulement utilisé des boucles, JLabel avec des icônes, des méthodes Paint Paint, mouseMotionEvent dans mon code.

Voici le code dans le jeu principal

import javax.swing.*; 
import java.awt.*; 
import java.awt.image.BufferedImage; 

import java.io.IOException; 
import javax.imageio.ImageIO; 

public class Game extends JPanel { 


    int numb = 2; 
    int pts = 5; 

    Kitty[] Kitties = new Kitty[4]; 

    public Game() { 




     for (int i = 0; i < Kitties.length; i++) 
      Kitties[i] = new Kitty(); 
    } 

    @Override 
    public void paint(Graphics graphics) { 
     BufferedImage img = null; 

     try { 
     img = ImageIO.read(getClass().getResourceAsStream("city.jpg")); 

     } catch (IOException e) { 
      System.out.println("java io"); 
     } 


     graphics.drawImage(img, 0, 0, null); 


     //paints square objects to the screen 
     for (int i = 0; i < numb;i++) { 
      Kitties[i].paint(graphics); 
     } 
    } 

    public void update(TheJPanel frame) { 

     if (frame.a >= 0 && frame.a < 500) numb = 2; 
     if (frame.a>= 500) numb = 3; 

     for (int i = 0; i< numb; i++) { 

       int disty = 500 - Kitties[i].squareYLocation; 
       int distx = Kitties[i].squareXLocation - frame.x; 
       if (Kitties[i].squareYLocation < 600 && disty <= 5 && disty >= -80 && distx < 260 && distx > -100){ 
        frame.a +=pts; 
        if (Kitties[i].kittype == 6) frame.a += pts; 
        if (frame.a >= 500) { 
         Kitties[i].fallSpeed = Kitties[i].FallSpeedlvl2(); 
          pts = 10; 
        } 
        Kitties[i].squareYLocation = -200; 
        Kitties[i].generateKittype(); 
        Kitties[i].generateRandomXLocation(); 
        Kitties[i].generateRandomFallSpeed(); 



        frame.point.setText("Point:" + String.valueOf(frame.a)); 
        frame.lives.setText("Lives:" + String.valueOf(frame.count)); 
       } 


     if(Kitties[i].squareYLocation > 610){ 
      frame.count--; 

      Kitties[i].generateKittype(); 
      Kitties[i].generateRandomXLocation(); 
      Kitties[i].generateRandomFallSpeed(); 
      Kitties[i].squareYLocation = -200; 

     } 
     if (Kitties[i].squareYLocation >=605) frame.catFall(Kitties[i].squareXLocation); 


     if(Kitties[i].squareYLocation <= 610){ 

      Kitties[i].squareYLocation += Kitties[i].fallSpeed; 
     } 


     } 


    } 



    public static void main(String[] args) throws InterruptedException { 

     Game game = new Game(); 
     TheJPanel frame = new TheJPanel(); 


     frame.add(game); 


     frame.setVisible(true); 
     frame.setSize(1000, 1000); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.setTitle("Saving kitties"); 
     frame.setResizable(false); 
     frame.setLocationRelativeTo(null); 


     while (frame.count>0) { 
      game.update(frame); 

      game.repaint(); 

      Thread.sleep(4); 


     } 

     if (frame.count == 0) { 
      JOptionPane.showMessageDialog(null, "You lost!", "Game over!", JOptionPane.ERROR_MESSAGE); 
      game.setVisible(false); 
      frame.getContentPane().removeAll(); 
      frame.getContentPane().repaint(); 
      frame.bask.setVisible(false); 
      frame.background.setVisible(false); 
     } 



    } 
} 

Voici le code pour le principal Jframe

package game; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionListener; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.Icon; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

/** 
* 
* @author Imba Store 
*/ 
public class TheJPanel extends JFrame implements MouseMotionListener { 

    protected int x; 
    protected int a = 0; 
    protected int count = 20; 
    protected JLabel bask = new JLabel(); 
    protected JLabel background = new JLabel(); 
    protected JLabel point = new JLabel(); 
    protected JLabel lives = new JLabel(); 
    Timer fall; 
    protected int time =0; 

    public TheJPanel() { 
     this.addMouseMotionListener(this); 
     InitContent(); 



    } 



    protected void InitContent() { 
     Icon img = new ImageIcon(getClass().getResource("basket.png")); 
     bask.setIcon(img); 
     Icon themes = new ImageIcon(getClass().getResource("city2.png")); 
     background.setIcon(themes); 
     background.setBounds(0, 699, 1000, 300); 
     point.setFont(new java.awt.Font("Trebuchet MS", 1, 35)); 
     point.setText("Point:" + String.valueOf(a)); 
     point.setBounds(20,908,240,50); 
     point.setForeground(Color.white); 
     lives.setBounds(800, 908,200,50); 
     lives.setFont(new java.awt.Font("Trebuchet MS", 1, 35)); 
     lives.setForeground(Color.white); 
     lives.setText("Point:" + String.valueOf(count)); 
     point.setOpaque(false); 
     add(point); 
     add(lives); 
     add(bask); 
     add(background); 
     bask.setSize(400,148);  
    } 

    @Override 
    public void mouseMoved (MouseEvent me) 
    { 
     x = me.getX(); 




     background.setBounds(0, 699, 1000, 300); 
     bask.setBounds(x, 700, 400, 148); 
    } 

    @Override 
    public void mouseDragged (MouseEvent me) 
    { 

    } 

     public void catFall(int getX){ 
     Icon fell = new ImageIcon(getClass().getResource("kitty-fall.png")); 
     JLabel fellcat = new JLabel(); 
     fellcat.setIcon(fell); 
     fellcat.setBounds(getX, 760, 220, 220); 

     add(fellcat); 


     add(background); 
      fall = new Timer(1500, new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent ae) { 
       getContentPane().remove(fellcat); 



      } 
      }); 
     fall.setRepeats(false); 
     fall.start();  
    } 

} 

Et ceci est la classe pour les chats qui tombent

package game; 

/** 
* 
* @author Imba Store 
*/ 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.Random; 
import javax.imageio.ImageIO; 

public final class Kitty extends JLabel { 

    protected int squareXLocation; 
    protected int squareYLocation = -200; 
    protected int fallSpeed = 1; 
    protected int kittype; 
    Random rand = new Random(); 


    public int generateRandomXLocation(){ 
     return squareXLocation = rand.nextInt(800); 
    } 



    public int generateRandomFallSpeed(){ 
     return fallSpeed = rand.ints(3, 4).findFirst().getAsInt(); 
    } 

    public int FallSpeedlvl2() { 
     return fallSpeed = rand.ints(3,7).findFirst().getAsInt(); 
    } 

    public int generateKittype() { 
     return kittype = rand.ints(1,8).findFirst().getAsInt(); 
    } 

    @Override 
    public void paint(Graphics g) { 
     BufferedImage img = null; 
     BufferedImage thugcat = null; 
     try { 
     img = ImageIO.read(getClass().getResourceAsStream("kitty.png")); 
     thugcat = ImageIO.read(getClass().getResourceAsStream("thug-kitty.png")); 
     } catch (IOException e) { 
      System.out.println("Java IO"); 
     } 
     if (kittype == 6) { 
      g.drawImage(thugcat, squareXLocation, squareYLocation, null); 
     } 
     else g.drawImage(img, squareXLocation,squareYLocation,null); 

    } 


    public Kitty(){ 
     generateRandomXLocation(); 
     generateRandomFallSpeed(); 
     generateKittype(); 
    } 
+0

Je veux voir votre code. – mumpitz

+0

J'ai mis à jour le code en tant que votre demande s'il vous plaît aider –

+0

Avez-vous essayé d'utiliser un profileur? – pvg

Répondre

1
public void paint(Graphics graphics) { 
    BufferedImage img = null; 

    try { 
    img = ImageIO.read(getClass().getResourceAsStream("city.jpg")); 

La peinture personnalisée est effectuée par paintComponent (...) ne peint pas(). La première déclaration devrait alors être super.paintComponent().

Une méthode de peinture est pour la peinture seulement. Ne faites pas d'E/S dans la méthode de peinture. Cela entraînera la lecture de l'image chaque fois que vous repeignez le panneau.

Thread.sleep(4); 

Dormir pendant 4 ms n'est pas suffisant. Cela tentera de repeindre 250 fois par seconde ce qui est trop souvent. Il n'est pas nécessaire que le débit d'images soit aussi rapide.

Kitty[] Kitties = new Kitty[4]; 

Les noms de variables ne doivent pas commencer par un caractère majuscule. La plupart de vos noms sont corrects. Être cohérent!

point.setBounds(20,908,240,50); 

N'utilisez pas setBounds(). Swing a été conçu pour être utilisé avec les gestionnaires de disposition. Définissez un gestionnaire de disposition pour votre arrière-plan, puis ajoutez les composants. Les méthodes NE DOIVENT PAS commencer par un caractère majuscule. Encore, la plupart sont corrects. Être cohérent!!!

+0

Merci l'homme, I/O dans les méthodes de peinture a été une erreur cruciale, mon programme est beaucoup mieux maintenant. –