老师,是不是因为没有监听到左键被按下,所以
this.addKeyListener(new KeyMonitor());
这里头的KeyMonitor指向null,它就不停的报空指针异常,当按下左键之后就没有事了
package plane;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/*
*游戏主窗口
*/
public class MyGameFrame extends Frame {
Image planeImg = GameUtil.getImage("images/plane.png");
Image bg = GameUtil.getImage("images/bg.jpg");
Plane p1 = new Plane(planeImg,100,100,3);
Boolean left,right,up,down;//飞机的方向控制
private Image offScreenImage = null;
@Override
public void paint(Graphics g) { //g当作是一支画笔
g.drawImage(bg,0,0,500,500,null);
p1.drawMyself(g);
if (left){
p1.x -= p1.speed;
}
}
//初始化窗口
public void launchFrame(){
this.setTitle("飞机大战-许建辉出品");
setVisible(true); //设定窗口可见
setSize(500,500);//设置窗口大小
setLocation(400,400);//窗口打开的位置
//匿名内部类,监听窗口
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);//程序正常退出
}
});
new PaintThread().start();//启动重画窗口线程
this.addKeyListener(new KeyMonitor());
}
public static void main(String[] args) {
MyGameFrame myGameFrame = new MyGameFrame();
myGameFrame.launchFrame();
}
//双缓冲解决屏幕闪烁问题
public void update(Graphics g){
if (offScreenImage == null){
offScreenImage = this.createImage(500,500);
}
Graphics gOff = offScreenImage.getGraphics();
paint(gOff);
g.drawImage(offScreenImage,0,0,null);
}
/*
*定义一个重画窗口线程的内部类
*定义成内部类是为了方便使用外部类的相关方法
*/
class PaintThread extends Thread{
@Override
public void run() {
while(true){
repaint(); //内部类可以直接使用外部类的成员
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//内部类,用于监听键盘的操作
class KeyMonitor extends KeyAdapter{
@Override
public void keyPressed(KeyEvent e) {
System.out.println("按下:"+e.getKeyCode());
if (e.getKeyCode() == KeyEvent.VK_LEFT){
left = true;
}
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("抬起:"+e.getKeyCode());
if (e.getKeyCode() == KeyEvent.VK_LEFT){
left = false;
}
}
}
}