按键不匹配
按了下键不动(按左右键才向下移动)
按下右键向东南方(上建和右键才向右移动)其他两个键是正常的.
被注释掉的双缓冲代码效果不佳,就是不会实时更新。
public class PlanGame extends Frame {
private Image offScreenImage = null;
Image bj = GameUtil.getImage("/images/bj.jpg");
Image planeImage = GameUtil.getImage("/images/plane.png");
//static int count = 0;
Plane p1 = new Plane(planeImage,100,100,7);
boolean right,left,up,down;
@Override
public void paint(Graphics g){ // g是一只画笔 系统会自动调用paint
g.drawImage(bj,0,0,Constant.GAME_WIDTH,Constant.GAME_HEIGHT,null);
p1.drawMyself(g);
if (left){ p1.x -= p1.speed; }
if (right){ p1.x += p1.speed; }
if (up){ p1.y -= p1.speed; }
if (right){ p1.y += p1.speed; }
}
//初始化窗口
public void lunchFrame() {
this.setTitle("飞机大战");
setVisible(true);//设置窗口可视化
setLocation(400, 100);//设置窗口位置
setSize(Constant.GAME_WIDTH, Constant.GAME_HEIGHT);//设置窗口大小
//设置窗口关闭的动作
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
//启动重画窗口的线程
new PaintThread().start();
//启动键盘监听
this.addKeyListener(new KeyMonitor());
}
/**
* 定义了一个重画窗口的线程类
* 定义成内部类是为了方便直接使用外部窗口类的相关方法
*/
class PaintThread extends Thread {
@Override
public void run() {
while (true) {
repaint(); //内部类可以直接调用外部类的成员
try {
Thread.sleep(50); //1s = 1000ms; 一秒画20次 (20*50 = 1000);
} 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_RIGHT){
right = true;
}
*/
switch (e.getKeyCode()){
case 65:
left = true;
break;
case 68:
right = true;
break;
case 87:
up = true;
break;
case 83:
down = true;
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("抬起:"+ e.getKeyCode());
switch (e.getKeyCode()){
case 65:
left = false;
break;
case 68:
right = false;
break;
case 87:
up = false;
break;
case 83:
down = false;
break;
}
}
}
/**
* 双缓冲:即在内存中创建一个与屏幕绘画区域一致的对象,
* 现将图形绘制到内存中的这个对象上,
* 再一次性将这个对象上的图形拷贝到屏幕上,
* 这样加快绘图速度,绘图更加高效。
*
* @param g
*
*/
// public void update(Graphics g){
// if (offScreenImage == null){
// offScreenImage = this.createImage(Constant.GAME_WIDTH,Constant.GAME_HEIGHT);//这是游戏窗口的宽度和高度
//
// Graphics gOff = offScreenImage.getGraphics();
// paint(gOff);
// g.drawImage(offScreenImage,0,0,null);
// }
// }
public static void main(String[] args) {
PlanGame planGame = new PlanGame();
planGame.lunchFrame();
}
写了两个right语句