2012-12-06 54 views
3

我是Ap计算机科学的学生,课程的项目是创建您选择的游戏。我正在创建一个pacman游戏。我们没有太多的工作与GUI所以我还是很新的整个概念,但是这是我到目前为止有:添加pacman图像

import java.awt.*; 
import java.awt.event.KeyEvent; 
import java.awt.image.*; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.*; 


public class GameHandler extends JFrame{ 


JPanel jpanel = new JPanel(); 
Graphics g; 
BufferedImage pacman; 
int frame; 
int direction; 
int x, y; 
//final int STEP = 2; If you want to change the speed at which pacman moves accross the screen; 

public void popupWindow() { 
    setSize(400, 400); 
    setResizable(false); 
    setVisible(true); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame = 0; 
    direction = KeyEvent.VK_LEFT; 
    x = 300; 
    y = 300; 

    try { 
     pacman = ImageIO.read(new File("pacman.png")); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 


    } 
      image(); 
} 

public void keyPressed(KeyEvent e) { 
    direction = e.getKeyCode(); 
} 


public void update() { 
    frame++; 
    if (frame > 2) { 
     frame = 0; 
    } 

    switch(direction) { 
     case KeyEvent.VK_LEFT: 
      x--; 
      break; 
     case KeyEvent.VK_RIGHT: 
      x++; 
      break; 
     case KeyEvent.VK_UP: 
      y--; 
      break; 
     case KeyEvent.VK_DOWN: 
      y++; 
      break; 
    } 
} 

public void image() { 
    super.paintComponents(g); 
    g.drawImage(pacman.getSubimage(frame*10, 0, 37, 30), x, y, null); 
} 
} 

我的问题是,我不能够输出在该图像上的屏幕(我知道我的g.drawImage dimensiones是一个断由于我不能没有任何产出调整它)

当我尝试在popupWindow()方法调用的方法image()我得到这个错误:

Exception in thread "main" java.lang.NullPointerException 
at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:70) 
at java.awt.Container.paintComponents(Container.java:1890) 
at GameHandler.image(GameHandler.java:69) 
at GameHandler.popupWindow(GameHandler.java:38) 
at Main.main(Main.java:7) 

我试着在不同的地方调用图像方法并在try/catch中也是如此。我搞不清楚了。

+0

嗨@user,欢迎来到SO。只是供参考,一般情况下,如果您发现答案有帮助,或解决了您的问题,社区会赞赏upvotes和/或标记“接受”(如果这是您的问题)。请享用! – Ben

回答

3
public void image() { 
    super.paintComponents(g); 
    g.drawImage(pacman.getSubimage(frame*10, 0, 37, 30), x, y, null); 
} 

g尚未设置用于此方法。你的班级定义了Graphics g;,但它并未设置在任何地方!所以,你问,我该如何设置它? Graphics对象来自哪里?


最快的方式答复您当前的代码库可以是:

JPanel jpanel = new JPanel(); 
Graphics g = jpanel.getGraphics(); 

,但是这不是一个理想的解决方案在所有。


通常这种代码模式在paintComponent找到。

什么,你应该瞄准的是这样的:

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.drawImage(...); 
} 

您可以在任何JComponent覆盖paintComponent,像一个JPanel(这是JComponent中的一个子类)。所以,我建议你的是

  • 添加重写JPanel的
  • 使用JFrame.setContentPane()设置它作为主要的JFrame
  • 重写paintComponent在面板
  • 使用内容窗格创建新类面板以进行任何UI更改(仅JFrame上的顶级内容,内容窗格上的所有其他内容)