初学javaSE练手项目——飞机大战

1.概述

相信很多小伙伴和答主一样,在学完javaSE之后面临以下的灵魂拷问—–
1 知识点零散,如何将串联起来呢?
2.基础的知识点已经学完,对于项目“我”已经跃跃欲试了
3.网上的资源零散,缺少详细又难度适中的项目练手

那么在这个过程中我们的目的便是——
将知识点整合,对于项目有具体而明晰的思路,这有助于为自己以后的学习增加经验与自信心。
闲言少叙,让我们先来一睹飞机大战的真容吧——

2.成果展示

3.核心知识点

核心知识点 重要性星级
面向对象的思想 * * * * *
函数化,结构化编程 * * * * *
接口,抽象类,静态代码块 * * * * *
重写run方法实现多线程 * * * * *
Swing图形化界面,以及添加相关鼠标事件 * * * *
使用集合存储对象,并使用集合的相关方法 * * * * *

4.项目需求

英雄机发射子弹,敌机(飞机+小蜜蜂)自上而下产生,命中敌机加分,命中小蜜蜂得双倍火力或者赢得一条命,如果撞上飞机或者小蜜蜂,将减命,双倍火力清零,当生命值为0时,游戏结束

5.项目思路

初学javaSE练手项目——飞机大战_第1张图片初学javaSE练手项目——飞机大战_第2张图片初学javaSE练手项目——飞机大战_第3张图片
初学javaSE练手项目——飞机大战_第4张图片

6.重点代码展示与分析

(1)定时器

Time(定时器)的全名为java.util.Timer,该类用于线程调度任务在后台线程中执行一次或多次,这个类线程安全:多个线程可以共享一个单独的Timer对象,而不需要外部同步,另外需要注意的是,这个类可以扩展到大量并发计划任务。在内部,它使用二进制堆表示其任务队列,因此计划任务的成本为O(log
n),其中n为并发计划任务的数量,所有的构造函数启动定时器线程。

常用方法
schedule(TimerTask task, Date firstTime, long period);//从指定的时间开始对指定任务执行重复的固定延迟执行
局部代码
int interval=10;
		Timer time=new Timer();
		time.schedule(new TimerTask() {	
			@Override
			public void run() {
				if(state==RUNNING){
					enterAction();//入场
					stepAction();//走一步
					shootAction();//英雄机发射子弹
					bangAction();//碰撞测试
					outOfBoundAction();//越界检测
					checkGameoverAction();//检查游戏状态
				}
				repaint();//重绘,调用paint方法
			}
		}, interval, interval);

(2)画笔

DrawImage方法属于Graphics类,该类是所有图形类的抽象基类,该类下的方法大多为抽象方法,由子类实现。一个Graphics对象封装了java支持的基本渲染操作所需的状态信息,比如坐标,颜色,字体,逻辑像素运算功能

常用方法

1.绘制当前可用的指定图像的大小。

drawImage(Image img, int x, int y, ImageObserver observer) 

2.使用该图形上下文的当前字体和颜色绘制由指定字符串给出的文本drawString(String str, int x, int y)

局部代码
g.drawImage(ShootGame.background,0,0,null);
g.drawString("life:"+hero.getLife(),x,y);	

(3)随机数

Random类用于生成一个随机数,线程安全而不加密安全。多线程设计中考虑使用ThreadLocalRandom,如有特殊的安全需求,则要考虑使用SecureRandom获取一个加密安全的伪随机数生成器,供安全敏感的应用程序使用。

1.生成一个介于[0,bound)的int值。
nextInt(int bound)

局部代码
public static FlyObject nextOne(){
		Random random=new Random();
		int type=random.nextInt(20);
		if(type<3){
			return new Bee();
		}
		return new AirPlane();		
	}

(4)碰撞算法

简单又明确的数学问题,自不多言。

public boolean hit(FlyObject fo) {
		int x1=fo.x-this.width/2;
		int x2=fo.x+fo.width+this.width/2;
		int y1=fo.y-this.height/2;
		int y2=fo.y+fo.height+this.height/2;
		
		int cx=this.x+this.width/2;
		int cy=this.y+this.height/2;
		return cx<x2&&cx>x1&&cy>y1&&cy<y2;	
	 }

(5)动画效果

如何制作动画效果呢——
使两张图片的切换时间尽可能短,人眼就看不出来了,在人眼中自然生成了动画的效果。

局部代码
public void step() {
		int length=images.length;
		image=images[index++/10%length];//两张照片每100毫秒切换一次,使其有喷烟的动画
	}

(6)数组扩容

Arrays类包含操作数组的各种方法,只要脑洞足够大,在这个类里面都可以找到方法实现。
当然,更推荐易操作的集合去实现

1.复制指定的数组,并为该数组指定长度
copyOf(int[] original, int newLength)

局部代码
Arrays.copyOf(bullets, bullets.length + b.length);

(7)instanceof关键字

instanceof关键字用于比较该对象是否与指定类的实例相同,比较的原理是:如果该对象是这个类及其所有父类,接口的实例化,则返回true,否则返回fause.

局部代码
if(one instanceof Enemy){
				Enemy e=(Enemy)one;
				//加分
				score+=e.getScore();
	}

(8)权限修饰符

这种东西大概就是一看全都会,在项目里使用就蒙圈的存在

初学javaSE练手项目——飞机大战_第5张图片

表是转载自别人的,作者做的表用心
原表链接:https://blog.csdn.net/yan8024/article/details/6426451

源码链接

链接:https://pan.baidu.com/s/1_MoM2n8mUqR5aBsu5AyHOw
提取码:tfl4

结语

答主刚学完javaSE,对知识的掌握程度略显浅薄,如果对大家有所帮助,也应选择性吸收。如有不恰当的地方,畅所欲言便是,与君共勉。

暮野四合,远方天际薄雾笼罩,隐约间,灯火闪烁,望眼欲穿,却看到了璀璨星辰。

你可能感兴趣的:(java,多线程,面向对象编程,抽象类)