/*******************
Javaシューティングへの道
背景を動かす
Jikiクラスを追加
Tamaクラスを追加
Tamaオブジェクトを配列にする
Enemy追加
Enemy_Controller追加
当たり判定追加
Enemy２追加
*******************/

//パッケージのインポート
import java.awt.*;
import java.awt.event.*;
////////////////////////////////////////////////////////
//////////////////////MyFrameクラス/////////////////////
////////////////////////////////////////////////////////
class MyFrame extends Frame implements Runnable,KeyListener{
	
	//背景画像用Image変数
	Image back;
	//ダブルバッファリング用
	Image img;
	Graphics ura;
	//背景画像座標
	int x=0;
	
	//Thread変数
	Thread th;
	
	//Jikiオブジェクト生成
	//Jiki jiki = new Jiki(0,150);
	//Jiki jiki2 = new Jiki(-20,120);
	//Jiki jiki3 = new Jiki(-20,180);
	Jiki[] jiki = new Jiki[7];
	//Tamaオブジェクト用配列生成(とりあえず20)
	//Tama[] tama = new Tama[20];
	
	//Enemyオブジェクト用配列生成（とりあえず10）
	Enemy[] enemy = new Enemy[10];
	
	//Enemyオブジェクト用配列生成（とりあえず5）
	Enemy2[] enemy2 = new Enemy2[5];
	
	//Itemオブジェクト
	Item item = new Item();
	
