gpt4 book ai didi

java - 移动 arraylist 对象的动画

转载 作者:行者123 更新时间:2023-11-30 10:14:52 24 4
gpt4 key购买 nike

我正在制作动画。汽车移动并在其周围产生波浪。 Waves 是 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);
}

最佳答案

问题似乎出现在您设置波浪的 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 * size)
    • 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;
}
}

这将使第一个波浪(最小的波浪)更多地在右边,最后一个波浪(最大的波浪)更多地在左边。

关于java - 移动 arraylist 对象的动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50760761/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com