目录
前言
这个项目是一个简单的Java游戏,主要使用Java Swing框架实现GUI界面的设计和绘制,使用了多线程和定时器来实现动画效果,使用了Java事件处理机制来响应用户的操作。通过这个项目,可以学习到Java GUI编程、多线程编程、事件处理机制等知识,以及Java绘图API的使用方法。同时,这个项目也涉及到一些基本的OOP概念,如类、对象、继承、组合等。该项目对于Java初学者来说是一个很好的练手项目,可以提高编程能力和实践能力。
代码实现
思路
具体步骤
游戏窗体,创建FlyWar类
-
首先,需要定义一个类 FlyWar,继承自 JFrame 类。
-
在 FlyWar 类中,需要定义一个 initUI 方法,用来初始化窗口。
-
在 initUI 方法中,需要设置窗口大小、标题、关闭按钮等属性,并且创建一个 Graphics 对象,以便在窗口中绘图。
package com.game; import javax.swing.*; import java.awt.*; public class FlyWar extends JFrame { public void initUI(){ //编写窗体的属性 this.setSize(1600,400); this.setTitle("线程子弹"); this.setDefaultCloseOperation(3); this.setVisible(true);
监听器类
- 创建一个 MouseLis 类,继承自 MouseAdapter 类,用来监听鼠标事件。
- 在 MouseLis 类中,需要定义一个构造方法,接受一个 Graphics 对象,用来在鼠标事件发生时绘制图形。
- 在 MouseLis 类中,需要覆盖 mousePressed 方法,创建一个 DrawThread 对象,用来启动一个新线程绘制图形。
package com.game;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class MouseLis extends MouseAdapter {
public Graphics g;
public MouseLis(Graphics g){
this.g=g;
}
public void mousePressed(MouseEvent e){
DrawThread dt=new DrawThread(e,g);
dt.start();
}
}
DrawThread类
- 创建一个 DrawThread 类,继承自 Thread 类,用来绘制图形。
- 在 DrawThread 类中,需要定义一个构造方法,接受一个 MouseEvent 对象和一个 Graphics 对象,用来确定图形的位置和绘制图形的对象。
- 在 DrawThread 类中,需要覆盖 run 方法,使用 Graphics 对象绘制图形,并且在每次绘制之前使用 Thread.sleep 方法让线程暂停一段时间,以实现动画效果。
import java.awt.*;
import java.awt.event.MouseEvent;
public class DrawThread extends Thread{
private MouseEvent e;
private Graphics g;
public DrawThread(MouseEvent e,Graphics g){
this.e=e;
this.g=g;
}
public void run(){
int x=e.getX();
int y=e.getY();
for(int i=0;i<500;i+=20){
g.setColor(Color.CYAN);
g.fillOval(x+i,y,50,60);
try{
Thread.sleep(100);
}catch(Exception ef){}
g.setColor(Color.WHITE);
g.fillRect(0,0,1000,800);
}
}
}
最后回到FlyWar类中,把监听器中的功能添加到窗体上
package com.game;
import javax.swing.*;
import java.awt.*;
public class FlyWar extends JFrame {
public void initUI(){
//编写窗体的属性
this.setSize(1600,400);
this.setTitle("飞机大战");
this.setDefaultCloseOperation(3);
this.setVisible(true);
Graphics g=this.getGraphics();
MouseLis ms=new MouseLis(g);
this.addMouseListener(ms);
}
public static void main(String[] args){
FlyWar db=new FlyWar();
db.initUI();
}
}
强调的几点
for语句中的逻辑
在 DrawThread 类的 run 方法中,使用了一个 for 循环,用来实现动画效果。该 for 循环的循环变量 i 从 0 开始,每次增加 20,直到 i 的值大于等于 500 为止。在每次循环中,使用 Graphics 对象绘制一个圆形,并且通过 Thread.sleep 方法让线程暂停一段时间,以实现动画效果。而在每次绘制圆形之前,使用 Graphics 对象绘制一个白色的矩形,以清空之前绘制的圆形,保证只有一个圆形在屏幕上显示。
这种方式实现动画效果的思路是,通过不断地绘制、清除图形,来模拟图形的运动过程,从而实现动画效果。而循环变量 i 的增量为 20,是为了控制圆形的移动速度,如果增量过小,动画效果就会非常缓慢,如果增量过大,动画效果就会非常快,不易观察。
try语句
在 DrawThread 类的 run 方法中,有一个 try-catch 语句块,用来捕获可能抛出的异常并进行处理。在 try 语句块中,使用 Thread.sleep 方法让线程暂停一段时间,以实现动画效果;而在 catch 语句块中,由于该项目只是一个简单的练习项目,所以直接忽略了所有的异常。在实际的开发中,应该根据具体情况对异常进行处理,以保证程序的健壮性和可靠性。
总结
这个小项目是一个简单的飞机大战游戏,通过绘制图形和动画来实现游戏效果。虽然这个项目比较简单,但是它涉及到了 Java 的基础知识,例如面向对象编程、图形绘制、多线程编程等。同时,这个项目也提供了一些发散思考的点,例如如何实现更流畅的动画效果、如何让飞机在屏幕上自由移动、如何让游戏更加有趣等。
同时我也提出三个值得发散思考的点,读者可以在写完这份代码的同时,想想如何更加优化这份代码。
- 如何实现更流畅的动画效果?可以考虑使用更高级别的绘图库,例如 JavaFX,或者使用专门用于游戏开发的游戏引擎,例如 Unity、Unreal Engine 等。
- 如何让飞机在屏幕上自由移动?可以使用键盘事件来控制飞机的移动方向和速度,或者使用鼠标拖拽事件来控制飞机的移动方向和位置。
- 如何让游戏更加有趣?可以增加更多的游戏元素,例如障碍物、敌人、子弹等,或者增加更多的游戏模式,例如多人游戏、关卡模式等。