我是Ap Computer Science的学生,课程项目是创建一个你选择的游戏。我正在创建一个pacman游戏。我们在GUI上没有多少工作,所以我对整个概念仍然很新,但这是我到目前为止所做的:
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
是关闭的,因为我无法在没有输出的情况下调整它)
当我尝试在image()
方法中调用方法popupWindow()
时,我收到此错误:
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 :(得分: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的子类)一样。所以,我向你推荐的是
JFrame.setContentPane()
将其设置为主JFrame的内容窗格