一:界面搭建

1.1: 窗口的搭建

menu java menu java game_构造器

 1.1.1首先,创建 MyPanel 类,继承 JPanel, 这个为我们绘制界面的面板,游戏中呈现的一系列画面都要在这个类中进行。

menu java menu java game_menu java_02

 1.1.2在类中重写 paint 方法,我们的图像都在这个方法中进行绘制。

menu java menu java game_初始化_03

 1.1.3 创建 PlaneWar 类,继承 JFrame。内有主方法,这是我们程序的入口。书写 getGame 方法,来对窗口进行初始化。

1.2: 菜单栏的搭建

首先,搭建菜单栏需要创建一个JmenuBar 类,在菜单栏下创建 游戏 和 帮助 两个一级菜单,并设置字体。创建两个一级菜单的子菜单,加入到一级菜单中,将一级菜单添加到菜单栏,最后设置到窗口。

initMenu() 方法写在 PlaneWar 类中,在 getGame()方法中调用。

menu java menu java game_构造器_04

二:游戏基本内容构建

2.1 :游戏背景图的设置

menu java menu java game_java_05

 这时我们这次使用的背景图。下面是添加方法。

在 MyPanel 类的构造器中初始化该图片。

我们所有的图片都需要在构造器中初始化才能够使用,不然会报空指针异常。

menu java menu java game_构造器_06

 在 paint 方法中将该图片画出。,我们所有需要显示出来的东西都需要在 paint()方法中绘制出来才可以使用。 (g 是画笔)

menu java menu java game_初始化_07

 2.2: 飞机的创建

2.2.1 :在该游戏中我们有两类飞机,分别是我们的飞机与敌人的飞机。两者有许多共同之处,将他们提取出来,创建父类 Plane。子类有 MyPlaneEnemyPlane。

2.2.2 :这里是飞机的公共部分。x,y 是飞机的坐标。isLive 代表飞机是否存活。blood 代表飞机的血量。(该属性与爆炸效果有关)。 公共方法主要是移动方法move ,和 碰撞方法 isCrash,以及一些get、set方法。

menu java menu java game_构造器_08

2.3: 创建我们的飞机

menu java menu java game_构造器_09

 这时我选择的飞机图片,将该图片在MyPanel类的构造器中初始化,在paint方法中绘制出来.

menu java menu java game_java_10

 注意,我们中的第二个,第三个参数为飞机的坐标,我们不要输入固定值(如果为了实验一下,可以随意输入值),这时为了以后飞位置更改后,新的飞机能够绘制在正确的位置。170 为飞机的宽,150 为飞机图片的高。

此时,我们完成的效果如下图所示(忽略掉子弹和敌机)。

menu java menu java game_初始化_11

2.4:让我们的飞机动起来

2.4.1:这里我采用的是鼠标监听,飞机跟随鼠标的移动而移动。

这个方法在MyPanel类中。 

使用匿名类内部减少代码量,在MouseAdapter中重写mouseMoved方法,这里的变量e,可以看作是我们的鼠标。

2.4.2:首先我们要判断鼠标的位置,与我们飞机位置之间的关系。(当开始游戏时,只有将鼠标移动到飞机图片上,飞机才会跟随鼠标移动。),当我们的鼠标移动到飞机上后,经过myPlane中的特有方法 isOnPlane, 判断为真,这时myPlane中的特有属性 canMove 为真,这时,只要飞机对象不为空且飞机仍然存活,我们就会调用 move 方法,使飞机的坐标与鼠标的坐标相同。从而达到跟随鼠标移动的效果。

menu java menu java game_构造器_12

 这两个方法在 MyPlane 类中.

menu java menu java game_java_13

 2.4.3:完成这一步后,我们运行程序,发现我们的飞机任何动不了。这时因为我们没有完成画面的repaint(重绘),可以理解为界面的刷新。

下面是重绘方法,在MyPanel 内里创建一个成员内部类,实现Runnable接口,在里面书写线程,进行刷新。接着将这个线程在MyPanel的构造器中启动。

menu java menu java game_构造器_14

menu java menu java game_初始化_15

