@startuml
'https://plantuml.com/class-diagram

abstract class AbstractFlyingObject
{
    # int locationX
    # int locationY
    # int speedX
    # int speedY
    # BufferedImage image
    # int width
    # int height
    # boolean isValid

    + AbstractFlyingObject(int locationX, int locationY, int speedX, int speedY)
    + forward():void
    + crash(AbstractFlyingObject abstractflyingObject):boolean
    + setLocation(double locationX, double locationY):void
    + getLocationX():int
    + getLocationY():int
    + getSpeedY():int
    + getImage():BufferedImage
    + getWidth():int
    + getHeight():int
    + notValid():boolean
    + vanish():void
}
abstract class AbstractAircraft
{
	# int maxHp
    # int hp
    + AbstractAircraft(int locationX, int locationY, int speedX, int speedY, int hp)
    + decreaseHp(int decrease):void
    + getHp():int
    + {abstract} shoot():List<BaseBullet>
    + dropProps()：AbstractProp
 }

abstract class BaseBullet
{
    - int power
    + BaseBullet(int locationX, int locationY, int speedX, int speedY, int power)
    + forward():void
	+ getPower():int
}
abstract class AbstractProp{
    +AbstractProp(int locationX, int locationY, int speedX, int speedY)
    +forward():void
    +{abstract} activate (AbstractAircraft aircraft):void

}

abstract class EnemyAircraft

AbstractFlyingObject <|-- AbstractAircraft
AbstractFlyingObject <|-- BaseBullet
AbstractFlyingObject <|-- AbstractProp

AbstractAircraft <|-- EnemyAircraft
AbstractAircraft <|-- HeroAircraft
EnemyAircraft <|-- MobEnemy
EnemyAircraft <|-- EliteEnemy
EnemyAircraft <|-- Boss

BaseBullet <|-- HeroBullet
BaseBullet <|-- EnemyBullet

AbstractProp <|-- HpSupply
AbstractProp <|-- BombSupply
AbstractProp <|-- FireSupply



class HeroAircraft {
    - int shootNum
    - int power
    - int direction
    - {static}Abstractaircraft heroaircraft
    + HeroAircraft(int locationX, int locationY, int speedX, int speedY, int hp)
    + forward():void
    + shoot():List<BaseBullet>
    + {static}getHeroAircraft():HeroAircraft
}

class MobEnemy {
    + MobEnemy(int locationX, int locationY, int speedX, int speedY, int hp)
    + forward():void
    + shoot():List<BaseBullet>
}

class EliteEnemy{
    -shootNum
    -power
    -direction
    +EliteEnemy(int locationX, int locationY, int speedX, int speedY, int hp)
    +shoot():List<BaseBullet>
    +forward()
}

class Boss{
    -shootNum
    -power
    -direction
    +Boss(int locationX, int locationY, int speedX, int speedY, int hp)
    +shoot():List<BaseBullet>
}

class HeroBullet {
    + HeroBullet(int locationX, int locationY,
     int speedX, int speedY, int power)
}

class EnemyBullet {
    + EnemyBullet(int locationX, int locationY,
     int speedX, int speedY, int power)
}

class HpSupply{
    + HpSupply(int locationX, int locationY, int speedX, int speedY)
    + activate (AbstractAircraft aircraft):void
}

class BombSupply{
    + BombSupply(int locationX, int locationY, int speedX, int speedY)
    + activate (AbstractAircraft aircraft):void
}

class FireSupply{
    + FireSupply(int locationX, int locationY, int speedX, int speedY)
    + activate (AbstractAircraft aircraft):void
}

@enduml