2013-04-18 15 views
2

因此,我正在为一个学校项目与我的两个朋友再次做一个小游戏。 我们有和以前一样的想法,但现在它的所有图形(JPanel,JLabel等等)。我们有基本的图形用户界面,但其运行速度非常慢。 当我按下箭头键时,它会在1-2秒内响应,如果我连续击中了快速键,则可能需要15秒以上。 下面的代码:图形用户界面运行真的很慢JAVA

主要

package game; 

import java.awt.GridLayout; 
import java.io.IOException; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Gui extends JFrame{ 
private static final long serialVersionUID = 1L; 
int n = 0; 
int m = 0; 
static MapMake mapMake = new MapMake(); 
static MapRefresh mapRefresh = new MapRefresh(); 
static JPanel panel = new JPanel(); 
static Fighting fighting = null; 

public static void main(String[] args) throws IOException { 
    Gui frame = new Gui(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setTitle("Dungeons and Dragons(and some food)"); 
    frame.setSize(1280, 720); 

    mapMake.setDiscovered(0, 0, 1); 
    panel.setLayout(new GridLayout(10, 10, 2, 2)); 
    mapRefresh.MapRefresh(); 
    frame.add(panel); 
    frame.addKeyListener(new Listener()); 
    frame.setVisible(true); 
} 
} 

MapMake

package game; 

public class MapMake{ 
static int[][] discovered = new int[10][10]; 
static int[][] content = new int[10][10]; 
static int heroX = 0; 
static int heroY = 0; 
public void MapMake(){ 
    discovered[0][0] = 1; 
    for (int row = 0; row < 10; row++) { 
     for (int col = 0; col < 10; col++) { 
      discovered[row][col] = 0; 
     } 
    } 
    discovered[0][0] = 1; 
    int dragon1 = 3; 
    int dragon2 = 5; 
    int dragon3 = 7; 
    int dragon4 = 9; 
    int dragon5 = 1; 
    int food = 25; // id 6 

    while (dragon1 != 0) { 
     for (int i = 0; i < 3; i++) { 
      for (int j = 0; j < 3; j++) { 
       int x = (int) (Math.random() * 2); 
       if (x != 1 && dragon1 != 0 && content[i][j] == 0 
         && (i > 0 && i < 3 || j > 0 && j < 3)) { 
        dragon1--; 
        content[i][j] = 1; 
       } 
      } 
     } 
    } 
    while (dragon2 != 0 && food != 0) { 
     for (int i = 0; i < 5; i++) { 
      for (int j = 0; j < 5; j++) { 
       int x = (int) (Math.random() * 2); 
       if (x != 1 && dragon2 != 0 && content[i][j] == 0 
         && (i > 2 && i < 5 || j > 3 && j < 5)) { 
        dragon2--; 
        content[i][j] = 2; 
       } 
      } 
     } 
    } 
    while (dragon3 != 0) { 
     for (int i = 0; i < 7; i++) { 
      for (int j = 0; j < 7; j++) { 
       int x = (int) (Math.random() * 2); 
       if (x != 1 && dragon3 != 0 && content[i][j] == 0 
         && (i > 4 && i < 7 || j > 4 && j < 7)) { 
        dragon3--; 
        content[i][j] = 3; 
       } 
      } 
     } 
    } 
    while (dragon4 != 0) { 
     for (int i = 0; i < 9; i++) { 
      for (int j = 0; j < 9; j++) { 
       int x = (int) (Math.random() * 2); 
       if (x != 1 && dragon4 != 0 && content[i][j] == 0 
         && (i > 6 && i < 9 || j > 6 && j < 9)) { 
        dragon4--; 
        content[i][j] = 4; 
       } 
      } 
     } 
    } 
    while (dragon5 != 0) { 
     for (int i = 0; i < 10; i++) { 
      for (int j = 0; j < 10; j++) { 
       int x = (int) (Math.random() * 2); 
       if (x != 1 && dragon5 != 0 && content[i][j] == 0 
         && (i > 8 && i < 10 || j > 8 && j < 10)) { 
        dragon5--; 
        content[i][j] = 5; 
       } 
      } 
     } 
    } 
    while (food != 0) { 
     for (int i = 0; i < 10; i++) { 
      for (int j = 0; j < 10; j++) { 
       int x = (int) (Math.random() * 2); 
       if (x != 1 && food != 0 && content[i][j] == 0) { 
        food--; 
        content[i][j] = 6; 
       } 
      } 
     } 
    } 
    discovered[0][0] = 1; 
} 
public int getDiscovered(int i, int j) { 
    return discovered[i][j]; 
} 
public int getContent(int i, int j) { 
    return content[i][j]; 
} 
public int getHeroX() { 
    return heroX; 
} 
public int getHeroY() { 
    return heroY; 
} 
public void setDiscovered(int i, int j, int k) { 
    MapMake.discovered[i][j] = k; 
} 
public void setContent(int i, int j, int k) { 
    MapMake.content[i][j] = k; 
} 
public void setHeroX(int heroX) { 
    this.heroX = heroX; 
} 
public void setHeroY(int heroY) { 
    this.heroY = heroY; 
} 
} 

MapRefresh

package game; 

import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class MapRefresh extends Gui{ 
static MapMake mapMake = Gui.mapMake; 

@SuppressWarnings("unused") 
public void MapRefresh() { 
    BufferedImage hall = null; 
    BufferedImage valge = null; 
    JPanel panel = Gui.panel; 
    for (int i = 0; i < 10; i++) { 
     for (int j = 0; j < 10; j++) { 
      //    panel.add(new JButton("" + content[i][j])); 
      if (mapMake.getDiscovered(i, j) == 1) { 
       panel.add(new JLabel("hero on siin peal")); 
      } else if (mapMake.getDiscovered(i, j) == 0) { 
       try { 
        panel.add(new JLabel(new ImageIcon(hall = ImageIO.read(new File("C:/hall.jpg"))))); 
       } catch (IOException e) { 
       } catch (NullPointerException e){ 

       } 
      } else { 
       try { 
        panel.add(new JLabel(new ImageIcon(valge = ImageIO.read(new File("C:/valge.jpg"))))); 
       } catch (IOException e) { 
       } catch (NullPointerException e){ 

       } 
      } 
     } 
    } 
} 
} 

和监听

package game; 

import java.awt.event.*; 

import javax.swing.JPanel; 

public class Listener extends Gui implements KeyListener{ 
static MapRefresh mapRefresh = new MapRefresh(); 
static MapMake mapMake = Gui.mapMake; 
static JPanel panel = Gui.panel; 
static Fighting fighting = null; 
@Override 
public void keyPressed(KeyEvent e) { 
} 

@Override 
public void keyReleased(KeyEvent e) { 
    int x = mapMake.getHeroX(); 
    int y = mapMake.getHeroY(); 
    if (e.getKeyCode() == 37 && y > 0){ 
     mapMake.setDiscovered(x, y-1, 1); 
     mapMake.setDiscovered(x, y, 2); 
     mapMake.setHeroY(y - 1); 
    } else if(e.getKeyCode() == 38 && x > 0){ 
     mapMake.setDiscovered(x-1, y, 1); 
     mapMake.setDiscovered(x, y, 2); 
     mapMake.setHeroX(x - 1); 
    } else if (e.getKeyCode() == 39 && y < 9){ 
     mapMake.setDiscovered(x, y+1, 1); 
     mapMake.setDiscovered(x, y, 2); 
     mapMake.setHeroY(y + 1); 
    } else if (e.getKeyCode() == 40 && x < 9){ 
     mapMake.setDiscovered(x+1, y, 1); 
     mapMake.setDiscovered(x, y, 2); 
     mapMake.setHeroX(x + 1); 
    } 
    int z = mapMake.getContent(x, y); 
    panel.removeAll(); 
    System.out.println(e.getKeyCode()); 
    mapRefresh.MapRefresh(); 
    panel.validate(); 
    panel.repaint(); 

} 

@Override 
public void keyTyped(KeyEvent e) {  
} 

} 

我读到“Try Catch”正在放慢速度。是吗?如果是这样,我该如何让它变得更好?或者这就像完整的垃圾?

请记住,这是我们的第一个学期! 继承人也是它http://pastebin.com/VM1cTvyX

+0

我在那里有2个图像(“大厅”和“门面”)。如果你想尝试这些代码,只需删除它们。 – Hans

回答

2

MapRefresh()方法每次更新都会加载这些图像很多次。这将是有益的MapRefresh构造中,只有一次存储图像,像这样:增加了面板时

private ImageIcon imageIcon; 

public class MapRefresh extends Gui{ 
static MapMake mapMake = Gui.mapMake; 

imageIcon = new ImageIcon(hall = ImageIO.read(new File("C:/hall.jpg"))); 

//... 
} 

然后只需使用:

panel.add(new JLabel(imageIcon)); 

你会重复这一过程,你的其他映像。这应该允许你消除'try/catch'块,并且该方法可以大大提高速度。

+0

感谢关于如何制作ImageIcon的指南! – Hans

4

在你MapRefresh类引擎收录的副本,每一个方法MapRefresh被调用的时候,你是加载图像高达100倍 - 2个嵌套循环在每10次迭代。这听起来像是你的迟缓的根源。我只会在构造函数中加载这两个图像,并在需要时再引用它们。

+0

感谢您的回复! 确实是这个问题。 – Hans

2

在我看来,问题来自于每次按下按键时都会加载图像。它会在硬盘上进行一些非常缓慢的读取操作。

在游戏开始时加载资源并稍后使用它们。

对于try/catch块,当到达catch块时会很慢,这会强制JVM构建堆栈跟踪。在这里,你似乎永远不会到达catch块。