2.4.4: 这里展示的只是一种重绘方式。也可以直接让MyPanel实现Runnable接口,直接书写线程重绘,然后在PanelWar的getGame方法中进行线程的启动。等等~~

2.5 子弹的绘制以及发射

2.5.1 首先,我们应该想到,子弹射出后要持续改变坐标进行移动,所以我们要创建一个子弹类,来进行这个线程。我们的飞机从下向上射击,所以 y 的坐标应该不断减少,x 的坐标保持不变。同时含有Boolean类型属性 canShot 来控制线程的进行和终止。当 y 的坐标将要到达画面边界时,将线程终止,让子弹消失(消失具体体现在paint方法中)。

menu java menu java game_构造器_16

 2.5.2: 只是我们飞机的子弹(不断发射的),所以我们的飞机类MyPlane中要有一个集合,来存储在界面上的子弹。(这里我使用的是Vector集合,线程安全)

menu java menu java game_初始化_17

 2.5.3:同时,我们的飞机类需要实现Runnable 接口,因为我们的飞机需要源源不断的产生子弹。每 150 ms 就产生一颗子弹,加入到集合中,子弹的初始坐标为当前飞机图片机头坐标。加入完毕后,变量子弹集合,如果子弹不能射击(即到达边界),就将该子弹从集合中移除,否则就启动线程。同时设置守护线程(即飞机被摧毁的同时,所有的子弹也停止)。

menu java menu java game_menu java_18

 2.5.4:在MyPanel 的构造器中初始化飞机,启动线程。(记得要在paint方法中通过遍历绘制出子弹。) 这时子弹图片。

menu java menu java game_开发语言_19

menu java menu java game_开发语言_20

menu java menu java game_构造器_21

 2.5:敌人的飞机

这里敌人的飞机有3种不同的类型(即不同图片的飞机)。

menu java menu java game_初始化_22

 

menu java menu java game_java_23

menu java menu java game_初始化_24

menu java menu java game_java_25

 同时,有线程来控制敌机的移动,从上到下竖直移动。(这里在遍历敌人子弹时会偶尔抛出异常,同时敌人发射子弹造成游戏难度太高,我把它注释掉了)

menu java menu java game_开发语言_26

 这是敌人子弹类,有兴趣的可以试一下。

menu java menu java game_构造器_27

 接下来。我们在MyPanel中定义敌人飞机集合,在构造器中启动线程,不断产生新的敌机,并且启动飞机的移动线程(这里我使用的匿名内部类,减少代码量)。下图代码在MyPanel构造器中。最后在paint()方法中画出敌机即可。

menu java menu java game_初始化_28

menu java menu java game_menu java_29

 三:游戏效果的增加

3.1 增加碰撞,摧毁机制

3.1.1: 在Plane类(父类中)书写方法isCrash,输入碰撞的坐标,和类型。这里碰撞分两种类型,一种是我们的子弹打到敌机,敌机摧毁。另外一种是我们的飞机与敌人的飞机碰撞,游戏结束。

menu java menu java game_menu java_30

 在MyPanel类中书写 crash,首先判断子弹与敌机碰撞情况,遍历所有的敌机和所有的子弹,传入子弹坐标(这时种类1的碰撞,传入1),如果碰撞为真,就将该子弹的canShot 和 敌机的 isLive 属性都为false,重绘后,在paint方法中移除。

接下来是飞机的碰撞情况,与上述基本相同。碰撞后,游戏结束,isPlay = false

menu java menu java game_初始化_31

 最后在paint方法中加入crash()即可。

3.2  增加爆炸效果

boom 方法,在MyPanel 方法中。这里使用参数多态,我们的飞机和敌机都可以传入,通过blood的不断减少,放出不同的爆炸图片,形成动态效果。

menu java menu java game_初始化_32

menu java menu java game_构造器_33

menu java menu java game_构造器_34

最后在paint中调用该方法。

menu java menu java game_构造器_35

menu java menu java game_开发语言_36

menu java menu java game_构造器_37

 四:后续

我的代码到这里就结束了,大家写的还可以加入分数系统,以及IO流,预处理等来储存数据,以便继续上盘游戏,开始游戏,GameOver等功能。

最后效果静态图演示

menu java menu java game_menu java_38