Java实现飞机大战游戏思路

博主分享了使用Java实现飞机大战游戏的思路,包括创建游戏窗口、设置背景、选择输入方式、绘制战机和敌机、实现子弹发射、判断碰撞等关键步骤。难点在于碰撞检测。文中还提到了游戏音效的添加以及各个类的功能,如窗体类、画布背景类、属性类、工具类、战机类、子弹类、敌机类和音乐类。
摘要由CSDN通过智能技术生成

这两天跟着视频的老师做了一遍飞机大战游戏,下面分享一下自己的思路,当作让自己复习一遍了哈哈哈~
——————————————————————————————————————————————————————————

简单思路

1 先得把游戏界面的窗体实现
2 实现窗体里面背景的内容
3 选择游戏是采用鼠标监听还是键盘监听
4 把战机图片调用方法画在背景上面
5 让键盘或者鼠标监听战机的轨迹
6 将子弹始发点坐标定在战机坐标前面
7 将敌机图片也画在背景上面
8 定义方法规定敌机的飞行速度和轨迹
9 定义方法判断子弹是否击中敌机及战机是否与敌机相撞
10 定义一个敌机被子弹击中则消失的方法
11 定义一个相撞后战机的血量减少,敌机消失的方法
12 当战机血量为0时游戏结束,点击鼠标重新开始
13 定义不同型号敌机的属性
14 添加游戏音效

以上步骤最难的就是第九步,需要好好理解坐标轴中两个图片的对应关系
——————————————————————————————————————————————————————————

成品如下图

在这里插入图片描述

下面是代码的应用说明:
这是一个窗体类
定义游戏窗体的一些细节,以及在主方法中运行其他类的方法。
/*
	 * 游戏窗体类
	 */
public class GameFrame extends JFrame {
   

	public static void main(String[] args) {
   
		GameFrame frame = new GameFrame();
		frame.setVisible(true);// 显示窗体
	
		GamePanel panel =new GamePanel(frame);//方便调用键盘监听器
		panel.action();//调用启动游戏的方法
		frame.add(panel);
		frame.setVisible(true);
		//调用背景音乐类中的方法
		String filepath = "D:\\javagame\\飞机大战\\img\\game_music.wav";
		musicStuff musicObject = new musicStuff();
		musicObject.playMusic(filepath);
	}
	//构造方法设置窗体
	public GameFrame() {
   
		setTitle("全民飞机大战");// 设置标题
		setSize(512, 768);//设置窗体大小
		setLocationRelativeTo(null);// 相对于屏幕左上角居中
		setResizable(false);// 设置不允许玩家拖动界面
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭游戏时把进程也关掉
	}
}

——————————————————————————————————————————————————————————

这是一个画布背景类,我的绝大多数方法都在这个类中定义。
public class GamePanel extends JPanel {
   
	BufferedImage bg = null;

	// new战机对象
	hero hero = new hero();
	// 建立敌机集合 不使用数组做容器是因为敌机数量未知,建立数组先要定义数组长度
	List<Ep> eps = new ArrayList<Ep>();
	// 建立子弹的弹药库,与敌机集合想法一样
	List<Fire> fs = new ArrayList<Fire>();

	// 定义分数
	int socre;
	boolean gameover;// 设置开关
	int power = 1;// 火力值

	/*
	 * 开始游戏的方法 建立一个线程
	 */
	public void action() {
   
		new Thread() {
   
			public void run() {
   
				while (true) {
   
					// if语句判断是否gameover
					if (!gameover) {
   
						epEnter();// 敌机进场
						epMove();

						// 发射子弹
						shoot();

						// 子弹移动
						fireMove();
						shootEp();
						hit();
					}
					try {
   
						Thread.sleep(50);
					} catch (InterruptedException e) {
   
						// TODO 自动生成的 catch 块
						e.printStackTrace();
					}
					repaint();// 刷新界面
				}
			}

			/*
			 * 检测子弹是否打到敌机
			 */
			public void shootEp() {
   
				// 遍历所有子弹
				for (int i = 0; i < fs.size(); i++) {
   
					Fire f = fs.get(i);
					bang(f);
				}

			}

			/*
			 * 判断子弹是否击中敌机
			 */
			private void bang(Fire f) {
   
				for (int i = 0; i < eps.size(); i++) {
   
					Ep e = eps.get(i);
					if (e.shootBy(f)) {
   
						e.hp--;
						// 当敌机没hp,死亡
						if (e.hp <= 0) {
   
							if (e.type == 12) {
   
								power++;
								if (po
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值