2016-08-01 64 views
-1

我试图用java创建一个游戏。 首先,我制作了Jpanel并制作了FPS计数器,背景是白色的。 之后,我尝试过,当你按下ESCAPE时,Jpanel关闭,然后我尝试在按空格时使背景移动到绿色,但在此之后,当Im尝试启动时,Jpanel移动到灰色背景和FPS计数器已经消失。Jpanel的背景是灰色的

这是框架类

public class Frame extends JFrame{ 

public static void main(String[] args) { 
    new Frame(); 
} 


public Frame(){ 
    new JFrame(); 


    this.setTitle("Tower Defence - By Sahar Haine"); 
    this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    this.setExtendedState(MAXIMIZED_BOTH); 
    this.setUndecorated(true); 
    this.setResizable(false); 
    this.setVisible(true); 


    Screen screen = new Screen(this); 
    this.add(screen); 
} 

这是屏幕类:

public class Screen extends JPanel implements Runnable{ 


Thread thread = new Thread(this); 
Frame frame; 

private int fps = 0; 

public int scene; 

public Boolean running = false; 

public Screen(Frame frame){ 
    this.frame = frame; 


    this.frame.addKeyListener(new KeyHandller(this)); 

    thread.start(); 

} 

@Override 
public void paintComponent(Graphics g){ 
    g.clearRect(0, 0, this.frame.getWidth(), this.frame.getHeight()); 

    g.drawString(fps + "", 10, 10); 


    if(scene == 0){ 
     g.setColor(Color.BLUE); 

    }else{ 

    } 
    g.setColor(Color.GREEN); 

    g.fillRect(0, 0, this.frame.getWidth(), this.frame.getHeight()); 
} 



public void run() { 
    System.out.println("Success"); 

    long lastFrame = System.currentTimeMillis(); 
    int frames = 0; 

    running = true; 
    scene = 0; 

    while(running){ 
     try { 
      repaint(); 

      frames++; 

      if(System.currentTimeMillis() - 1000>= lastFrame){ 
       fps = frames; 
       frames = 0; 
       lastFrame = System.currentTimeMillis(); 
      } 


      Thread.sleep(1); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(Screen.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
    System.exit(0); 
} 




public class KeyTyped{ 
    public void keyESC(){ 
     running = false; 

} 

    public void keySPACE() { 
     scene = 1; 
    } 

,这是关键的处理程序类:

public class KeyHandler implements KeyListener{ 

private Screen screen; 
private Screen.KeyTyped keyTyped; 


public KeyHandler(Screen screen){ 
    this.screen = screen; 
    this.keyTyped = this.screen.new KeyTyped(); 

} 



public void keyTyped(KeyEvent e) { 

} 


public void keyPressed(KeyEvent e) { 
    int keyCode = e.getKeyCode(); 

    System.out.println(e.getKeyCode()); 

    if(keyCode == 27){ 
     this.keyTyped.keyESC(); 

    } 

    if(keyCode == 27){ 
     this.keyTyped.keySPACE(); 

    } 
} 


public void keyReleased(KeyEvent e) { 

} 

回答

0

一个问题是立即跳出是你有逃脱和空间这是不正确的硬编码“keyCode = 27”。 “27-逃脱”和“32-空间”。而不是硬编码值,请使用KeyEvent.VK_ESCAPE和KeyEvent.VK_SPACE作为记录在这里,KeyEvents

编辑1

而且要确定你绘制后的字符串“填充”,否则“填充“将会覆盖FPS字符串,您将无法看到它。

+0

LoL我修复它,但它仍然在灰色背景和FPS计数器不出现 – N0d

+0

添加编辑1清晰地说明为什么FPS被覆盖。 –