第9天

1.多态

1)意义:

1.1)同一类型的引用指向不同的对象时,有不同的实现
     -------------行为的多态(行为不一样),抽象方法一定是多态:cut()、run()、step()......
1.2)同一个对象被造型为不同的类型时,有不同的功能
     -------------对象的多态:我、你、水......

2)向上造型/自动类型转换(小类型到大类型)

2.1)超类型的引用指向派生类的对象
2.2)能造型成为的类型有:超类+所实现的接口
2.3)能点出来什么,看引用类型

3)强制类型转换,成功的条件只有如下两种

3.1)引用所指向的对象,就是该类型
3.2)引用所指向的对象,实现了该接口或继承了该类 

4)强制时若不符合如上两种情况,则发生ClassCastException类型转换异常

建议:在强转之前先通过instanceof来判断引用指向的对象是否是该类型

项目推进:

Shoot射击游戏第一天:

1.创建了6个对象类,并创建World类测试

Shoot射击游戏第二天:

1.给6个对象类添加构造方法,并测试

Shoot射击游戏第三天:

1.设计小敌机数组、大敌机数组、小蜜蜂数组、子弹数组,并测试
2.设计FlyingObject超类,6个对象类继承超类
3.在FlyingObject超类中设计构造方法

Shoot射击游戏第四天:

1.将小敌机、大敌机、小蜜蜂数组合为FlyingObject数组,并测试
2.在6个派生类重写FlyingObject类的step()
3.画窗口

Shoot射击游戏第五天:

1.给类中成员添加访问控制修饰符
2.给6个对象类准备图片属性

Shoot射击游戏第六天:

1.设计窗口的宽和高为常量,适当地方做修改

2.画对象:

1)想画对象需要获取对象的图片,每个对象都得得图片,

说明获取图片为共有行为,所以设计在FlyingObject超类中,每个对象获取图片的行为都不一样,所以设计为抽象方法
    ---在FlyingObject中设计抽象方法getImage()获取对象的图片

2)获取图片时需要考虑对象状态,因为不同状态下获取的图片是不同的,

所有对象都有状态,所以状态需要设计在FlyingObject超类中,状态一般都设计为常量,state变量当前状态
    ---在FlyingObject超类中设计LIFE、DEAD、REMOVE常量,state变量
获取图片时需要判断对象的状态,每个对象都得判断状态,所以将判断状态行为设计在FlyingObject超类中,
每个对象判断状态的行为都是一样的,所以设计为普通方法
    ---在FlyingObject超类中设计isLife()、isDead()、isRemove()

3)重写getImage()获取对象图片

3.1)天空Sky,返回image即可
3.2)子弹Bullet:
    3.2.1)若活着的,返回image即可
    3.2.2)若死了的,则删除
3.3)英雄机Hero:
    3.3.1)若活着的,返回images[0]和images[1]来回切换
3.4)小敌机Airplane:
    3.4.1)若活着的,返回images[0]即可
    3.4.2)若死了的,返回images[1]到images[4]轮换,4后则删除
3.5)大敌机BigAirplane:
    3.5.1)若活着的,返回images[0]即可
    3.5.2)若死了的,返回images[1]到images[4]轮换,4后则删除
3.6)小蜜蜂Bee:
    3.6.1)若活着的,返回images[0]即可
    3.6.2)若死了的,返回images[1]到images[4]轮换,4后则删除

4)前3步获取了对象的图片,则可以开画了,每个对象都能画,

所以画对象的行为为共有的行为,所以设计在FlyingObject超类中,每个对象画的行为都是一样的,所以设计为普通方法
    ---在FlyingObject中设计paintObject()画对象

5)因为天空需要画两张图,所以在Sky中重写画对象

在Sky中重写paintObject()画对象

6)在World类中重写paint(),调用对象的paintObject()

Shoot射击游戏第七天:

1.敌人入场:

1)敌人是由窗口产生的,所以在World中设计nextOne()生成敌人对象
2)敌人入场为定时发生的,所以在run中调用enterAction()实现敌人入场
    在enterAction()中:
    每400毫秒,获取敌人对象,enemies扩容,并将敌人装在最后一个元素上

2.子弹入场:

1)子弹是由英雄机发射出来的,所以在Hero中设计shoot()生成子弹对象
2)子弹入场为定时发生的,所以在run中调用shootAction()实现子弹入场
    在shootAction()中:
    每300毫秒,获取子弹对象,bullets扩容,数组的追加

3.飞行物移动:

1)飞行物移动为所有对象所共有的行为,所以在FlyingObject中设计抽象step()实现飞行物移动,所有派生类中重写step()飞行物移动
2)飞行物移动为定时发生的,所以在run中调用stepAction()实现飞行物移动
    在stepAction()中:
    天空动,遍历敌人敌人动,遍历子弹子弹动

Shoot射击游戏第八天:

1.英雄机随着鼠标移动:

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

2.删除越界的敌人和子弹:

1)在FlyingObject中设计outOfBounds()实现敌人的越界检查
  在Bullet中重写超类的outOfBounds()实现子弹的越界检查
2)删除越界的为定时发生的,所以在run中调用outOfBoundsAction()实现删除越界敌人和子弹
  在outOfBoundsAction()中:
  声明不越界敌人/子弹数组,遍历enemies/bullets,
  判断若不越界,则将不越界对象添加到不越界敌人/子弹数组中
  最后,将不越界敌人/子弹数组复制到enemies/bullets中

3.设计Enemy得分接口,Airplane和BigAirplane实现接口

  设计Award奖励接口,Bee实现接口

Shoot射击游戏第九天:

1.子弹与敌人的碰撞:

1)在FlyingObject中设计hit()检测敌人与子弹是否碰撞上
  在FlyingObject中设计goDead()飞行物去死
  在Hero中设计addLife()增命、addDoubleFire()增火力
2)子弹与敌人的碰撞为定时发生的,所以在run中调用bulletBangAction()实现子弹与敌人的碰撞
  在bulletBangAction()中:
  遍历子弹,遍历敌人
    判断若撞上了:子弹去死、敌人去死
    判断若被撞敌人为分,则玩家增分
        若被撞敌人为奖励,则英雄机增命或增火力

2.画分和画命:

1)在Hero中设计getLife()获取英雄机的命
2)在paint()中: 画分、画命