Java 移动arraylist对象的动画

Java 移动arraylist对象的动画,java,for-loop,animation,arraylist,graphics,Java,For Loop,Animation,Arraylist,Graphics,我正在制作一个动画。汽车在它周围移动,波浪在它周围形成。波是ArrayList对象。我希望波浪看起来像这样: public class PanelAnimation extends JPanel implements ActionListener{ public PanelAnimation(ResourceBundle bundle) { super(); resourceBundle = bundle; try {

我正在制作一个动画。汽车在它周围移动,波浪在它周围形成。波是ArrayList对象。我希望波浪看起来像这样:

public class PanelAnimation extends JPanel implements ActionListener{

public PanelAnimation(ResourceBundle bundle) {
    super();
    resourceBundle = bundle;

    try {                
        imageBackground = ImageIO.read(new File("bg.png"));
       } catch (IOException ex) {
            // handle exception...
       }    
}
CarParametrs pAuto = new CarParametrs();
HumanParametrs pHuman = new HumanParametrs() ;
ArrayList<WaveParameters> waves = new ArrayList<WaveParameters>();
Timer t = new Timer(60,this);
Timer draw; 
public void addAuto(){
    CarParametrs ap = new CarParametrs();
    ap.setX(0);
    pAuto = ap;
}
public void addHuman(){
    HumanParametrs acz = new HumanParametrs();
    acz.setX(0);
    pHuman = acz;
}

public void animationStart() {
    t.start();
}

public void animationStop() {
    t.stop();
}
public void addTimerAddingWaves(){
    if(draw==null) {
        draw= new Timer(300, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent ae) {
                    WaveParameters wave = new WaveParameters(); 
                    waves.add(wave); 

                }
            });

        draw.start();
    }
}

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(imageBackground, 0, 0, null);
    pAuto.paint(g);
    pHuman.paint(g);
    synchronized (waves) {
        for (WaveParameters w : waves) {
            w.paint(g);
        }
    }   
}


public void actionPerformed(ActionEvent e) {        
    CarParametrs  pa = pAuto;
    pa.xPos += pa.velX;

    HumanParametrs pc = pHuman;
    pc.xPos += pc.velX;
    synchronized (waves) {
        for (WaveParameters w : waves) {
            if(pa.velX==0 && pc.velX==0)
            {
                w.xPos = pa.xPos+50;
                w.height+=20; 
                w.width+=20; 
                w.yPos-=20/5 ; 
            }
            else{
            w.xPos = pa.xPos+50;
            w.height+=pa.velX; 
            w.width+=pa.velX; 
            for (WaveParameters ww : waves) {
                ww.xPos-=5;
                ww.width+=1;
            }
            w.yPos-=pa.velX/5 ; 
            }
        }
    }
    SwingUtilities.invokeLater(()->repaint());
}

Color colorPanelAnimation;
TitledBorder titlePanelAnimation;
ResourceBundle resourceBundle;
private BufferedImage imageBackground;

public void stopTimerAddingWaves() {
    if(draw!=null) {
        draw.stop();
        draw=null;
    }
}

我希望他们在车的前部彼此靠近,在车的后部彼此远离

使用此代码,波形如下所示:

(它们在后面靠得更近,而不是在前面)

你能告诉我怎么解决这个问题吗? 全班同学都是这样的:

public class PanelAnimation extends JPanel implements ActionListener{

public PanelAnimation(ResourceBundle bundle) {
    super();
    resourceBundle = bundle;

    try {                
        imageBackground = ImageIO.read(new File("bg.png"));
       } catch (IOException ex) {
            // handle exception...
       }    
}
CarParametrs pAuto = new CarParametrs();
HumanParametrs pHuman = new HumanParametrs() ;
ArrayList<WaveParameters> waves = new ArrayList<WaveParameters>();
Timer t = new Timer(60,this);
Timer draw; 
public void addAuto(){
    CarParametrs ap = new CarParametrs();
    ap.setX(0);
    pAuto = ap;
}
public void addHuman(){
    HumanParametrs acz = new HumanParametrs();
    acz.setX(0);
    pHuman = acz;
}

public void animationStart() {
    t.start();
}

public void animationStop() {
    t.stop();
}
public void addTimerAddingWaves(){
    if(draw==null) {
        draw= new Timer(300, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent ae) {
                    WaveParameters wave = new WaveParameters(); 
                    waves.add(wave); 

                }
            });

        draw.start();
    }
}

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(imageBackground, 0, 0, null);
    pAuto.paint(g);
    pHuman.paint(g);
    synchronized (waves) {
        for (WaveParameters w : waves) {
            w.paint(g);
        }
    }   
}


