飞机大战游戏设计步骤

射击游戏的需求:
1.所参与的角色:英雄机、子弹、小敌机、大敌机、小蜜蜂、天空
2.角色间的关系:
  1)英雄机发射子弹(单倍火力、双倍火力)
  2)子弹射击敌人(小敌机、大敌机、小蜜蜂),若击中了:
        2.1)子弹直接消失、敌人先爆破再消失
        2.2)若击中的是小敌机,则玩家得1分
       2.3)若击中的是大敌机,则玩家得3分
       2.4)若击中的是小蜜蜂,则英雄机得奖励(1条命或40火力值)
  3)敌人(小敌机、大敌机、小蜜蜂)和英雄机撞,若撞上了:
       3.1)敌人先爆破再消失
       3.2)英雄机减1条命,并且,清空火力值----命数为0时游戏结束
  4)英雄机、子弹、小敌机、大敌机、小蜜蜂都在天空上飞

射击游戏的设计步骤:
1、首先明确六个对象所应该具备的属性和行为

Hero

属性:

宽、高、x坐标、y坐标、火力、生命

行为:

  • 英雄机随着鼠标移动
  • 英雄机发射子弹

Airplane

属性:

宽、高、x坐标、y坐标

行为:

  • 小敌机与英雄机碰撞
  • 小敌机移动

2、创建六个类以及六个类对应的构造方法 

3、创建一个FlyingObject的超类,6个对象类继承超类

  • 将共有的属性和行为抽到超类中
  • 在超类中创建两个构造方法,6个对象类分别super调用
  • 在6个对象类中重写step()移动方法

4、画窗口:------Word类---CV大法

5、设计Images图片工具类

6、画对象:

1)想画对象,需要去获取对象的图片,每个对象都得获取图片, 意味着获取图片行为为共有行为,所以设计在超类FlyingObject中, 每个对象获取图片的行为都是不一样的,所以设计为抽象方法 ---在FlyingObject中设计抽象方法getImage()用于获取对象的图片

2)获取图片时需要考虑对象的状态,因为在不同的状态下获取的图片也是不同的, 每个对象都有状态,意味着状态为共有属性,所以设计在超类FlyingObject中, 状态一般都设计为常量,同时设计变量state表示当前状态 ----在FlyingObject中设计LIVE、DEAD、REMOVE状态常量,state变量表示当前状态 状态常量有了,在获取图片时还需要去判断状态,每个对象都得判断状态, 意味着判断状态行为为共有行为,所以设计在超类FlyingObject中, 每个对象判断状态的行为都是一样的,所以设计为普通方法 ----在FlyingObject中设计isLive()、isDead()、isRemove()来判断对象的状态

3)重写getImage()获取图片行为:

      3.1)天空Sky: 直接返回sky图片即可

      3.2)英雄机Hero: 直接返回heros[0]和heros[1]的来回切换

      3.3)子弹Bullet:

            3.3.1)若活着的,直接返回bullet图片即可
            3.3.2)若死了的,直接删除(不返回图片)

      3.4)小敌机Airplane:

            3.4.1)若活着的,直接返回airs[0]图片即可

            3.4.2)若死了的,依次返回airs[1]到airs[4]爆破图,4后删除(不返回图片)

      3.5)大敌机BigAirplane:

            3.5.1)若活着的,直接返回bairs[0]图片即可

            3.5.2)若死了的,依次返回bairs[1]到bairs[4]爆破图,4后删除(不返回图片)

      3.6)小蜜蜂Bee:

            3.6.1)若活着的,直接返回bees[0]图片即可

            3.6.2)若死了的,依次返回bees[1]到bees[4]爆破图,4后删除(不返回图片)

4)图片有了则可以开画了 ----在world类中重写paint()画方法

7、敌人入场

1)敌人是由窗口产生的,所以在World类中创建nextOne()生成敌人对象

2)敌人入场为定时发生的,所以在run()中调用enterAction()实现敌人入场 在enterAction()中: 每400毫秒,获取敌人对象obj,enemies扩容,将obj装到enemies最后一个元素上

