`

java模拟微信打飞机开发思路

    博客分类:
  • Java
 
阅读更多

一、要求:

         创建玩家飞机,敌方飞机,均能发子弹,撞击后能移除相应对象。

二、思路:

      类的定义以及具体需要实现的功能:

     UI//窗体,控制玩家移动的鼠标监听器,刷新窗体的方法,Esc的键盘监听器,游戏的初始化,暂停等

       UpdataCenter//刷新窗体的线程

     MyPlane//玩家飞机,判断是否被敌人撞,被敌人子弹击中,控制背景移动

       Bullet//玩家的子弹,控制自己移动,判断是否和敌方子弹相遇抵消

       EnermyPlane//敌方飞机,父类,敌机移动以及出界的相应操作

       EnermyPlaneLarge//敌方飞机大号,控制自己移动,判断是否被玩家子弹击中

       EnermyPlaneMedium//敌方飞机中号,控制自己移动,判断是否被玩家子弹击中

       EnermyPlaneSmall//敌方飞机小号,不发子弹,控制自己移动,判断是否被玩家子弹击中

       EnermyThread//创建敌方飞机线程,不定时创建各类敌机的对象

       SendShot//随机创建敌方子弹的线程,定时发送子弹攻击玩家

       Shot//敌方子弹(自己控制发射)

 

      其它功能:加入分数统计,关卡,生命等数据。

 

三、具体实现:

 

UI.java

定义属性:

  static ArrayList<Bullet> bulList = new ArrayList<Bullet>();

static ArrayList<Shot> shotList = new ArrayList<Shot>();

static ArrayList<SendShot> ssList = new ArrayList<SendShot>();

static ArrayList<EnermyPlane> enermyList = new ArrayList<EnermyPlane>();

static int score = 0;

static int largeScore = 0;

static int pass = 1;

static int backgroundY = 0;

static boolean pause = false;//当Esc按下的时候暂停所有线程

 

在窗口上加入JPanel center。重写JPanel的paint()方法,便于重绘。

在paint里面便利队列 绘制所有飞机,子弹,分数等信息。

 

UpdataCenter.java

重写run()方法,不断center.repaint()。

 

MyPlane.java

定义属性:

  int speed;//飞机移动速度,用键盘控制移动的时候会有用。

int x, y;//飞机当前所在位置,用这个来画,死了之后移到-100,-100。1s后移到xt,yt

int xt, yt;//保存飞机初始时出现的位置

int count = 0, count1 = 0;//用来控制发子弹和背景移动的时间间隔

static int lives = 3;//生命默认3条

int width, height;//飞机图片宽度和高度

boolean canDie = true;//己方每次被撞之后下一条生命有2s无敌时间

 

draw方法:

 

 

public void draw(Graphics g) {
	g.drawImage(myPlane.getImage(), x, y, width, height, null);
}

 

判断是否被撞的方法以及被撞了之后的处理:

 

	/**
	 * 是否和敌方撞到
	 */
	public void bump() {

		// 和任何一种飞机相撞
		if (canDie) {
			// 判断是否游戏结束
			for (int i = 0; i < UI.enermyList.size() && lives > 0; i++) {
				EnermyPlane eps = UI.enermyList.get(i);

				if ((eps.x + eps.width >= x && eps.x <= x + width
						&& eps.y + eps.height / 2 >= y && eps.y <= y + height
						/ 2 - 10)
						|| (eps.x + eps.width / 2 + 20 >= x
								&& eps.x + eps.width / 2 - 20 <= x + width
								&& eps.y + eps.height >= y && eps.y <= y
								+ height)) {
					UI.enermyList.remove(eps);
					haveBump();
					return;
				}
			}

			// 和敌方子弹相撞
			for (int i = 0; i < UI.shotList.size() && lives > 0; i++) {
				Shot st = UI.shotList.get(i);
				if (st.x + st.size >= x && st.x <= x + width
						&& st.y + st.size >= y && st.y <= y + height) {
					UI.shotList.remove(st);
					haveBump();
				}
			}
		}
	}

	/**
	 * 被撞了
	 */
	public void haveBump() {

		lives--;
		explode.play();
		if (lives <= 0) {
			GameOver();
		}
		// 撞到了就移除自己的飞机,过1s再加进来。并且前面2s不会再被撞死
		x = -100;
		y = -100;
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		x = xt;
		y = yt;
		canDie = false;

	}

 

其余方法:

       backgroundMove();//控制背景移动

       GameOver();//游戏结束的处理

 

重写run方法:

public void run() {
		while (lives > 0) {
			try {
				if (!UI.pause) {
					backgroundMove();
					if (!canDie) {
						Thread.sleep(2000);
						canDie = true;
					}//这2s不判断是否被撞
//BUG:这样的话不能发子弹,背景不能移动
					bump();
					if (count % 5 == 0) {
						// 放子弹
						Bullet bul = new Bullet(x + width / 2, y);
						UI.bulList.add(bul);
						new Thread(bul).start();
					}
					count++;
				}

				Thread.sleep(50);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	}

 

Bullet.java

定义属性:

        int speed;

int x, y;

boolean isLive;

int size = 10;

 

构造方法中初始化数据:

public Bullet(int x, int y) {
	speed = 15;
	this.x = x - size / 2;
	this.y = y;
	isLive = true;
}

 

move方法:

 

void move() {
	y -= speed;
	if (y <= 0) {
		isLive = false;
		UI.bulList.remove(this);
	}
}

 

在bump()中判断是否与敌方子弹相撞,重写Thread的run方法,在里面调用move();bump();

while (isLive) {

if (!UI.pause) {

move();

bump();

}

。。。

}

 

EnermyPlane.java

定义属性:

  boolean isLive = true;

Random rd = new Random();

SendShot ss;

int second = rd.nextInt(3000) + 2000;// 发子弹

int x, y,speed;

int width,height;

 

public void moveDown() {

y += speed;

if (y > centerHeight) {//超过最下面了

isLive = false;

//从队列移除

UI.enermyList.remove(this);

}

}

 

public void draw(Graphics g){//在子类中实现

}

 

EnermyPlaneSmall.java(其余两类飞机一样的)

 

构造方法中初始化数据:

        public EnermyPlaneSmall() {

speed = 2 + UI.pass;

isLive = true;

width = enermyPlaneSmall.getIconWidth() / 2;

height = enermyPlaneSmall.getIconHeight() / 2;

x = rd.nextInt(400);

y = -height;

                //ss = new SendShot(this);//发子弹

//UI.ssList.add(ss);

//new Thread(ss).start();

}

 

在bump中判断是否被玩家子弹击中。

 

EnermyThread.java

 

run()中的关键代码:

 

while (MyPlane.lives > 0) {// 我方还存在生命
				// 每隔5s出3-6个小的,共出4-6次.
				if (!UI.pause) {
					for (int k = 0; k < 2; k++) {
						for (int j = 0; j < rd.nextInt(4) + 2
								&& MyPlane.lives > 0; j++) {
							for (int i = 0; i < rd.nextInt(3) + 3; i++) {
								EnermyPlaneSmall eps = new EnermyPlaneSmall();
								UI.enermyList.add(eps);
								new Thread(eps).start();
							}
							Thread.sleep(4000);
						}
						// 出2个中的
						for (int i = 0; i < 2 && MyPlane.lives > 0; i++) {
							EnermyPlaneMedium epm = new EnermyPlaneMedium();
							UI.enermyList.add(epm);
							new Thread(epm).start();
						}
						Thread.sleep(3000);
					}
					// 出来一个Boss
					if (MyPlane.lives > 0) {
						EnermyPlaneLarge epl = new EnermyPlaneLarge();
						UI.enermyList.add(epl);
						new Thread(epl).start();
					}
				}
			}

 

SendShot.java

 

在run中生成Shot对象,并Thread.sleep(ep.second);

如果这个飞机被打死了,这个对象就移出队列,且不再生成Shot对象了。

 

Shot.java

 

定义属性:

        int size = 4;

EnermyPlane ep;

int speed = 8;

int x, y;

 

boolean isLive = true;

 

	@Override
	public void run() {
		while (isLive) {
			if (!UI.pause) {
				isLive = ep.isLive;
				moveDown();
			}
			try {
				Thread.sleep(50);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		if (!ep.isLive) {// 清除剩余的子弹
			UI.shotList.remove(this);
		}
	}

	void draw(Graphics g) {
		g.setColor(Color.white);
		g.fillOval(ep.x + ep.width / 2, y, size, size);
	}

	public void moveDown() {
		y += speed;
		if (y >= 600) {
			UI.shotList.remove(this);
		}
	}

 

附上效果图:



 

 

 

当前已知bug:
撞击判断有很大的误差,最高分有时候会比分数小,游戏结束了后还不能重新开始,玩家挂了一次之后2s无敌时间导致不能发子弹而且背景也不动。

 

 

  • 大小: 41.2 KB
  • 大小: 36.9 KB
  • 大小: 35.3 KB
5
0
分享到:
评论

相关推荐

    java版微信打飞机

    java版的微信打飞机。对于初学Java的还是听有帮助的,里面用了Java简单的图形编程,以及一些接口和抽象类的使用,简单用了下装饰者模式和生产者模式,当然代码还是有很多重用厉害的地方,这也是以后需要不断改进的,...

    微信游戏打飞机游戏制作(java模拟微信打飞机游戏)

    ### 微信游戏打飞机游戏制作(Java模拟微信打飞机游戏) #### 一、项目概述 本项目旨在通过Java语言实现一个类似于微信内置游戏“打飞机”的应用。该应用程序不仅能够帮助用户熟悉Java编程的基本原理和技术,同时...

    微信打飞机

    本文将深入探讨微信打飞机的开发技术,尤其是Java在游戏中的应用。 一、Java语言在游戏开发中的优势 1. 跨平台性:Java的“一次编写,到处运行”特性使得游戏可以在不同操作系统上运行,包括Android和部分iOS设备...

    仿微信版飞机大战(java、)

    【标题】"仿微信版飞机大战(Java实现)"是一个基于Java编程语言开发的游戏项目,旨在模拟微信风格的飞行射击游戏。这个游戏的核心是利用Java的多线程技术,为玩家提供流畅、实时的互动体验。 【描述】在这个项目中...

    cocos2dx之微信打飞机

    《cocos2dx之微信打飞机》是一款基于Cocos2dx引擎开发的移动游戏,它融合了微信社交元素,让玩家可以与好友一较高下。本文将深入探讨这款游戏的开发技术、设计理念以及如何利用Cocos2dx框架实现游戏功能。 首先,...

    安卓Android源码——Cocos-2d FeiJi微信打飞机.zip

    "安卓Android源码——Cocos-2d FeiJi微信打飞机.zip" 这个标题指的是一个包含安卓应用源代码的压缩文件,该应用是基于Cocos-2d游戏引擎开发的,游戏名为"FeiJi微信打飞机"。Cocos-2d是一个流行的游戏开发框架,适用...

    微信打灰机源码

    "微信打飞机"和"打飞机源码"是指游戏的核心内容。打飞机游戏通常涉及基本的游戏循环、玩家控制、敌机生成、碰撞检测、分数计算和游戏结束条件等。源码会展示如何使用Android的SurfaceView或GLSurfaceView来绘制2D...

    纯javascript模仿微信打飞机小游戏

    七夕情人节也不要忘了打游戏喔喔~,下面小编为大家准备的情人节礼物之纯javascript模仿微信打飞机小游戏分享给天下的情人们。 首先给大家展示效果图: 查看演示 源码下载 纯JavaScript模仿微信打飞机游戏,做网页...

    js写的模拟打飞机 源码

    本篇将详细介绍一个由JS编写的模拟微信打飞机小游戏,通过分析源码,深入探讨其背后的技术实现。 首先,我们要理解这个游戏的基本机制。打飞机游戏是一种经典的空战射击游戏,玩家通过控制一架飞机躲避敌机的攻击并...

    打飞机游戏

    "打飞机游戏"是一款基于Java开发的简单游戏,模拟了微信内置的经典小游戏——打飞机。在这款游戏中,玩家可以通过控制飞机躲避敌机并击落它们,以获得更高的分数。Java是一种广泛使用的编程语言,以其“一次编写,...

    WEB前端简历模板06.doc

    + PC端飞机大战游戏——模拟微信飞机大战小游戏,运用面向对象结合HTML5中的新特性canvas完成PC端游戏。 获奖情况 * 2013-2014校优秀学生 * 2013-2014校级三等奖学金 * 2013-2014学校英语阅读竞赛二等奖 * 2013-...

Global site tag (gtag.js) - Google Analytics