续『java编程(射击游戏)』 2008-05-19 20:25
//停止运行函数
public vid stop(){
if(game!=null){
game.stop();
game=null; //如果线程正在运行,强行令其停止
}
//重新设置光标形状
getFrame(this).setCursor(Frame.DEFAULT_CURSOR);
}
//游戏主线程的执行函数
public void run(){
//定义本地变量和对象
PLANE P;
Explosion E;
long count=0;
long ti=0;
//等待图片装载完毕
Graphics g=getGraphics();
g.setColor(Color.red);
g.drawString("Starting Game...",20,20);
while(tracker.checkAll(true)==false){
if((ti++%2)==0){
g.setColor(Color.red);
}else{
g.setColor(Color.green);
}
g.drawString("*",10,22);
try{
thread.sleep(50);
}catch(InterruptedException e){
}
//装载超时时强行退出
if(ti>1000){
break;
}
}
//捕捉获取图片时的错误信息
if(tracker.isErrorAny()){
showStatus("Error getting images");
return;
}
showStatus("Loading completed");
g.dispose();
//绘制背景的缓冲区
buf_g=backdrop.getGraphics();
buf_g.drawImage(backimg,0,0,window_size.width,window_size.height,this);
//将背景的缓冲区绘制到屏幕上
buf_g=getGraphics();
buf_g.drawImage(backdrop,0,0,this);
repaint(); //重新绘制
display_score(); //显示玩家得的分数
L.draw(); //绘制导弹发射架
showStatus(PLANE ATTACK);
//事件循环
for(;;){
ti=System.currentTimeMillis();
//如果有多余的PLANE飞行空间的话可以增加一架PLANE
if((Pv.size()<NP)&&(Math.random()>(Pv.size()=0?0.90:0.98))){
newPlane.play(); //播放警报声
P=new plane(this);
P.set_Color(PlaneColor);
//在相应的条件下提高PLANE的下降速度
if(score>10&&Math.random()>0.7){
P.vy-=1;
//在PLANE向量中加一名成员
Pv.addElement(P);
}
}
//在背景上绘制爆炸画面,结束后将其删除
for(int j=Ev.size()-1;j>=0;j++){
E=(Explosion)Ev.elementAt(j);
if(E.active){
E.draw();
}//如果爆炸出现就进行其画面的控制
else{
//从结束后从背景上删除,并从爆炸向量中删除
E.erase();
Ev.removeElementAt(j);
}
}
//移动导弹的发射架
L.move();
//如果导弹存在,移动导弹
if(M.achive()==true){
M.move;
}
//移动每个PLANE
for(int i=0;i<Pv.size();++i){
Pv=(PLANE)Pv.elementAt(i);
if(Pv.active()&&M.active()&&collision(M)){
++score; //增加玩家的得分
explosion.stop();
display_score();
explosion.play();
if((NP<5)&&(score%10)==1){
//每击落10架PLANE便增加PLANE最大出现数目,直到数目为5
++NP;
}
//碰撞发生后,将导弹从背景上清除,并使其active属性为false
M.active(false);
M.erase();
//将被击中的PLANE从背景上清除,并使其属性为false
P.active(false);
P.erase();
//显示爆炸场面
E=new Explosion(this,P.px,P.py);
//在爆炸向量中添加一员
Ev.addElement(E);
}
//如果PLANE没有被击中,则显示出来,否则,将其从PLANE向量中删除
if(P.active()){
P.draw();
}else{
Pv.removeElementAt(i);
}
//如果有一个PLANE成功着陆,则玩家失败
if((P.py-P.h/2)<=0){
game_over=true;
display_game_over();
return;
}
}
//如果导弹发射架移动了,重画发射架
if(L.has_moved()||((M.py-M.h)<(L.py+L.h))||(!M.active())){
L.draw();
}
//如果导弹的active属性值为true,则重画导弹
if(M.active()==true){
M.draw();
}
//万一CPU速度太快,要循环维持在20ms以上
ti=System.currentTimeMillis()-ti;
ti=20-ti;
ti=ti>0?10+ti:10;
Thread.yield();
//处理线程sleep函数的异常
try{
Thread.sleep();
}catch(InterruptedException e){
}
//每100次循环重新绘制一次
if((count=++count%500)==0){
repaint();
}
}
}(续载)