	//Enemy_Controllerオブジェクト生成
	//Enemyの管理は全て任せる
	Enemy_Controller ec = new Enemy_Controller(enemy.length,enemy2.length); 
	
//コンストラクタ///////////////////////////
	MyFrame(String name){
		//スーパークラスのコンストラクタを呼び出す
		super(name);
		//Imageの取得と初期化
		Toolkit tk = Toolkit.getDefaultToolkit();
		back = tk.getImage("PIC/img1.jpg");
		
		//jikiオブジェクト生成
		for(int i=0;i<jiki.length;i++){
			if(i%2==0){
				jiki[i] = new Jiki(-20*((i+1)/2),150+(30*(i/2)));
			}else if(i%2!=0){
				jiki[i] = new Jiki(-20*((i+1)/2),150-(30*((i+1)/2)));
			}
		}
		//自機0だけaliveをtrueに
		jiki[0].alive=true;
		//Enemyオブジェクトを生成
		for(int i=0;i<enemy.length;i++){
			enemy[i]=new Enemy();
		}
		//Enemy2オブジェクトを生成
		for(int i=0;i<enemy2.length;i++){
			enemy2[i]=new Enemy2();
		}
		
		//Enemy_Controllerに管理するEnemyオブジェクトを渡す
		ec.set(enemy);
		//Enemy_Controllerに管理するEnemy2オブジェクトを渡す
		ec.set(enemy2);
		//Itemオブジェクトを渡す
		ec.set(item);
		
		//KeyListenerへ登録
		addKeyListener(this);
		
		//Frame諸設定
		setSize(450,450);
		setLocation(300,200);
		
		//Frame表示
		setVisible(true);
		//スレッドスタート
		start();
	}
	//startメソッド
	public void start(){
		if(th==null){
			th = new Thread(this);
			th.start();
		}
	}
	//stopメソッド
	public void stop(){
		if(th!=null){
			th.stop();
			th = null;
		}
	}
	//paintメソッド
	public void paint(Graphics g){
		//ダブルバッファ用img,uraを初期化
		if(img == null){
			img = createImage(450,450);
			ura = img.getGraphics();
		}
		//uraバッファへ背景画像の表示
		ura.drawImage(back,x,0,450,450,this);
		ura.drawImage(back,x+450,0,450,450,this);
		
		//jikiを表示
			if(jiki[0].weapon==3 || jiki[0].weapon==5 || jiki[0].weapon==4){
				if(jiki[0].getState()){
					for(int i=0;i<jiki.length;i++){
						if(jiki[i].getState()){
							ura.setColor(Color.red);
							ura.fillOval(jiki[i].x,jiki[i].y,30,30);
						}
					}
				}
			}else{
				if(jiki[0].getState()){
					ura.setColor(Color.red);
					ura.fillOval(jiki[0].x,jiki[0].y,30,30);
				}
			}

		//tamaの表示
		for(int j=0;j<jiki.length;j++){
			for(int i=0;i<jiki[j].tama.length;i++){
				if(jiki[j].tama[i].getState() && jiki[j].getState()){
					if(jiki[j].weapon==0 || jiki[j].weapon==3){
						jiki[j].tama[i].sizex=5;
						jiki[j].tama[i].sizey=2;
						ura.setColor(Color.yellow);
						ura.fillRect(jiki[j].tama[i].x,jiki[j].tama[i].y[0],jiki[j].tama[i].sizex,jiki[j].tama[i].sizey);
					}else if(jiki[j].weapon==1 || jiki[j].weapon==5 ){
						
						jiki[j].tama[i].sizex=6;
						jiki[j].tama[i].sizey=4;
						ura.setColor(Color.yellow);
						ura.fillRect(jiki[j].tama[i].x,jiki[j].tama[i].y[0],jiki[j].tama[i].sizex,jiki[j].tama[i].sizey);
						ura.setColor(Color.yellow);
						ura.fillRect(jiki[j].tama[i].x,jiki[j].tama[i].y[1],jiki[j].tama[i].sizex,jiki[j].tama[i].sizey);
						ura.setColor(Color.yellow);
						ura.fillRect(jiki[j].tama[i].x,jiki[j].tama[i].y[2],jiki[j].tama[i].sizex,jiki[j].tama[i].sizey);
					}else {
						jiki[j].tama[i].sizex=15;
						jiki[j].tama[i].sizey=10;
						ura.setColor(Color.yellow);
						ura.fillRect(jiki[j].tama[i].x,jiki[j].tama[i].y[0],jiki[j].tama[i].sizex,jiki[j].tama[i].sizey);
					}
					
				}
			}
		}
		/*
			for(int i=0;i<jiki[0].tama.length;i++){
				if(jiki[0].tama[i].getState()){
					if(jiki[0].weapon==0){
						jiki[0].tama[i].sizex=5;
						jiki[0].tama[i].sizey=2;
						ura.setColor(Color.yellow);
						ura.fillRect(jiki[0].tama[i].x,jiki[0].tama[i].y[0],jiki[0].tama[i].sizex,jiki[0].tama[i].sizey);
					}else if(jiki[0].weapon==1){
						
						jiki[0].tama[i].sizex=6;
						jiki[0].tama[i].sizey=4;
						ura.setColor(Color.yellow);
						ura.fillRect(jiki[0].tama[i].x,jiki[0].tama[i].y[0],jiki[0].tama[i].sizex,jiki[0].tama[i].sizey);
						ura.setColor(Color.yellow);
						ura.fillRect(jiki[0].tama[i].x,jiki[0].tama[i].y[1],jiki[0].tama[i].sizex,jiki[0].tama[i].sizey);
						ura.setColor(Color.yellow);
						ura.fillRect(jiki[0].tama[i].x,jiki[0].tama[i].y[2],jiki[0].tama[i].sizex,jiki[0].tama[i].sizey);
					}else if(jiki[0].weapon==3){
						for(int j=0;j<jiki.length;j++){
							jiki[j].tama[i].sizex=5;
							jiki[j].tama[i].sizey=2;
							ura.setColor(Color.yellow);
							ura.fillRect(jiki[j].tama[i].x,jiki[j].tama[i].y[0],jiki[j].tama[i].sizex,jiki[j].tama[i].sizey);
						}
					}else {
						jiki[0].tama[i].sizex=15;
						jiki[0].tama[i].sizey=10;
						ura.setColor(Color.yellow);
						ura.fillRect(jiki[0].tama[i].x,jiki[0].tama[i].y[0],jiki[0].tama[i].sizex,jiki[0].tama[i].sizey);
					}
					
				}
			}
		*/
		//enemyの表示
		for(int i=0;i<enemy.length;i++){
			if(enemy[i].getState()){
				ura.setColor(Color.blue);
				ura.fillOval(enemy[i].x,enemy[i].y,25,25);
			}
		}
		//Itemの表示
		if(item.getState()){
			ura.setColor(Color.cyan);
			ura.fillOval(item.X,item.Y,20,20);
		}
		
		//enemy2の表示
		for(int i=0;i<enemy2.length;i++){
			if(enemy2[i].getState()){
				if(enemy2[i].life==2){
					ura.setColor(Color.green);
				}else if(enemy2[i].life==1){
					ura.setColor(Color.white);
				}
				ura.fillRect(enemy2[i].x,enemy2[i].y,25,25);
			}
		}
		
		//描画
		g.drawImage(img,0,0,this);
	}
	//updateメソッドオーバーライド
	public void update(Graphics g){
		paint(g);
	}
	
