package my_shoot;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
* 程序的启动类
* @author
*
*/
public class World extends JPanel{
public static final int WIDTH = 400; //窗口的宽
public static final int HEIGHT = 700; //窗口的高
//创建飞行物对象的数组 初始值0
FlyingObject[] fly= {};
//创建天空对象
Sky sky=new Sky();
Hero hero=new Hero();
Bullet[] bullet= {};//z子弹对象数组
//创建对象方法
int indexcount=0;
public void createFly() {
indexcount++;
if(indexcount%40==0) { //每400毫秒执行一次
FlyingObject f=null;
//随机数0~10
int r = new Random().nextInt(10);
//判断>=7 创建一个大敌机对象
if(r>=7) {
f=new BigAirplane();
}else if(r<7&&r>=2) {//判断小于7 大于等于4 创建一个小敌机
f=new Airplane();
}else {// 否则创建小蜜蜂
f=new Bee();
}
//将飞行物数组扩容加一
fly=Arrays.copyOf(fly, fly.length+1);
//将创建的对象添加到数组中
fly[fly.length-1]=f;
}
}
//创建子弹方法
int indexshoot=0;
public void createBullet() {
indexshoot++;
if(indexshoot%30==0) { //300毫秒创建一次子弹
//调用英雄机创建子弹的方法
Bullet[] b = hero.createBullet();
//扩容数组
bullet = Arrays.copyOf(bullet, bullet.length+b.length);
//将创建的子弹数组复制到总数组末尾
//复制的数组 复制的起始下标 粘贴的数组 粘贴起始下标 粘贴的长度
System.arraycopy(b, 0, bullet, bullet.length-b.length, b.length);
}
}
//删除 数组中越界的子弹或飞行物 删除死亡的飞行物和子弹
public void outFount() {
//创建一个新数组
Bullet[] bs=new Bullet[0];
int index=0;
//循环子弹数组 判断每个子弹对象是否越界
for (int i = 0; i < bullet.length; i++) {
if(bullet[i].y>=-bullet[i].height&&bullet[i].isLife()) {
//如果子弹没有越界并且是存活状态
//将新数组扩容1
bs=Arrays.copyOf(bs, bs.length+1);
// 将当前这个子弹对象添加到新数组中
bs[index]=bullet[i];
//新数组下标加1
index++;
}
}
//将新数组(子弹对象都是没有越界) 赋值给 子弹数组
bullet=bs;
//删除越界飞行物
int index1=0;
FlyingObject[] f=new FlyingObject[0];
for (int i = 0; i < fly.length; i++) {
if(fly[i].y<World.HEIGHT&&fly[i].isLife()) {
//飞行物没有越界 并且是存活状态
f=Arrays.copyOf(f, f.length+1);
f[index1]=fly[i];
index1++;
}
}
fly=f;//将没有越界的飞行物对象数组赋值给原飞行物数组
}
//子弹碰撞飞行物
public void shootBoom() {
for (int i = 0; i < bullet.length; i++) {
for (int j = 0; j < fly.length; j++) {
if(bullet[i].hit(fly[j])) {//调用子弹碰撞逻辑
//删除子弹
bullet[i].goDEAD();//改变状态为死亡
//删除飞行物
fly[j].goDEAD();
};
}
}
}
//对象移动方法
public void moveAction() {
sky.move();
for (int i = 0; i < fly.length; i++) {
fly[i].move();
}
//子弹移动
for (int b = 0; b < bullet.length; b++) {
bullet[b].move();
}
}
//画图方法
public void paint(Graphics g) {
sky.panitObject(g);
hero.panitObject(g);
//循环遍历飞行物中的每个对象调用每个对象的画图方法
for (int i = 0; i < fly.length; i++) {
fly[i].panitObject(g);
}
System.out.println(bullet.length);
for (int i = 0; i < bullet.length; i++) {
bullet[i].panitObject(g);
}
}
//启动方法
public void action() {
System.out.println("程序启动");
MouseAdapter l=new MouseAdapter() {
public void mouseMoved(MouseEvent e){
int x=e.getX();//鼠标的x坐标
int y=e.getY();
hero.moveTo(x, y);//将鼠标的坐标传递给英雄机
}
};
//添加监听对象
this.addMouseListener(l);//添加鼠标对象
this.addMouseMotionListener(l);//监听鼠标对象移动
//定时器 开始时间为10毫秒没10毫秒运行一次
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
//执行逻辑 重复执行
outFount();//删除越界的飞行物
createBullet();//创建子弹
createFly();//创建飞行物对象
moveAction();//移动飞行物
shootBoom();
repaint();//调用画图方法
}
}, 10, 10);
}
public static void main(String[] args) {
//画窗口
JFrame j=new JFrame();
World world = new World();
j.add(world);//将需要运行的类添加到窗口中
//设置窗口的大小
j.setSize(400,700);
//设置窗口的可见性
j.setVisible(true);
//设置窗口关闭的同时程序退出
j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
j.setLocationRelativeTo(null);
//最后启动
world.action();
}
}