Анимация движущихся объектов массива - PullRequest
0 голосов
/ 08 июня 2018

Я создаю анимацию.Автомобиль движется, и вокруг него создаются волны.Волны являются объектами ArrayList.Я хочу, чтобы волны выглядели так:

enter image description here

Я хочу, чтобы они были ближе друг к другу в передней части автомобиля, и далеко друг от другасзади.

enter image description here

С этим кодом волны выглядят так:

(они ближе друг к другу сзади,не спереди)

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; //for ww.xPos +5; they appear not next to each other
                ww.width+=1;

            }

            w.yPos-=pa.velX/5 ; 
            }
        }
    }

    SwingUtilities.invokeLater(()->repaint());

}

Подскажите, пожалуйста, как решить эту проблему?Весь класс выглядит так:

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;
    }
}

И класс WaveParameters:

public class WaveParameters {

int xPos=0;
int yPos = 375;
int width=60;
int height=60;
int velX = 5 ;
private Color color = Color.white;
public int getVelX() {
    return velX;
}

public void setVelX(int velX) {
    this.velX = velX;
}

public int getX() {
    return xPos;
}

public void setX(int xPos) {
    this.xPos = xPos;
}

public int getY() {
    return xPos;
}

public void setY(int yPos) {
    this.yPos = yPos;
}

public int getWidth(){
  return width;
} 

public int getHeight(){
  return height;
}

public void setWidth(int width) {
    this.width = width;
}

public void setHeight(int height) {
    this.height = height;
}

public Color getColor() {
    return color;
}
public void setColor(Color color) {
    this.color = color;
}

public void paint(Graphics g){
  g.setColor(getColor());
  g.drawOval(xPos,yPos,width/2,height/2);
}

}

1 Ответ

0 голосов
/ 08 июня 2018

Проблема, кажется, возникает, когда вы устанавливаете положение оси 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; 
  }
}

Это сделает это первымволна t (самая маленькая) больше справа, а последняя волна (самая большая) больше слева.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...