	//AllEnd
	
	public void end(){
		for(int i=0;i<jiki.length;i++){
			jiki[i].kill();
		}
	}
	//スレッド処理
	public void run(){
		for(;;){
			try{
				//30ミリ秒スリープ
				th.sleep(30);
			}catch(InterruptedException e){}
			
			//xが-450になったらxを戻す
			if(x==-450){
				x=0;
			}
			x=x-2;;
			
			//tamaオブジェクトの移動処理
			for(int j=0;j<jiki.length;j++){
				for(int i=0;i<jiki[j].tama.length;i++){
					if(jiki[j].weapon==1 || jiki[j].weapon==5){
						jiki[j].tama[i].x+=2;
						jiki[j].tama[i].y[1]+=2;
						jiki[j].tama[i].y[2]-=2;
					}else{
						jiki[j].tama[i].x+=2;
					}
					//jiki.tamaとenemyの当たり判定
					for(int k=0;k<enemy.length;k++){
						if(enemy[k].getState() && jiki[j].tama[i].getState()){
							if(jiki[j].tama[i].Hit(enemy[k].x,enemy[k].y)){
								jiki[j].tama[i].kill();
								enemy[k].kill();
								break;
							}
						}
					}
					//jiki.tamaとenemy2の当たり判定
					for(int k=0;k<enemy2.length;k++){
						if(enemy2[k].getState() && jiki[j].tama[i].getState()){
							if(jiki[j].tama[i].Hit(enemy2[k].x,enemy2[k].y)){
								jiki[j].tama[i].kill();
								enemy2[k].kill(1);
							}
						}
					}
					//Frameの端まで移動したらkill
					//for(int j=0;j<jiki.length;j++){	
						if(jiki[j].tama[i].x>450){
							jiki[j].tama[i].kill();
						}
					//}
				}
			}
			//Enemyオブジェクトの移動処理
				for(int i=0;i<enemy.length;i++){
					enemy[i].x-=enemy[i].v;
					//enemyとjikiの当たり判定
					for(int j=0;j<jiki.length;j++){
						if(enemy[i].Hit(jiki[j].x,jiki[j].y) && jiki[j].getState() && enemy[i].getState()){
								enemy[i].kill();
								jiki[j].kill();
								if(j==0)end();
						}
					}
					//Frameの端まで移動したらkill
					if(enemy[i].x<-30){
						enemy[i].kill();
					}
				}
			
			//Enemy2オブジェクトの移動処理
				for(int i=0;i<enemy2.length;i++){
					enemy2[i].x-=enemy2[i].v;
					//enemy2とjikiの当たり判定
					for(int j=0;j<jiki.length;j++){
						if(enemy2[i].Hit(jiki[j].x,jiki[j].y) && jiki[j].getState() && enemy2[i].getState()){
							enemy2[i].kill(2);
							jiki[j].kill();
							if(j==0)end();
						}
					}
					//Frameの端まで移動したらkill
					if(enemy2[i].x<-30){
						enemy2[i].kill(2);
					}
				}
			
			//Itemオブジェクトの移動処理
			item.X-=item.v;
				//enemyとjikiの当たり判定
					if(item.Hit(jiki[0].x,jiki[0].y) && jiki[0].getState() && item.getState()){
							
							for(int i=0;i<jiki.length;i++){
								jiki[i].setWeapon(item.Weapon());
							}
							if(item.Weapon()==3 || item.Weapon()==5){
								for(int i=1;i<3;i++){
									jiki[i].alive=true;
								}
							}else if(item.Weapon()==4){
								for(int i=1;i<jiki.length;i++){
									jiki[i].alive=true;
								}
							}else{
								for(int i=1;i<jiki.length;i++){
									jiki[i].kill();
								}
							}
							item.kill();
					}
				
					//Frameの端まで移動したらkill
				if(item.X<-30){
					item.kill();
				}
			
			
	
			//再描画
			repaint();
		}
	
	}
	
