我的java学习日记(21、22)

来源:互联网 发布:java final class 编辑:程序博客网 时间:2024/05/23 22:41

Java学习第2122节 项目实训之坦克大战

 步骤简述

1、在Eclipse中新建一个java项目,命名为Game;并在该项目下创建一个专门放项目所需图片的文件夹,命名为images,然后把图片放进该文件夹

2、在项目Game下创建游戏窗体类GameFrame,建立窗体,并设置窗体参数,然后在类中创建面板,添加到窗体,并设为主面板

3、在窗体类中创建JLaybel对象,把坦克对象四个方向的图片传进来,并设置其参数

4、添加一个键盘监听事件,使得按下上下左右键的时候坦克可以上下左右移动,用if语句判断,也可用swich方法,给相应方向键选择相应方法的坦克图片及坐标

5、在坦克移动换方向的时候,每次都要new一个图片对象,会导致导致反复创建,影响性能。所以我们需要预先定义一个接口Data,在接口中定义好图片对象,还有把主坦克定义也放这里边,即可在类里边直接引用,

6、为了便于管理,所以要封装一个Tank类,把坦克的一些基本属性和一些方法全部封装进去,同时删去主窗体中原有的一些坦克相关定义,以免冲突

7、往程序中添加敌人坦克的信息,首先在存放数据的接口Data中定义敌人战机需要的图片对象和敌人坦克的定义,然后在Tank类中加入敌人坦克的信息,这个需要在有主坦克信息的地方加入if条件语句来实现两种坦克同时定义,要实现多个敌人坦克同时运行,需要加入线程,所以需要新建一个实现这一功能的线程类,最后在游戏主窗体类中创建一个敌人坦克数组,并在构造方法中初始化敌人坦克,启动敌人坦克线程

8、为游戏窗体添加围墙,并初始化。

9、借助于intersects()方法,可以比较两个组件的bound是否相交。使用随机算法可以使敌人坦克随进生成,但是却会导致与围墙或者其他坦克重叠。把敌人坦克随机生成这一功能封装到一个方法内,并将其改良

10、在坦克的run方法中添加坦克遇到围墙、坦克遇到坦克等换方向的功能

11、为了实现坦克运动的效果,把两张不同运动状态的图片传进去互相切换。首先要在Data.java中定义图片资源,然后在坦克run方法中加入这一图片转换功能代码

12、创建子弹类,继承JLabel。首先要在Data类中创建两方坦克的子弹图片资源,然后创建一个子弹类,在类里边定义一个坦克对象,是的子弹的方向与发射坦克方向一致,然后定义子弹速度,子弹方向,一个布尔参数,标志子弹是否可用,若是子弹击中某东西,则该值设为false,可视也设为false不可见,然后定义构造方法,在构造方法中保存发射子弹的坦克、子弹发射的方向,然后设置子弹对象的图片,最后计算子弹的坐标,达到运动效果.在该类中定义一个发射方式,fire()方法,实现坐标的移动

13、创建一个主坦克子弹发射的线程,然后在主窗体中加入子弹对象,并加入主面板。然后添加按下空格键发射子弹,需要在键盘监听事件中,判断按下空格键,创建子弹对象,并启动子弹线程,如果子弹活着则循环调用子弹的发射方法,否则把子弹的可视设为false,最后把该线程添加到主面板启动

14、紧接着再创建一个敌人坦克自动发射子弹的线程,在该线程的run方法中,

创建一个自动发射机制,每隔一段时间发射一个子弹

15、为了计算击中敌人坦克的数量和游戏是否结束,在游戏窗体中添加一个计算敌人坦克数量的量hitCount,一个游戏是否结束的标志isGameOver,然后在子弹击中敌人坦克的代码后加上hitCount++;在每一个运行线程后加上isGameOver的判断。

16、在子弹的fire()方法中,除了原来的改变坐标外,加入是否击中了物体的判断。首先,如果子弹击中围墙,则子弹和围墙均消失;其次,如果子弹超出边界,则子弹失效;然后是如果敌人坦克子弹击中主坦克,则主坦克销毁游戏结束;最后是如果主坦克子弹击中敌人坦克,且该敌人坦克不是最后一辆,则子弹和敌人坦克均销毁,如果是最后一辆坦克,则坦克和子弹失效,游戏结束

17、在游戏结束的地方加入弹出提示对话,添加方法如下图,其次还需要定义一个数组存放“再来一局”和“退出游戏”两个字符串

18、对话框实现后,需要让对话框上显示的文字有动作,则需要在主窗体中添加一个初始化方法init(),将一些面板元素的初始化全部加入进去。

19、由于在开始“再来一局”的时候,存在上一局的部分子弹在游戏结束时处于休眠状态,而开始新的一局的时候醒来,会掺杂在新游戏的子弹中,为了避免这个bug需要在子弹的fire()方法中,对话框代码的前边加一个将所有敌人战机和子弹全部设为不可视和摧毁状态

20、紧接着将上述JOptionPane.showOptionDialog()对象的值交给一个整形的result,然后判断result的值,如果等于1,就说明要开始一局新的游戏,此时,先将本局游戏的面板清空,调用主窗体中的初始化方法init(),再重绘主窗体中的主面板,最后把布尔变量isGameOver设为false。如果result的值等于1或者-1是,退出游戏代码为System.exit(0);即退出游戏

 

0 0
原创粉丝点击