?? mainpanel.java
字號:
package com.zk;
import java.awt.*;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.MediaTracker;
import javax.swing.*;
import java.awt.event.*;
/*import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;*/
import java.util.EventListener;
import java.util.Vector;
import com.zk.*;
public class MainPanel extends JPanel implements Runnable,MouseMotionListener,MouseListener{
Game a;
Vector BBv=new Vector();//子彈數組
Vector EEv=new Vector();//敵機數組
Vector BOMBv=new Vector();//爆炸數組
Vector EBv=new Vector();//敵機子彈數組
Vector DBv=new Vector();//大爆數組
int E_num;
int E_max;//敵機最大數
int E_vel;//敵機速度
int E_mov;//敵機橫移機率
int E_hit;//敵機開火機率
int Sum;//擊墜數
int hero_hp;//hero生命
Image back=null;
Image hero=null;
Image hero_l=null;
Image hero_r=null;
Image fire=null;
Image fire_l=null;
Image el_0=null;
Image el_0_l=null;
Image el_0_r=null;
Image el_bb=null;
Image el_bb_0=null;
Image bomb_0=null;
Image bomb_1=null;
Image bomb_2=null;
Image bomb_3=null;
Image db_1=null;
Image db_2=null; //大爆的圖片
MediaTracker tracker=null;//媒體跟蹤器,用來監測圖像的裝載
Thread Game_star;
int y;//背景滾動變量
int hero_oldx,hero_oldy;//hero的舊x,y坐標
int hero_x,hero_y;//hero的新x,y坐標
int seq;//hero的動畫變量
// int dir;//hero的左右方向變量
boolean isfire;//hero開火
boolean isblast;//是否發爆
int BBx,BBy;
int DBx,DBy; //大爆的橫縱坐標
int blastnum; //大爆的數量
boolean blastc; //控制大爆
Font f=new Font("黑體",Font.BOLD,30);
Font ff=new Font("黑體",Font.BOLD,90);
Font S=new Font("幼圓",Font.BOLD,15);
Font SS=new Font("幼圓",Font.BOLD,25);
MainPanel(Game a) {
this.a=a;
tracker=new MediaTracker(this);
back=Toolkit.getDefaultToolkit().getImage(MainPanel.class.getResource("back3.gif"));
tracker.addImage(back,0);
hero=Toolkit.getDefaultToolkit().getImage(MainPanel.class.getResource("hero.gif"));
tracker.addImage(hero,1);
fire=Toolkit.getDefaultToolkit().getImage(MainPanel.class.getResource("herozidan.gif"));
tracker.addImage(fire,2);
fire_l=Toolkit.getDefaultToolkit().getImage(MainPanel.class.getResource("herozidan2.gif"));
tracker.addImage(fire_l,3);
el_0=Toolkit.getDefaultToolkit().getImage(MainPanel.class.getResource("diji.gif"));
tracker.addImage(el_0,4);
el_0_l=Toolkit.getDefaultToolkit().getImage(MainPanel.class.getResource("dijileft.gif"));
tracker.addImage(el_0_l,5);
el_0_r=Toolkit.getDefaultToolkit().getImage(MainPanel.class.getResource("dijiright.gif"));
tracker.addImage(el_0_r,6);
el_bb=Toolkit.getDefaultToolkit().getImage(MainPanel.class.getResource("dijizidan.gif"));
tracker.addImage(el_bb,7);
el_bb_0=Toolkit.getDefaultToolkit().getImage(MainPanel.class.getResource("el_bb_0.gif"));
tracker.addImage(el_bb_0,8);
bomb_0=Toolkit.getDefaultToolkit().getImage(MainPanel.class.getResource("bomb_0.gif"));
tracker.addImage(bomb_0,9);
bomb_1=Toolkit.getDefaultToolkit().getImage(MainPanel.class.getResource("bomb_1.gif"));
tracker.addImage(bomb_1,10);
bomb_2=Toolkit.getDefaultToolkit().getImage(MainPanel.class.getResource("bomb_2.gif"));
tracker.addImage(bomb_2,11);
bomb_3=Toolkit.getDefaultToolkit().getImage(MainPanel.class.getResource("bomb_3.gif"));
tracker.addImage(bomb_3,12);
db_1=Toolkit.getDefaultToolkit().getImage(MainPanel.class.getResource("db1.gif"));
tracker.addImage(db_1,13);
db_2=Toolkit.getDefaultToolkit().getImage(MainPanel.class.getResource("db2.gif"));
tracker.addImage(db_2,14);//將大爆的圖片加到媒體跟蹤器中
this.addMouseMotionListener(this);
this.addMouseListener(this);
Game_star=new Thread(this);
y=-(5*a.y);
hero_x=a.x/2-50;
hero_y=a.y-150;
hero_oldx=hero_x;
hero_oldy=hero_y;
hero_hp=-1;
seq=0;
// dir=0;
Sum=0;
E_num=0;
E_max=9;
E_vel=7;
E_mov=90;
E_hit=97;
isfire=false;
isblast=false;
blastnum=0;
blastc=false;
}
public void paint(Graphics g){
g.drawImage(back,0,y,a.x,a.y*6,this);
g.setColor(Color.RED);
g.setFont(S);
g.drawString("導彈:"+blastnum,a.x-400,25);//繪制大爆的數量
g.drawString("生",a.x-23,40);
g.drawString("命",a.x-23,55);
g.fillRect(a.x-20,65,10,hero_hp);
g.setColor(Color.BLACK);
g.drawRect(a.x-20,64,10,300);
if(seq==0){
g.setColor(Color.RED);
}
if(seq==1){
g.setColor(Color.BLACK);
}
g.setFont(S);
g.drawString("積分:",a.x-80,25);
g.drawString(String.valueOf(Sum),a.x-40,25);
g.setFont(f);
if(hero_hp==-1){
g.setFont(f);
g.setColor(Color.RED);
g.drawString("你能超過1000分嗎?",a.x/2-a.x/3,a.y/2-a.y/16);
g.setFont(SS);
g.setColor(Color.RED);
g.drawString("請按下鼠標鍵開始",a.x/2-a.x/4,a.y/2+a.y/8);
g.dispose();
try{
Thread.sleep(50);
}catch(Exception e){
}
this.Game_star=null;
}
//如果游戲結束顯示如下信息
else if(hero_hp<0){
g.setFont(ff);
g.setColor(Color.RED);
g.drawString("GAME", a.x / 2 - a.x / 4, a.y / 2 - a.y / 16);
g.drawString("OVER", a.x / 2 - a.x / 4, a.y / 2 + a.y / 16);
g.setFont(SS);
g.setColor(Color.BLACK);
g.drawString("請按下鼠標鍵重來", a.x / 2 - a.x / 4, a.y / 2 + a.y / 8);
g.dispose();
try {
Thread.sleep(50);
}
catch (Exception e) {
}
this.Game_star=null;
}
//顯示信息
if(Math.abs(y)>(a.y)*5-50){
g.drawString("本游戲即將開始",a.x/2-a.x/4,a.y/2-a.y/8);
}
if(Math.abs(y)>(a.y)*4 && Math.abs(y)<(a.y)*4+150){
E_max=13;
E_vel=7;
E_mov=90;
E_hit=95;
g.drawString("第一關即將開始",a.x/2-a.x/4,a.y/2-a.y/8);
}
if(Math.abs(y)>(a.y)*3 && Math.abs(y)<(a.y)*3+150){
E_max=16;
E_vel=9;
E_mov=90;
E_hit=93;
g.drawString("第二關即將開始",a.x/2-a.x/4,a.y/2-a.y/8);
}
if(Math.abs(y)>(a.y)*2 && Math.abs(y)<(a.y)*2+150){
E_max=29;
E_vel=11;
E_mov=90;
E_hit=91;
g.drawString("第三關即將開始",a.x/2-a.x/4,a.y/2-a.y/8);
}
if(Math.abs(y)>(a.y) && Math.abs(y)<(a.y)+150){
E_max=32;
E_vel=13;
E_mov=90;
E_hit=89;
g.drawString("最后了祝你好運",a.x/2-a.x/4,a.y/2-a.y/8);
}
if(y==0){
E_max=40;
E_vel=18;
E_mov=90;
E_hit=86;
g.drawString("向上帝祈禱吧!",a.x/2-a.x/4,a.y/2-a.y/8);
}
//處理敵機子彈s
for(int i=0;i<EBv.size();i++){
EnemyBullet ebs;
ebs=(EnemyBullet)EBv.elementAt(i);
if(ebs.y>-50){
if(ebs.cont<6){
g.drawImage(el_bb,ebs.x,ebs.y,13,20,this);
}
if(ebs.cont>=6){
g.drawImage(el_bb_0,ebs.x,ebs.y,13,15,this);
}
}
}
//處理子彈s
for(int i=0;i<BBv.size();i++){
PlayerBullet bs;
bs=(PlayerBullet)BBv.elementAt(i);
if(bs.y>-50){
if(bs.cont<3){
g.drawImage(fire_l,bs.x,bs.y,30,30,this);
}
if(bs.cont>=3){
g.drawImage(fire,bs.x,bs.y,30,30,this);
}
}
}
//處理大爆
for(int i=0;i<DBv.size();i++){
Blast blast;
blast=(Blast)DBv.elementAt(i);
if(blast.islive){
if(blast.cont<10){
//System.out.println(""+blast.x+" "+blast.y);
g.drawImage(db_1,blast.x,blast.y,200,200,this);
}
if(blast.cont>10 && blast.cont<20){
g.drawImage(db_2,blast.x,blast.y,200,200,this);
}
}else{
DBv.remove(i);
}
}
//處理爆炸s
for(int i=0;i<BOMBv.size();i++){
Bomb bombs;
bombs=(Bomb)BOMBv.elementAt(i);
if(bombs.islive){
if(bombs.cont<10){
g.drawImage(bomb_0,bombs.x,bombs.y,50,50,this);
}
if(bombs.cont>10 && bombs.cont<20){
g.drawImage(bomb_1,bombs.x,bombs.y,50,50,this);
}
if(bombs.cont>20 && bombs.cont<40){
g.drawImage(bomb_2,bombs.x,bombs.y,50,50,this);
}
if(bombs.cont>40){
g.drawImage(bomb_3,bombs.x,bombs.y,50,50,this);
}
}else{
BOMBv.remove(i);
}
}
//處理敵機s
for(int i=0;i<EEv.size();i++){
Enemy es;
es=(Enemy)EEv.elementAt(i);
if(es.y<(a.y-50)){
if(es.islive && !es.toleft && !es.toright){
g.drawImage(el_0,es.x,es.y,45,45,this);
}else if(es.toleft){
g.drawImage(el_0_l,es.x,es.y,50,50,this);
}else if(es.toright){
g.drawImage(el_0_r,es.x,es.y,50,50,this);
}
}else{
es.islive=false;
}
}
//處理hero
g.clipRect(hero_x,hero_y,70,70);
g.drawImage(hero,(hero_x-seq*1),hero_y,46,53,this);
}
public void run(){
int cont=0;
while(tracker.checkAll(true)==false){
try{
Thread.sleep(300);
}
catch(Exception e){
}
}
while(Game_star!=null){
//處理敵機s是否撞擊hero
if(EEv.size()==0){
E_num=0;
}//清空敵機數組
if(cont!=0){
//移動條件下增加難度
if(E_num<=E_max){//滿足條件則增加敵機
Enemy es;
es=new Enemy((int)(Math.random()*(a.x-50)),E_vel,E_mov,E_hit);
EEv.addElement(es);
E_num++;
}
for(int i=0;i<EEv.size();i++){
Enemy es;
es=(Enemy)EEv.elementAt(i);
if(es.y<(a.y-50) && es.islive){
es.hit(hero_x,hero_y);//監測碰撞
if(!es.islive){
Bomb bombs;
bombs=new Bomb(es.x,es.y);
BOMBv.addElement(bombs);
//System.out.println("YOU LOST");
hero_hp-=10;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -