第8天

1.接口

1)也是一种引用数据类型----类也是引用数据类型
2)由interface来定义----类是用class来定义
3)接口中只能包含常量和抽象方法(默认的),可以看成是只包含抽象方法的抽象类----方法权限都是公开的
4)接口不能被实例化-----接口不能new对象
5)接口是需要被实现/继承的,实现类/派生类:必须重写接口中的所有抽象方法
6)一个类可以实现多个接口(用逗号隔开)------一个类只能继承一个父类
  若又继承又实现,必须先继承后实现
7)一个接口可以继承另一个接口

2.设计规则

1)将派生类所共有的属性和行为,抽到超类中------抽共性
2)所有派生类的行为都一样,设计为普通方法
   所有派生类的行为都不一样,设计为抽象方法
3)将部分派生类所共有的行为,抽到接口中
   符合“既是...也是...”的原则时,使用接口
   接口是对继承单根性的扩展--------实现多继承

项目推进:

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实现接口

* 补充内容:

swing中基于事件的

1)事件:发生了一个事
2)事件处理:发生事之后所做的操作
3)侦听器:
   3.1)有一个侦听器对象
   3.2)将侦听器装到面板去

例如:

事件              事件处理
鼠标点击        启动状态变为运行状态
鼠标移动        英雄机随着动
鼠标移出        运行状态器变为暂停状态
鼠标移入        暂停状态变为运行状态

例如:

  interface Inter1{
    double PI=3.14; //默认public static final
    void test(); //默认public abstract
    int num; //编译错误,常量必须声明同时初始化
    void say(){};//编译错误,抽象方法不能有方法体
  }
  interface Inter2{
    void show();
  }
  abstract class Aoo{
    abstract void sayHi();
  }
  class Boo extends Aoo implements Inter1,Inter2{
    public void test(){}
    public void show(){}
    void sayHi(){}
  }