射击多发子弹时出现Java图形故障

射击多发子弹时出现Java图形故障,java,graphic,Java,Graphic,所以我正在尝试创建一个关于飞机射击外星人之类的java游戏。每次鼠标点击,飞机都会射出一颗子弹。这意味着飞机一次可以发射10、20或更多子弹。为了演示子弹的运动,我尝试了线程和计时器,但真正的问题是如果我有一颗子弹射出,这意味着我创建了一个新线程(或计时器),这使得游戏运行非常缓慢。有什么办法可以解决这个问题吗? 这是我的子弹移动代码 public class Bullet extends JComponent implements Runnable { int x;//coordinates

所以我正在尝试创建一个关于飞机射击外星人之类的java游戏。每次鼠标点击,飞机都会射出一颗子弹。这意味着飞机一次可以发射10、20或更多子弹。为了演示子弹的运动,我尝试了线程和计时器,但真正的问题是如果我有一颗子弹射出,这意味着我创建了一个新线程(或计时器),这使得游戏运行非常缓慢。有什么办法可以解决这个问题吗? 这是我的子弹移动代码

public class Bullet extends JComponent implements Runnable {

int x;//coordinates
int y;
BufferedImage img = null;
Thread thr;
public Bullet(int a, int b) {
        x = a;
        y = b;
        thr = new Thread(this);
        thr.start();

    }
protected void paintComponent(Graphics g) {
        // TODO Auto-generated method stub
        try {
            img = ImageIO.read(new File("bullet.png"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // g.drawImage(resizeImage(img, 2), x, y, this);

        g.drawImage(Plane.scale(img, 2, img.getWidth(), img.getHeight(), 0.125, 0.125), x, y, this);
        width = img.getWidth() / 8;
        height = img.getHeight() / 8;

        super.paintComponent(g);

    }
public void run() {


        while(true)
        {
            if(y<-50)break;//if the bullet isnt out of the frame yet
            y-=5;//move up
            repaint();
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

}
公共类项目符号扩展JComponent实现可运行{
int x;//坐标
int-y;
BuffereImage img=null;
螺纹螺纹;
公共项目符号(内部a、内部b){
x=a;
y=b;
thr=新螺纹(该螺纹);
thr.start();
}
受保护组件(图形g){
//TODO自动生成的方法存根
试一试{
img=ImageIO.read(新文件(“bullet.png”);
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
//g.drawImage(尺寸图像(img,2),x,y,this);
g、 drawImage(平面比例(img,2,img.getWidth(),img.getHeight(),0.125,0.125),x,y,this);
宽度=img.getWidth()/8;
高度=img.getHeight()/8;
超级组件(g);
}
公开募捐{
while(true)
{

如果(y一颗子弹不应该在它自己的线程上。有几个原因,其中一个就是你提到的——它会使你的游戏非常慢

尝试使用一个主线程更新所有项目符号。项目符号中需要一个更新函数:

public class Bullet extends JComponent {
 public void update() {
  if(y<-50)return; //if the bullet isnt out of the frame yet
  y-=5;           //move up
 }

 //all your other code for your bullet
}
您需要在主线程中有一个方法,用于添加新项目符号:

public void addBullet(Bullet b) {
    bullets.add(b);
}

然后您可以调用它来添加新的项目符号,主线程将更新该项目符号以及所有其他项目符号。

创建一个包含项目符号x、y位置的项目符号类。为每个已发射的项目符号创建一个项目符号实例。将项目符号实例保留在列表中。创建一个线程来更新项目符号和dra的位置通过遍历Bullet对象列表,在屏幕上显示项目符号。通过paintComponent方法读取项目符号图像。首先调用super.paintComponent。请一位导师教你正确的Java Swing编码。如果我的答案有帮助,那么如果你投赞成票和/或接受它,那就太好了。
public void run() {
    while(true)
    {
        for (Bullet b : bullets) {
            b.update();
        }
        repaint();
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public void addBullet(Bullet b) {
    bullets.add(b);
}