Java 移动arraylist对象的动画
我正在制作一个动画。汽车在它周围移动,波浪在它周围形成。波是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 {
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;
}
}