- 论坛徽章:
- 0
|
我用JAVA写了个类似于“雷电”的Applet游戏程序,但是越玩越快啊,而且声音播放得很卡,我在游戏主类里只申请了一个新线程,图像得重绘和对象状态得转换及声音得播放都在此线程得run()里,我想问题可能出在这里。想问问大家怎么办?要代码交流得请QQ:284320105 (注明JAVA) 谢谢您得支持!!
麻烦各位解答一下咯,高手们~!!1
- import java.awt.*;
- import java.util.*;
- import java.applet.*;
- import java.awt.event.*;
-
- public class Airplane extends Applet //此为游戏主类
- implements Runnable,MouseListener,MouseMotionListener
- {
- int AppletWidth,AppletHeight,ImageWidth,ImageHeight,BackImageWidth,
- mouseX,mouseY,X,Y,X1,X2;
- int EnemyBulletSpriteNum=0,RocketSpriteNum=0,EnemyNum=0,BulletNum=0;
- Image scrollImage,scrollImage2,airplane,bullet,enemy,enemybullet,explosion,rocket,OffScreen;
- Random R;
- Thread newThread,musicThread;
- Graphics drawOffScreen;
- MediaTracker MT;
- AudioClip back,explose; //声音
- Thread EnemyBulletSpriteThread[],RocketSpriteThread[],
- EnemySpriteThread[], airplaneSpriteThread,BulletSpriteThread[];
-
-
- public void init()
- {
-
- addMouseListener(this); //注册事件处理方法
- addMouseMotionListener(this);
-
- back = getAudioClip(getDocumentBase(),"Audios/back.au");
- explose = getAudioClip(getDocumentBase(),"Audios/explose.wav");
- MT = new MediaTracker(this);
- R = new Random();
-
- AppletWidth = getSize().width;
- AppletHeight = getSize().height;
- EnemyBulletSpriteThread =new EnemyBulletSpriteThread[10];
- RocketSpriteThread =new RocketSpriteThread[10];
- EnemySpriteThread =new EnemySpriteThread[10];
- BulletSpriteThread =new BulletSpriteThread[50];
- //使用MediaTracker取得必要图像
-
- scrollImage = getImage(getDocumentBase(),"Images/newback.gif");
- airplane = getImage(getDocumentBase(),"Images/airplane.gif");
- bullet = getImage(getDocumentBase(),"Images/bullet.gif");
- enemy = getImage(getDocumentBase(),"Images/enemy.gif");
- enemybullet = getImage(getDocumentBase(),"Images/enemybullet.gif");
- rocket = getImage(getDocumentBase(),"Images/rocket.gif");
- explosion= getImage(getDocumentBase(),"Images/explosion.gif");
- MT.addImage(scrollImage,0);
- MT.addImage(airplane,0);
- MT.addImage(bullet,0);
- MT.addImage(enemy,0);
- MT.addImage(enemybullet,0);
- MT.addImage(rocket,0);
- MT.addImage(explosion,0);
- try
- {
- MT.waitForAll();
- }
- catch(InterruptedException E){ } //没有进行异常处理
-
- BackImageWidth = scrollImage.getWidth(this);
- ImageWidth = airplane.getWidth(this);
- ImageHeight = airplane.getHeight(this);
- scrollImage2 = createImage(scrollImage.getSource()); //复制滚动画面图像
- X1 = 0; //设定scrollImage起始位置
- X2 = BackImageWidth-1; //设定scrollImage2起始位置
-
- OffScreen = createImage(AppletWidth,AppletHeight); //建立次画面
- drawOffScreen = OffScreen.getGraphics();
- }
-
- class PlayMusicThread extends Thread //+++++++++++++++++
- {
- public void run()
- { /*if(musicThread != null)
- back.loop();*/
- }
- }
- public class ImageSpriteThread extends Thread //+++++++++++++++++图像SpriteThread类
- {
- Applet Game; //在绘制图像时会用到
- // Airplane parent; //+++++++++++++++++++++++
- int X,Y; //自身得X,Y,width,height
- int k=0; //碰撞图像记时
- boolean i=true; //碰撞标志
- int aimX,aimY,aimwidth,aimheight; //碰撞对象的X,Y,width,height
- boolean visible,active,collision;
- int width=90;
- int height=40;
- Image SpriteImage,ExplosionImage;
-
- public int getX()
- {
- return X;
- }
- public int getY()
- {
- return Y;
- }
- public void setLocation(int X,int Y)
- {
- this.X = X;
- this.Y = Y;
- }
- public int getWidth()
- {
- return width;
- }
- public int getHeight()
- {
- return height;
- }
- public void setSize(int width,int height)
- {
- this.width = width;
- this.height = height;
- }
- public void collision(int aimX,int aimY,int aimwidth,int aimheight) //碰撞检测
- {
-
- if((visible==true)&&(X+width>;=aimX)&&(Y+height>;=aimY)&&(aimX+aimwidth>;=X)&&(aimY+aimheight>;=Y))
- collision=true;
- else
- collision=false;
- }
- public void setCollision(boolean c) //置碰撞
- {
- collision=c;
- if(collision==true) //碰撞为真,置为不可见
- {
- setVisible(false);
- setMove(false);
- }
- }
- public boolean canVisible()
- {
- return visible;
- }
- public void setVisible(boolean v)
- {
- visible = v;
- }
- public boolean canMove()
- {
- return active;
- }
- public void setMove(boolean m)
- {
- active = m;
- }
- public ImageSpriteThread(Image SpriteImage,Image ExplosionImage,Applet Game)
- {
- this.SpriteImage = SpriteImage;
- this.Game = Game;
- this.ExplosionImage = ExplosionImage;
- setLocation(0,0); //设定起始位置
- setVisible(true); //可见
- setMove(true); //可移动
- start();
- }
- public void run()
- { paintSprite(drawOffScreen);
-
- try
- {
- while((visible == true)&&(collision==false))
- {
- synchronized(drawOffScreen)
- {
- paintSprite(drawOffScreen);
- try
- {
- Thread.sleep(33); //暂停33毫秒
- }
- catch(InterruptedException E){ }
-
- }
- }
- }catch(InterruptedException ex){}
- }
- public void paintSprite(Graphics g) //绘制SpriteThread
- {
-
- g.drawImage(SpriteImage,X,Y,Game);
- if((this.i==true)&&(collision==true))
- { g.drawImage(ExplosionImage,X+2,Y,Game);
- k++;
- if(k==6)
- this.i=false;
- }
- }
- }
- public class BulletSpriteThread extends ImageSpriteThread //++++++++++++++++子弹SpriteThread类
- {
- int AppletWidth,AppletHeight;
-
- public BulletSpriteThread(Image bullet,Image explosion,Applet Game,int AppletWidth,
- int AppletHeight)
- {
- super(bullet,explosion,Game); //调用父类的创建方法
-
- this.width=20;
- this.height=10;
- this.AppletWidth = AppletWidth;
- this.AppletHeight = AppletHeight;
- setVisible(false);
- setMove(false);
- start();
- }
-
- public void run()
- { paintSprite(drawOffScreen);
-
- try
- {
- while((visible == true)&&(collision==false))
- {
- if(active == true)
- {
- if(X >;AppletWidth) //当子弹穿过右边界时
- {
- setVisible(false); //设定子弹Sprite为不可见
- setMove(false); //设子弹Sprite为不可移动
- }
- else
- X = X+9; //前进速度
- }
- synchronized(drawOffScreen)
- {
- paintSprite(drawOffScreen);
- try
- {
- Thread.sleep(33); //暂停33毫秒
- }
- catch(InterruptedException E){ }
- }
- }
- }catch(InterruptedException ex){}
- }
-
- public void paintSprite(Graphics g) //绘制子弹Sprite
- {
- g.drawImage(SpriteImage,X,Y,Game);
-
- if((this.i==true)&&(collision==true))
- { g.drawImage(ExplosionImage,X+2,Y,Game);
- k++;
- if(k==6)
- this.i=false;
- }
- }
- }
- public class EnemyBulletSpriteThread extends ImageSpriteThread //++++++++++++++敌机子弹SpriteThread类
- {
- int AppletWidth,AppletHeight,seed,initialY,VY,mouseY;
- Random R;
- Thread s =new ImageSpriteThread();
- public EnemyBulletSpriteThread(Image bullet,Image explosion,Applet Game,int AppletWidth,
- int AppletHeight,Random R,int mouseY,ImageSpriteThread s)
- {
- super(bullet,explosion,Game); //调用父类的创建方法
- this.s=s;
- this.width=30;
- this.AppletWidth = AppletWidth;
- this.AppletHeight = AppletHeight;
- this.R=R;
- this.mouseY=mouseY;
- seed=AppletHeight;
- initialY=R.nextInt(seed);
- setLocation(AppletWidth,initialY); //初始位置
- start();
-
- }
-
- public void run()
- {
- paintSprite(drawOffScreen);
- try
- {
- while( (visible == true)&&(collision==false))
- {
- this.aimX=s.getX();
- this.aimY=s.getY();
- this.aimwidth=s.getWidth();
- this.aimheight=s.getHeight();
- if(s.canVisible()==true)
- {
- collision(aimX, aimY, aimwidth, aimheight);
- if(collision==true)
- {
- s.setCollision(true); //置被碰撞物collision为真
-
- setVisible(false);
- setMove(false);
- }
- }
- if(active == true)
- {
- if(X <0)
- {
- setVisible(false);
- setMove(false);
- }
- else
- X = X - 1;
- if(Y+25>;mouseY) //追踪战机
- VY=-1;
- else if(Y+25<mouseY)
- VY=1;
- else
- VY=0;
- Y=Y+VY;
- }
- synchronized(drawOffScreen)
- {
- paintSprite(drawOffScreen);
- try
- {
- Thread.sleep(33); //暂停33毫秒
- }
- catch(InterruptedException E){ }
- if(EnemyBulletSpriteThread.collision==true) //产生爆炸声
- explose.play();
- }
- }
- } catch(InterruptedException ex){}
- }
- public void paintSprite(Graphics g) //绘制敌机子弹Sprite
- {
- g.drawImage(SpriteImage,X,Y,Game);
- if((this.i==true)&&(collision==true))
- { g.drawImage(ExplosionImage,X-2,Y,Game);
- k++; //显示6帧ExplosionImage
- if(k==6)
- this.i=false;
- }
- }
- }
- public class RocketSpriteThread extends ImageSpriteThread //++++++++++陨石SpriteThread类
- {
- int AppletWidth,AppletHeight,seed,initialY,VY,mouseY;
- Random R;
- Thread s =new ImageSpriteThread();
- public RocketSpriteThread(Image rocket,Image explosion,Applet Game,int AppletWidth,
- int AppletHeight,Random R,int mouseY,ImageSpriteThread s)
- {
- super(rocket,explosion,Game); //调用父类的创建方法
- this.s=s;
- this.width=30;
- this.AppletWidth = AppletWidth;
- this.AppletHeight = AppletHeight;
- this.R=R;
- this.mouseY=mouseY;
- seed=AppletHeight;
- initialY=R.nextInt(seed);
- setLocation(AppletWidth,initialY); //初始位置
- start();
- }
-
- public void run()
- {
- paintSprite(drawOffScreen);
- try
- {
- while( (visible == true)&&(collision==false))
- {
- this.aimX=s.getX();
- this.aimY=s.getY();
- this.aimwidth=s.getWidth();
- this.aimheight=s.getHeight();
- if(s.canVisible()==true)
- {
- collision(aimX, aimY, aimwidth, aimheight);
- if(collision==true)
- {
- s.setCollision(true); //置被碰撞物collision为真
-
- setVisible(false);
- setMove(false);
- }
- }
- if(active == true)
- {
- if(X <0)
- {
- setVisible(false);
- setMove(false);
- }
- else
- X = X - 1;
- if(Y+25>;mouseY) //追踪战机
- VY=-1;
- else if(Y+25<mouseY)
- VY=1;
- else
- VY=0;
- Y=Y+VY;
- }
- synchronized(drawOffScreen)
- {
- paintSprite(drawOffScreen);
- try
- {
- Thread.sleep(33); //暂停33毫秒
- }
- catch(InterruptedException E){ }
- if(RocketSpriteThread.collision==true) //产生爆炸声
- explose.play();
- }
- }
- } catch(InterruptedException ex){}
- }
- public void paintSprite(Graphics g) //绘制陨石Sprite
- {
- g.drawImage(SpriteImage,X,Y,Game);
- if((this.i==true)&&(collision==true))
- { g.drawImage(ExplosionImage,X-2,Y,Game);
- k++;
- if(k==6)
- this.i=false;
-
- }
- }
- }
- public class EnemySpriteThread extends ImageSpriteThread //敌机SpriteThread类 ++++++++++++++
- {
- int AppletWidth,AppletHeight,seed,initialY,VY,mouseY;
- Random R;
- Thread s =new ImageSpriteThread();
- public EnemySpriteThread(Image enemy,Image explosion,Applet Game,int AppletWidth,
- int AppletHeight,Random R,int mouseY,ImageSpriteThread s)
- {
- super(enemy,explosion,Game); //调用父类的创建方法
- this.s=s;
- this.width=30;
- this.AppletWidth = AppletWidth;
- this.AppletHeight = AppletHeight;
- this.R=R;
- this.mouseY=mouseY;
- seed=AppletHeight;
- initialY=R.nextInt(seed);
- setLocation(AppletWidth,initialY); //初始位置
- start();
-
- }
-
- public void run()
- { paintSprite(drawOffScreen);
-
- try
- {
- while( (visible == true)&&(collision==false))
- {
- this.aimX=s.getX();
- this.aimY=s.getY();
- this.aimwidth=s.getWidth();
- this.aimheight=s.getHeight();
- if(s.canVisible()==true)
- {
- collision(aimX, aimY, aimwidth, aimheight);
- if(collision==true)
- {
- s.setCollision(true); //置被碰撞物collision为真
-
- setVisible(false);
- setMove(false);
- }
- }
- if(active == true)
- {
- if(X <0) //当敌机穿过右边界时
- {
- setVisible(false); //设定敌机Sprite为不可见
- setMove(false); //设定敌机Sprite为不可移动
- }
- else
- X = X - 1;
- if(Y+25>;mouseY) //追踪战机
- VY=-1;
- else if(Y+25<mouseY)
- VY=1;
- else
- VY=0;
- Y=Y+VY;
- }
- synchronized(drawOffScreen)
- {
- paintSprite(drawOffScreen);
- try
- {
- Thread.sleep(33); //暂停33毫秒
- }
- catch(InterruptedException E){ }
- if(EnemySpriteThread.collision==true) //产生爆炸声
- explose.play();
- }
- }
- } catch(InterruptedException ex){}
- }
-
- public void paintSprite(Graphics g);
- {
-
- g.drawImage(SpriteImage,X,Y,Game);
- if((this.i==true)&&(collision==true))
- { g.drawImage(ExplosionImage,X-2,Y,Game);
- k++;
- if(k==6)
- this.i=false;
-
- }
- }
- } //+++++++++++++++++++++++++++++++++++++
- airplaneSpriteThread = new ImageSpriteThread(airplane,explosion,this);
-
- EnemyBulletSpriteThread[0]=new EnemyBulletSpriteThread(enemybullet,explosion,this,AppletWidth,AppletHeight,R,mouseY,airplaneSpriteThread);
-
- RocketSpriteThread[0]=new RocketSpriteThread(rocket,explosion,this,AppletWidth,AppletHeight,R,mouseY,airplaneSpriteThread);
-
- EnemySpriteThread[0] =new EnemySpriteThread(enemy,explosion,this,AppletWidth,AppletHeight,R,mouseY,airplaneSpriteThread);
-
- BulletSpriteThread[0] =new BulletSpriteThread(bullet,explosion,this,AppletWidth,AppletHeight);
-
- public void start() //start()方法
- {
- newThread = new Thread(this); //建立与启动新线程
- musicThread=new PlayMusicThread();
- musicThread.start();
- newThread.start();
-
- }
- public void stop() //stop()方法
- {
- newThread = null; //将线程设为null
- musicThread=null;
- }
- public void paint(Graphics g)
- {
- //只清除此部分区域的图像
- drawOffScreen.clearRect(0,0,AppletWidth,AppletHeight);
-
- //注意绘制顺序(Z-Order)
-
- drawOffScreen.drawImage(scrollImage,X1,0,this); //绘制滚动图像
- drawOffScreen.drawImage(scrollImage2,X2,0,this);
- g.drawImage(OffScreen,0,0,this); //将次画面贴到主画面上
- }
- public void update(Graphics g) //update()方法
- {
- paint(g); //只单纯调用paint()方法
- }
-
- public void run()
- {
- while(newThread != null)
- {
- repaint(); //重绘图像
-
- try
- {
- Thread.sleep(33); //暂停33毫秒
- }
- catch(InterruptedException E){ }
-
-
- if(X1 == -BackImageWidth) //转换图像位置(产生滚动效果)
- X1 = BackImageWidth - 2;
- else
- X1--;
- if(X2 == -BackImageWidth)
- X2 = BackImageWidth - 2;
- else
- X2--;
- Thread curt=Thread.currentThread(); //++++++++++++++++++测试用
- showStatus("Current thread:"+curt);
-
- if((airplaneSpriteThread.canVisible()==true)&&(R.nextInt(250)<1)) // 创建敌机子弹
- {
- if(EnemyBulletSpriteNum<9)
- EnemyBulletSpriteNum++;
- else EnemyBulletSpriteNum=1;
- EnemyBulletSpriteThread[EnemyBulletSpriteNum]=new EnemyBulletSpriteThread(
- enemybullet,explosion,this,AppletWidth,AppletHeight,R,mouseY,airplaneSpriteThread);
-
- }
-
- if((airplaneSpriteThread.canVisible()==true)&&(R.nextInt(190)<1)) // 创建陨石
- {
- if(RocketSpriteNum<9)
- RocketSpriteNum++;
- else RocketSpriteNum=1;
- RocketSpriteThread[RocketSpriteNum]=new RocketSpriteThread(
- rocket,explosion,this,AppletWidth,AppletHeight,R,mouseY,airplaneSpriteThread);
-
- }
-
- if((airplaneSpriteThread.canVisible()==true)&&(R.nextInt(100)<1)) // 创建敌机
- {
- if(EnemyNum<9)
- EnemyNum++;
- else EnemyNum=1;
- EnemySpriteThread[EnemyNum]=new EnemySpriteThread(
- enemy,explosion,this,AppletWidth,AppletHeight,R,mouseY,airplaneSpriteThread);
-
- }
- }
- }
- //=====实作MouseListener界面=======================================
- public void mouseExited(MouseEvent e){} //鼠标离开Component
- public void mouseClicked(MouseEvent e)
- {
- if(BulletNum<49)
- BulletNum++;
- else BulletNum=1;
- BulletSpriteThread[BulletNum]=new BulletSpriteThread(bullet,explosion,this,AppletWidth,AppletHeight);
-
- }
- public void mouseReleased(MouseEvent e){} //鼠标按键放开
-
- public void mouseEntered(MouseEvent e) //鼠标进入Component
- {
- mouseX = e.getX();
- mouseY = e.getY();
- //设定飞机的边界动作
- if(mouseX < ImageWidth / 2)
- X = ImageWidth / 2;
- else if(mouseX >; AppletWidth - (ImageWidth / 2))
- X = AppletWidth - (ImageWidth / 2);
- else
- X = mouseX;
- if(mouseY < ImageHeight / 2)
- Y = ImageHeight / 2;
- else if(mouseY >; AppletHeight - (ImageHeight / 2))
- Y = AppletHeight - (ImageHeight / 2);
- else
- Y = mouseY;
-
-
- //设定飞机图像的正确位置
- airplaneSpriteThread.setLocation(X - (ImageWidth / 2),Y - (ImageHeight / 2));
- }
- public void mousePressed(MouseEvent e) //鼠标按键被按下
- {
- if(airplaneSpriteThread.visible==true)
- {
- BulletSpriteThread[BulletNum].setLocation(X+10,Y);
- BulletSpriteThread[BulletNum].setVisible(true);
- BulletSpriteThread[BulletNum].setMove(true);
-
-
- }
- }
-
- //=====实作MouseMotionListener界面=================================
- public void mouseMoved(MouseEvent e) //鼠标移动时
- {
- //移动飞机
- mouseX = e.getX();
- mouseY = e.getY();
- //设定飞机的边界动作
- if(mouseX < ImageWidth / 2)
- X = ImageWidth / 2;
- else if(mouseX >; AppletWidth - (ImageWidth / 2))
- X = AppletWidth - (ImageWidth / 2);
- else
- X = mouseX;
- if(mouseY < ImageHeight / 2)
- Y = ImageHeight / 2;
- else if(mouseY >; AppletHeight - (ImageHeight / 2))
- Y = AppletHeight - (ImageHeight / 2);
- else
- Y = mouseY;
- //设定飞机图像的正确位置
- airplaneSpriteThread.setLocation(X - (ImageWidth / 2),Y - (ImageHeight / 2));
- }
- public void mouseDragged(MouseEvent e) //鼠标拖曳时
- {
- }
- }
复制代码
//这个是后来改的,但有N多错误,不明白啊 |
|