	//KeyListenerのメソッドオーバーライド
	public void keyPressed(KeyEvent e){
		//自機のaliveがtrueならば
		for(int j=0;j<jiki.length;j++){
			
				//上下左右の移動
					if(e.getKeyCode()==37){
						jiki[j].x-=3;
					}else if(e.getKeyCode()==39){
						jiki[j].x+=3;
					}else if(e.getKeyCode()==38){
						jiki[j].y-=3;
					}else if(e.getKeyCode()==40){
						jiki[j].y+=3;
					}
				//スペースボタン：弾発射
					else if(e.getKeyCode()==32){
	
						if(jiki[j].getState()){
							for(int i=0;i<jiki[j].tama.length;i++){
								if(!jiki[j].tama[i].getState()){
									jiki[j].tama[i].Shoot(jiki[j].x+30,jiki[j].y+15);
									break;
								}
							}
						}
					}
		
		}
	}
	public void keyReleased(KeyEvent e){}
	public void keyTyped(KeyEvent e){}
	
	
}
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////




////////////////////////////////////////////////////////
///////////////////////自機クラス///////////////////////
////////////////////////////////////////////////////////
class Jiki{
	//jikiオブジェクトの位置座標
	int x,y;
	//表示するかしないかのフラグ
	boolean alive=false;
	//Tamaオブジェクト用配列生成(とりあえず20)
	Tama[] tama = new Tama[50];
	//武器タイプ
	int weapon=0;

	//コンストラクタ
	Jiki(int a,int b){
		x=a;
		y=b;
		//alive=true;
		//Tamaオブジェクトを生成
		for(int i=0;i<tama.length;i++){
			tama[i]=new Tama();
		}
		
	}
	//状態を返すメソッド
	public boolean getState(){
		return alive;
	}
	//自機消滅メソッド
	public void kill(){
		alive=false;
	}
	
	//weponセット
	public void setWeapon(int w){
		weapon=w;
	}
}
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////



////////////////////////////////////////////////////////
///////////////////////弾クラス///////////////////////
////////////////////////////////////////////////////////
class Tama{
	//Tamaオブジェクトの位置座標
	int x;
	int[] y = new int[3];
	int sizex=5,sizey=2;
	//表示するかしないかのフラグ
	boolean alive=false;
	
	//発射メソッド
	public void Shoot(int a,int b){
		//表示フラグをtrueにする
		alive = true;
		//位置座標を指定されたa,bにする
		x=a;
		for(int i=0;i<y.length;i++){
			y[i]=b;
		}
	}
	//状態を返すメソッド
	public boolean getState(){
		return alive;
	}
	//弾消滅メソッド
	public void kill(){
		alive = false;
	}
	//当たり判定メソッド
	public boolean Hit(int ex,int ey){
		if(ex<x+sizex && x+sizex<ex+25 && ey<y[0]+sizey && y[0]+sizey<ey+25){
			return true;
		}else if(ex<x+sizex && x+sizex<ex+25 && ey<y[1]+sizey && y[1]+sizey<ey+25){
			return true;
		}else if(ex<x+sizex && x+sizex<ex+25 && ey<y[2]+sizey && y[2]+sizey<ey+25){
			return true;
		}else{
			return false;
		}
	}
}
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////




////////////////////////////////////////////////////////
///////////////////////敵クラス///////////////////////
////////////////////////////////////////////////////////
class Enemy{
	//Enemyオブジェクトの位置座標
	int x,y;
	//速度
	int v;
	//表示するかしないかのフラグ
	boolean alive=false;
	
	//出現メソッド
	public void out(int a,int b){
		//表示フラグをtrueにする
		alive = true;
		//位置座標を指定されたa,bにする
		x=a;
		y=b;
		//速度をランダムに設定
		v = (int)(Math.random()*1000)%3+1;
	}
	//状態を返すメソッド
	public boolean getState(){
		return alive;
	}
	//敵消滅メソッド
	public void kill(){
		alive = false;
	}
	//当たり判定
	public boolean Hit(int jx,int jy){
		if(jx<x && x<jx+30 && jy<y && y<jy+30){
			return true;
		}else if(jx<x+25 && x+25<jx+30 && jy<y && y<jy+30){
			return true;
		}else if(jx<x && x<jx+30 && jy<y+25 && y+25<jy+30){
			return true;
		}else if(jx<x+25 && x+25<jx+30 && jy<y+25 && y+25<jy+30){
			return true;
		}else{
			return false;
		}
	}
}
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////



////////////////////////////////////////////////////////
///////////////////////敵2クラス///////////////////////
////////////////////////////////////////////////////////
class Enemy2 extends Enemy{
	//life
	int life=2;
	
	//敵消滅メソッド
	public void kill(int damage){
		life=life-damage;
		if(life<=0){
			alive = false;
			life=2;
		}
	}
}
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////

