老师我这个代码写的不知道是哪里的问题,一启动飞机就自动向右飞,键盘的上下左右按着没有问题!
package com.kxnav.Lesson07.planeWar06;
import com.kxnav.Lesson07.planeWar03.GameUtil;
import com.kxnav.Lesson07.planeWar05.Constant;
import com.kxnav.Lesson07.planeWar05.Plane;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* 0.3版本
* 增加双缓冲,解决屏幕闪烁的问题
*/
public class MyGameFrame06 extends Frame {
Image planeImg = GameUtil.getImage("\\com\\kxnav\\Lesson07\\planeWar03\\image\\plane.png");
Image bg = GameUtil.getImage("\\com\\kxnav\\Lesson07\\planeWar03\\image\\bg.jpg");
// GameObject plane2 = new GameObject(planeImg,100,100,3,22,33);
// GameObject plane3 = new GameObject(planeImg,200,200,3,22,33);
Plane p1 = new com.kxnav.Lesson07.planeWar05.Plane(planeImg,100,100,7);
boolean left,right,up,down;
@Override
public void paint(Graphics g) { //这个g 相当于一个画笔
g.drawImage(bg,0,0,800,600,null);
// plane2.drawMyself(g);
// plane3.drawMyself(g);
p1.drawMyself(g);
if(left){
p1.x -= p1.speed;
}
if(right){
p1.x += p1.speed;
}
if(up){
p1.y -= p1.speed;
}
if(down){
p1.y += p1.speed;
}
}
//初始化窗口
public void launchFrame(){
this.setTitle("飞机大战");
setVisible(true); //设置窗口可见
setSize(com.kxnav.Lesson07.planeWar05.Constant.GAME_WIDTH, Constant.GAME_HEIGHT); //设置窗口的大小
setLocation(100,100); //窗口打开的位置
//增加关闭窗口的动作
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0); //参数为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 1s画20次(20*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;
}
if(e.getKeyCode()==KeyEvent.VK_RIGHT){
right=true;
}
if(e.getKeyCode()==KeyEvent.VK_UP){
up=true;
}
if(e.getKeyCode()==KeyEvent.VK_DOWN){
down=true;
}
}
@Override
public void keyReleased(KeyEvent e) { //键盘抬起
System.out.println("抬起"+e.getKeyCode());
if(e.getKeyCode()==KeyEvent.VK_LEFT){
left=false;
}
if(e.getKeyCode()==KeyEvent.VK_RIGHT){
right=false;
}
if(e.getKeyCode()==KeyEvent.VK_UP){
up=false;
}
if(e.getKeyCode()==KeyEvent.VK_DOWN){
down=false;
}
}
}
//解决双缓冲屏幕闪烁问题
// private Image offScreenImage=null;
// public void update(Graphics g){
// if(offScreenImage == null){
// 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) {
MyGameFrame06 gameFrame = new MyGameFrame06();
gameFrame.launchFrame();
}
}