weixin_45751111 2019-12-09 10:07 采纳率: 0%
浏览 549

JAVA飞机大战小游戏求解答

JAVA小白的大作业写了个飞机大战小游戏,现在想加一个按下键盘上某个键可以重新开始游戏的功能,求大佬解答。
下面是我游戏窗口实现的代码。
package Game;

import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Date;

//建立游戏的主窗口

public class GameFrame extends Frame{ //GameFrame继承了Frame
private volatile boolean flag = true; //volatile指线程之间可以共享变量
Image plane = GameUtil.getImage("image/plane.png");
Image bg = GameUtil.getImage("image/bg1.jpg");

Plane p = new Plane(plane,350,400,60,60);
Shell[] shells = new Shell[30];  //30为炮弹个数  

Date startTime = new Date();
Date endTime;
int period;

public void paint(Graphics g) {    //变量g相当于一支画笔
    super.paint(g);   //调用父类的paint
    g.drawImage(bg, 0, 0, 700, 500, null);
    p.drawSelf(g);     //画飞机

    //碰撞检测
    for(int i = 0; i < shells.length; i++) {
        shells[i].draw(g); 
        boolean peng = shells[i].getRect().intersects(p.getRect());
        if(peng) {
            p.live = false;
            Color c = g.getColor();
            g.setColor(Color.RED);
            Font f = new Font("黑体",Font.PLAIN,30);
            g.setFont(f);
            g.drawString("GAME OVER!",320,250);
            g.setColor(c);
            endTime = new Date();
            period =(int)((endTime.getTime()-startTime.getTime())/1000);
            flag = false;
        }
        if(!p.live) {
        Color a = g.getColor();
        g.setColor(Color.WHITE);
        Font f1 = new Font("黑体",Font.PLAIN,15);
        g.setFont(f1);
        g.drawString("持续时间:"+ period + "秒",(int)p.x, (int)p.y);
        g.setColor(a);
        }
    }
}
//反复重画窗口  线程
class PaintThread extends Thread{  //内部类
    public void run() {
        while(flag) {
            repaint();  //重画
            try {
                Thread.sleep(50);  //50ms
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

//定义键盘监听的内部类
class KeyMonitor extends KeyAdapter {

    @Override
    public void keyPressed(KeyEvent e) {
        super.keyPressed(e);
        p.addDirection(e);
    }

    @Override
    public void keyReleased(KeyEvent e) {
        super.keyReleased(e);
        p.minusDirection(e);
    }

}

public void launchFrame(){          //初始化窗口
    this.setTitle("飞机大作战");   //窗口的标题
    this.setVisible(true);     // 窗口默认不可见,此步是让其可见。
    this.setSize(Constant.GAME_WIDTH,Constant.GAME_HEIGHT);  //设置窗口大小
    this.setLocation(300,100);   //设置窗口位置
    this.addWindowListener(new WindowAdapter() {  //匿名内部类,让关闭窗口时程序也关闭

        public void windowClosing(WindowEvent e) {
            System.exit(0);         // 0表示正常结束
        }
    });
new PaintThread().start();    //启动重画窗口的线程
addKeyListener(new KeyMonitor());  //给窗口增加键盘的监听


//初始化炮弹
for(int i = 0; i < shells.length; i++) {
    shells[i] = new Shell();
    }

}

//添加双缓冲技术,让游戏窗口不闪
private Image offScreenImage = null;
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) {
    GameFrame f = new GameFrame();   //创建窗口对象
    f.launchFrame();    //调用launchFrame方法
}

}


求大佬解答。

  • 写回答

1条回答 默认 最新

  • 关注

    给你提供一点思路,供参考:
    游戏初始化时,界面上的东西实际都是一个个对象new出来的,重新开始游戏,无非就是想办法把界面上的元素关闭掉、
    或者删掉、清空等等,然后重新初始化游戏界面。
    awt的一些对象应该都有设置不显示的方法,或者你也可以试试把当前frame关掉,然后重新初始化一个界面。

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题