////////////////////////////////////////////////////////
//Itemクラス
////////////////////////////////////////////////////////
class Item {
	int X;
	int Y;
	int v;
	int weapon=0;
	//表示するかしないかのフラグ
	boolean alive=false;
	
	//出現メソッド
	public void out(int a,int b){
		//表示フラグをtrueにする
		alive = true;
		//位置座標を指定されたa,bにする
		X=a;
		Y=b;
		//速度をランダムに設定
		v = (int)(Math.random()*1000)%3+1;
		weapon = (int)(Math.random()*1000)%6;
		
	}
	
	public int Weapon(){
		return weapon;
	}
	
	//状態を返すメソッド
	public boolean getState(){
		return alive;
	}
	//敵消滅メソッド
	public void kill(){
		alive = false;
	}
	//当たり判定
	public boolean Hit(int jx,int jy){
		if(jx<X && X<jx+30 && jy<Y && Y<jy+30){
			return true;
		}else if(jx<X+25 && X+25<jx+30 && jy<Y && Y<jy+30){
			return true;
		}else if(jx<X && X<jx+30 && jy<Y+25 && Y+25<jy+30){
			return true;
		}else if(jx<X+25 && X+25<jx+30 && jy<Y+25 && Y+25<jy+30){
			return true;
		}else{
			return false;
		}
	}
	
}


////////////////////////////////////////////////////////
////////////////敵コントローラークラス//////////////////
////////////////////////////////////////////////////////
/*スレッドを継承
　ランダムにEnemyオブジェクトのaliveをtrueにする
*/
class Enemy_Controller extends Thread{
	//コントロールするEnemyオブジェクト用の配列
	//用意する数は分からないのでコンストラクタでもらう
	Enemy[] enemy;
	//コントロールするEnemy2オブジェクト用の配列
	//用意する数は分からないのでコンストラクタでもらう
	Enemy2[] enemy2;
	//Itemオブジェクト
	Item item;
	
	//出現確立ようの変数
	int rand;
	
	//コンストラクタ
	Enemy_Controller(int num,int num2){
		//num個だけenemy配列を用意
		enemy = new Enemy[num];
		//num2個だけenemy2配列を用意
		enemy2 = new Enemy2[num2];
		
		//配列を用意したらenemyオブジェクト生成
		for(int i=0;i<enemy.length;i++){
			enemy[i] = new Enemy();
		}
		//配列を用意したらenemy2オブジェクト生成
		for(int i=0;i<enemy2.length;i++){
			enemy2[i] = new Enemy2();
		}
		
		//スレッドスタート
		start();
	}
	
	//Enemyオブジェクトをセットするメソッド
	public void set(Enemy[] e){
		enemy = e;
	}
	//Enemy2オブジェクトをセットするメソッド
	public void set(Enemy2[] e2){
		enemy2 = e2;
	}
	//Itemオブジェクトをセットする
	public void set(Item i){
		item=i;
	}
	//runメソッド
	//ここでEnemyオブジェクトのaliveをtrueに
	public void run(){
		while(true){
			try{
				sleep(100);
			}catch(InterruptedException e){}
			//出現させる確立もランダムに
			rand = (int)(Math.random()*1000)%10;
			if(rand>8){
				output();
			}else if(rand>6){
				output2();
			}else if(rand<2){
				outputI();
			}
		}
	}
	
	//Enemy排出メソッド
	public void output(){
		for(int i=0;i<enemy.length;i++){
			if(!enemy[i].getState()){
				int y = (int)(Math.random()*10000)%450;
				enemy[i].out(450,y);
				break;
			}
		}
	}
	//Enemy2排出メソッド
	public void output2(){
		for(int i=0;i<enemy2.length;i++){
			if(!enemy2[i].getState()){
				int y = (int)(Math.random()*10000)%450;
				enemy2[i].out(450,y);
				break;
			}
		}
	}
	//Item排出メソッド
	public void outputI(){
		if(!item.getState()){	
			int y = (int)(Math.random()*10000)%450;
			item.out(450,y);
		}
	}
}
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////


////////////////////////////////////////////////////////
//////////////////////メインクラス////////////////////
////////////////////////////////////////////////////////
class shoot15{
	public static void main(String[] args){
		
		//MyFrame型のオブジェクトmfを生成
		MyFrame mf = new MyFrame("復習２");
	}
}
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
