Java Tank 游戏主窗口代码解析:MyFrame 类
该代码是一个 Tank 游戏的主窗口类,继承自 JFrame 类,其中包含了一个 MyPanel 类的实例化对象 myPanel。在构造方法中,首先通过调用 modelChoose() 方法选择游戏的模式,如果返回值为 -1,则直接退出程序。然后创建一个新的线程并启动 myPanel 对象,设置窗口的大小和添加 myPanel 对象到窗口中,并将 myPanel 对象设置为键盘监听器。最后,通过 addWindowListener() 方法添加了一个监听窗口关闭事件的 WindowAdapter 对象,当窗口关闭时,将所有敌方坦克的子弹清空,并将游戏记录对象 Recorder 写入文件中。
public MyFrame() throws Exception {
int i = modelChoose();
if (i == -1) {
System.exit(0); // 程序退出
}
myPanel = new MyPanel(i);
new Thread(myPanel).start();
this.setSize(1300, 820);
this.add(myPanel);
this.addKeyListener(myPanel);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
// 监听关闭窗口事件
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
try {
Vector<EnemyTank> tanks = myPanel.getEnemyTanks();
for (int i = 0; i < tanks.size(); i++) {
tanks.get(i).getShots().clear();
}
// 对象输出流
oos = new ObjectOutputStream(new FileOutputStream(new File(MyFrame.class.getResource("../recorder1.txt").toURI())));
// 将记录对象 Recorder 写到文件
oos.writeObject(myPanel.getRecorder());
} catch (Exception e1) {
e1.printStackTrace();
} finally {
if (oos != null) {
try {
oos.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
}
}
});
}
代码解析:
- 选择游戏模式:
modelChoose()方法用于选择游戏模式,返回值为 -1 表示程序退出。 - 创建游戏面板:
myPanel = new MyPanel(i);创建了一个 MyPanel 对象,并传入选择的模式参数。 - 启动游戏线程:
new Thread(myPanel).start();创建一个新的线程并启动 myPanel 对象,使其能够独立运行游戏逻辑。 - 设置窗口大小:
this.setSize(1300, 820);设置窗口的大小为 1300x820 像素。 - 添加游戏面板:
this.add(myPanel);将 myPanel 对象添加到窗口中,使其在窗口中显示。 - 设置键盘监听器:
this.addKeyListener(myPanel);将 myPanel 对象设置为窗口的键盘监听器,以便接收用户按键操作。 - 设置默认关闭操作:
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);设置窗口默认关闭操作为退出程序。 - 显示窗口:
this.setVisible(true);设置窗口可见。 - 监听窗口关闭事件:
addWindowListener()方法添加了一个 WindowAdapter 对象,用于监听窗口关闭事件。当窗口关闭时,该事件会触发windowClosing()方法,执行以下操作:- 清空所有敌方坦克的子弹:
tanks.get(i).getShots().clear(); - 将游戏记录对象 Recorder 写入文件:
oos.writeObject(myPanel.getRecorder());
- 清空所有敌方坦克的子弹:
注意:
- 该代码中使用了 ObjectOutputStream 将游戏记录对象 Recorder 写入文件,需要确保文件路径正确。
- 该代码中使用了 Vector 来存储敌方坦克对象,可以使用其他集合类代替。
- 该代码仅仅是 Tank 游戏主窗口类的基本框架,需要根据具体的游戏逻辑进行扩展。
原文地址: https://www.cveoy.top/t/topic/oZQn 著作权归作者所有。请勿转载和采集!