注意:在run()中调用enterAction()之后,需调用repaint()来重画

8、子弹入场

1)子弹是由英雄机发射出来的,所以在Hero类中创建shoot()生成子弹对象

2)子弹入场为定时发生的,所以在run()中调用shootAction()实现子弹入场 在shootAction()中: 每300毫秒,获取子弹数组对象bs,bullets扩容,将bs追加到bullets的末尾

9、飞行物移动

1)飞行物移动为对象所共有的行为,所以在FlyingObject中设计抽象方法step(),派生类重写

2)飞行物移动为定时发生的,所以在run()中调用stepAction()实现飞行物移动 在stepAction()中: 天空动,遍历敌人敌人动,遍历子弹子弹动

10、英雄机移动(随着鼠标动)

1)英雄机移动为英雄机的行为,所以在Hero中设计moveTo()英雄机移动

2)英雄机移动为事件触发的,所以在侦听器中重写mouseMoved()鼠标移动事件 在mouseMoved()中: 获取鼠标的x和y坐标,调用moveTo()实现英雄机移动

11、删除越界的敌人和子弹

1)在FlyingObject中设计isOutOfBounds()检测敌人是否越界 在Bullet中重写isOutOfBounds()检测子弹是否越界

2)删除越界敌人和子弹是定时发生的,所以在run()中调用outOfBoundsAction()删除越界敌人和子弹 在outOfBoundsAction()中: 遍历所有敌人,判断若敌人出界了,则将出界元素替换为最后一个元素,enemies缩容 遍历所有子弹,判断若子弹出界了,则将出界元素替换为最后一个元素,bullets缩容 4

12、设计EnemyScore得分接口,Airplane和BigAirplane实现接口 设计EnemyAward奖励接口,Bee实现接口

13、子弹与敌人的碰撞

1)在FlyingObject中设计isHit()检测碰撞、goDead()飞行物去死 在Hero中设计addLife()增命、addFire()增火力

2)子弹与敌人的碰撞为定时发生的,所以在run()中调用bulletBangAction()实现子弹与敌人的碰撞 在bulletBangAction()中: 遍历子弹得子弹,遍历敌人得敌人,判断若都活着并且还撞上了: 子弹去死、敌人去死 判断若被撞敌人为EnemyScore,则玩家得分 判断若被撞敌人为EnemyAward,则获取奖励类型,英雄机得奖励

14、画分和画命

1)在Hero中设计getLife()获取英雄机的命数

2)在World类的paint()中: 画分和画命

15、英雄机与敌人的碰撞

1)借用FlyingObject的isHit()检测碰撞、goDead()飞行物去死 在Hero中设计subtractLife()减命、clearFire()清空火力值

2)英雄机与敌人碰撞为定时发生的,所以在run()中调用heroBangAction()实现英雄机与敌人的碰撞 在heroBangAction()中: 遍历敌人得敌人,判断若都活着并且还撞上了: 敌人去死、英雄机减命、英雄机清空火力值

16、检测游戏结束

1)借用Hero的getLife()获取命数

2)检测游戏结束为定时发生的,所以在run()中调用checkGameOverAction()检测游戏结束 在checkGameOverAction()中: 判断若英雄机的命数<=0,表示游戏结束了,则将当前状态修改为游戏结束状态

17、画状态

1)在World中设计START、RUNNING、PAUSE、GAME_OVER状态常量,state变量表示当前状态 在Images中设计start、pause、gameover状态图,static块中初始化 在World类的paint()中: 设计在不同状态下画不同的图

2)设计那一堆action,为仅在运行状态下执行 设计英雄机随着鼠标移动,为仅在运行状态下执行

3)重写mouseClicked()鼠标点击事件: 启动状态变运行状态,游戏结束状态先清理现场再变启动状态 重写mouseExited()鼠标移出事件: 运行状态变暂停状态 重写mouseEntered()鼠标移入事件: 暂停状态变运行状态

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

謹言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值