public void actionPerformed(ActionEvent e) {        
    CarParametrs  pa = pAuto;
    pa.xPos += pa.velX;

    HumanParametrs pc = pHuman;
    pc.xPos += pc.velX;
    synchronized (waves) {
        for (WaveParameters w : waves) {
            if(pa.velX==0 && pc.velX==0)
            {
                w.xPos = pa.xPos+50;
                w.height+=20; 
                w.width+=20; 
                w.yPos-=20/5 ; 
            }
            else{
            w.xPos = pa.xPos+50;
            w.height+=pa.velX; 
            w.width+=pa.velX; 
            for (WaveParameters ww : waves) {
                ww.xPos-=5;
                ww.width+=1;
            }
            w.yPos-=pa.velX/5 ; 
            }
        }
    }
    SwingUtilities.invokeLater(()->repaint());
}

Color colorPanelAnimation;
TitledBorder titlePanelAnimation;
ResourceBundle resourceBundle;
private BufferedImage imageBackground;

public void stopTimerAddingWaves() {
    if(draw!=null) {
        draw.stop();
        draw=null;
    }
}

}

当您设置波浪的x位置时,问题似乎出现了。让我们来描述一下:

  • 第一次迭代:设置wave1.xPos=auto.xPos+50,然后在所有波上迭代5次
    • wave1.xPos=auto.xPos+50-5
    • wave2.xPos=-5
    • wave3.xPos=-5
    • 等等
  • 第二次迭代:设置wave2.xPos=auto.xPos+50,然后在所有波上迭代5次
    • wave1.xPos=auto.xPos+50-10
    • wave2.xPos=auto.xPos+50-5
    • wave3.xPos=-10
    • 等等
  • 最后一次迭代:设置waveLast.xPos=auto.xPos+50,然后在所有波上迭代5次
    • wave1.xPos=auto.xPos+50-(5*大小)
    • wave2.xPos=auto.xPos+50-(5*size-1)
    • wave3.xPos=auto.xPos+50-(5*size-2)
    • 等等
    • waveLast.xPos=auto.xPos+50-5
如何解决它?

使用单个循环

for (int i = 0; i < waves.size; i++) {
  if (pa.velX == 0 && pc.velX == 0) {
    w.xPos = pa.xPos + 50;
    w.height += 20; 
    w.width += 20; 
    w.yPos -= 20/5;
  } else {
    w.xPos = pa.xPos + 50 - (5 * i);
    w.height += pa.velX; 
    w.width += pa.velX + (i + 1);
    w.yPos -= pa.velX/5; 
  }
}
for(int i=0;i

这将使第一个波(最小的一个)更多地位于右侧,最后一个波(最大的一个)更多地位于左侧。

不要放置图像重定向。首先读一行
w.xPos=pa.xPos+50将重置每个波的位置(在第二个循环中所做的不会生效,因为
xPos
将被覆盖)。第二,你确定在处理波浪位置时,
pAuto
没有被修改吗?@SergioLema根据第一条-你的确切意思是什么?的确,在汽车周围添加了下一个波浪,但在xPos=0时,有时会出现新的圆圈,然后消失,这是真的,但如何解决它呢?根据第二种说法——事实并非如此——在前面他们彼此相距很远,在车后几乎在同一个地方。但是它们比我的代码中的要宽。我假设xPos是水平轴,yPos是垂直轴,不是吗?好的,你有没有尝试过设置高度、宽度和yPos的绝对值,而不是在每个周期增加/减少它们?作为
w.height=pa.velX+i
w.width=pa.velX+i
w.yPos=pa.velX/5
。零速时也是如此,这样就不会出现波浪。我认为这个问题只是一个ww.xPos-=5;`因为波浪看起来和我想要的完全一样,但是倒转(前后)迭代的第一个波浪,是最小的还是最大的?
for (int i = 0; i < waves.size; i++) {
  if (pa.velX == 0 && pc.velX == 0) {
    w.xPos = pa.xPos + 50;
    w.height += 20; 
    w.width += 20; 
    w.yPos -= 20/5;
  } else {
    w.xPos = pa.xPos + 50 - (5 * i);
    w.height += pa.velX; 
    w.width += pa.velX + (i + 1);
    w.yPos -= pa.velX/5; 
  }
}