我正在制作动画。汽车在它周围移动并产生波浪。 Wave是ArrayList对象。我希望波浪看起来像这样:
我希望他们在汽车前部彼此靠近,在后面远离彼此。
使用此代码波形如下所示:
(他们在后面彼此靠近,而不是在前面)
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);
}
}
答案 0 :(得分:0)
当您设置wave的x位置时,问题似乎就出现了。让我们来描述一下:
如何解决?
使用单个循环。
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;
}
}
这将使第一个波(最小的一个)在右边更多,最后一个波(最大的一个)在左边更多。