我如何绘制多个在Java中以不同速度移动的OBJETC



我正在为课堂作业做作业,因为尽管我正在做所有的研究,但我似乎无法理解材料。我是初学者,对爪哇的了解不多。另外,这是我的第一篇文章,所以当您阅读本文时,请宽恕。

我正在从我的教科书中构建源代码,最近我对此进行了更新,但现在我正在尝试生成一个绘制多个正方形并以不同速度独立移动这些对象的类。他们也需要从墙壁上反弹。我遵循说明,创建了两个阵列,它们将在1到10之间保持随机的X和y值。但是,我在数组中挣扎,我确信自己做得不正确。因此,我希望有一些反馈,看看我是否正确设置了。

我有一个jpanel抬起并绘画,只要有1个正方形,它就可以从墙壁上弹跳出来,但是当我画不止一个时,事情会发生变化。没有独立移动,它们也具有相同的速度。有些甚至不时消失。这真的使我失望了。感谢任何帮助!

简而言之,我正在尝试绘制所有以不同方向和不同速度行驶的新广场。根据指令,我们假定创建并使用一个处理X和Y值的两个数组。

这是我到目前为止所拥有的:

public class DotsPanel extends JPanel
{
private int delay = 15;
private final int SIZE = 7, IMAGE_SIZE = 3;  // radius of each dot
private Timer timer;
private int x, y, i;
private ArrayList<Point> pointList;
static int [] xarray = new int [1000];
static int [] yarray = new int [1000];
Random rand = new Random();
   //-----------------------------------------------------------------
   //  Constructor: Sets up this panel to listen for mouse events.
   //-----------------------------------------------------------------
   public DotsPanel()
   {
      pointList = new ArrayList<Point>();
      int [] xarray = new int [1000];
      int [] yarray = new int [1000];
      timer = new Timer(delay, new ReboundListener());
      addMouseListener (new DotsListener());
      addMouseMotionListener (new DotsListener());
      setBackground(Color.gray);
      setPreferredSize(new Dimension(700, 500));
      for(int i = 0; i < xarray.length; i++)
      {   
      xarray[i] = rand.nextInt(7);
      yarray[i] = rand.nextInt(7);
      }
      timer.start();          
   }
   //-----------------------------------------------------------------
   //  Draws all of the dots stored in the list.
   //-----------------------------------------------------------------
   public void paintComponent(Graphics page)
   {
      super.paintComponent(page);
      page.setColor(Color.BLUE); 
      for (Point spot : pointList)
      {  
        page.fillRect(spot.x-SIZE, spot.y-SIZE, 25, 25);
        page.drawString("Count: " + pointList.size(), 5, 15);
      }
   }

//*****************************************************************
   //  Represents the listener for mouse events.
   //*****************************************************************
   private class DotsListener implements MouseListener, MouseMotionListener
   {
      //--------------------------------------------------------------
      //  Adds the current point to the list of points and redraws
      //  the panel whenever the mouse button is pressed.
      //--------------------------------------------------------------
      public void mousePressed(MouseEvent event)
      {
            pointList.add(event.getPoint());    
            repaint();
      }
      public void mouseDragged(MouseEvent event)
      {
        // initially I had two xarray and yarray in here just like in 
        // mouseClicked
        // but it did not change anything when removed  
      }
      //--------------------------------------------------------------
      //  Provide empty definitions for unused event methods.
      //--------------------------------------------------------------
      public void mouseClicked(MouseEvent event) 
      { 
          xarray[i] = rand.nextInt(7);
          yarray[i] = rand.nextInt(7);            
      }
      public void mouseReleased(MouseEvent event) {}
      public void mouseEntered(MouseEvent event) {}
      public void mouseExited(MouseEvent event) {}
      public void mouseMoved(MouseEvent e) {}
   }
   private class ReboundListener implements ActionListener
   {
      //--------------------------------------------------------------
      //  Updates the position of the image and possibly the direction
      //  of movement whenever the timer fires an action event.
      //--------------------------------------------------------------
      public void actionPerformed(ActionEvent event)
      {

            for (Point spot : pointList) 
            {   
                spot.x += xarray[i];
                spot.y += yarray[i];
                if (spot.x <= 0 || spot.x >= 700)
                    xarray[i] = xarray[i] * -1;
                if (spot.y <= 0 || spot.y >= 500)
                    yarray[i] = yarray[i] * -1;
                repaint();  
            }
      }
    }   
}   

但是,我在数组中挣扎,我确定自己做得不正确。

我不会使用数组。

而是让Ball对象管理自己的状态。然后,对于每个Ball,您可以具有不同的颜色,速度,尺寸等。然后,当Timer启动时,您只需计算新位置并重新粉刷Ball

这是一个让您入门的示例:

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;
public class BallAnimation4
{
    private static void createAndShowUI()
    {
        BallPanel panel = new BallPanel();
        JFrame frame = new JFrame("BallAnimation4");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( panel );
        frame.setSize(800, 600);
        frame.setLocationRelativeTo( null );
        //frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setVisible( true );
        panel.addBalls(5);
        panel.startAnimation();
    }
    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}
class BallPanel extends JPanel implements ActionListener
{
    private ArrayList<Ball> balls = new ArrayList<Ball>();
    public BallPanel()
    {
        setLayout( null );
        setBackground( Color.BLACK );
    }
    public void addBalls(int ballCount)
    {
        Random random = new Random();
        for (int i = 0; i < ballCount; i++)
        {
            Ball ball = new Ball();
            ball.setRandomColor(true);
            ball.setLocation(random.nextInt(getWidth()), random.nextInt(getHeight()));
            ball.setMoveRate(32, 32, 1, 1, true);
//          ball.setMoveRate(16, 16, 1, 1, true);
            ball.setSize(32, 32);
            balls.add( ball );
        }
    }
    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        for (Ball ball: balls)
        {
            ball.draw(g);
        }
    }
    public void startAnimation()
    {
        Timer timer = new Timer(75, this);
        timer.start();
    }
    public void actionPerformed(ActionEvent e)
    {
        move();
        repaint();
    }
    private void move()
    {
        for (Ball ball : balls)
        {
            ball.move(this);
        }
    }

    class Ball
    {
        public Color color = Color.BLACK;
        public int x = 0;
        public int y = 0;
        public int width  = 1;
        public int height = 1;
        private int moveX = 1;
        private int moveY = 1;
        private int directionX = 1;
        private int directionY = 1;
        private int xScale = moveX;
        private int yScale = moveY;
        private boolean randomMove = false;
        private boolean randomColor = false;
        private Random myRand = null;
        public Ball()
        {
            myRand = new Random();
            setRandomColor(randomColor);
        }
        public void move(JPanel parent)
        {
            int iRight = parent.getSize().width;
            int iBottom = parent.getSize().height;
            x += 5 + (xScale * directionX);
            y += 5 + (yScale * directionY);
            if (x <= 0)
            {
                x = 0;
                directionX *= (-1);
                xScale = randomMove ? myRand.nextInt(moveX) : moveX;
                if (randomColor) setRandomColor(randomColor);
            }
            if (x >= iRight - width)
            {
                x = iRight - width;
                directionX *= (-1);
                xScale = randomMove ? myRand.nextInt(moveX) : moveX;
                if (randomColor) setRandomColor(randomColor);
            }
            if (y <= 0)
            {
                y = 0;
                directionY *= (-1);
                yScale = randomMove ? myRand.nextInt(moveY) : moveY;
                if (randomColor) setRandomColor(randomColor);
            }
            if (y >= iBottom - height)
            {
                y = iBottom - height;
                directionY *= (-1);
                yScale = randomMove ? myRand.nextInt(moveY) : moveY;
                if (randomColor) setRandomColor(randomColor);
            }
        }
        public void draw(Graphics g)
        {
            g.setColor(color);
            g.fillOval(x, y, width, height);
        }
        public void setColor(Color c)
        {
            color = c;
        }
        public void setLocation(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
        public void setMoveRate(int xMove, int yMove, int xDir, int yDir, boolean randMove)
        {
            this.moveX = xMove;
            this.moveY = yMove;
            directionX  = xDir;
            directionY  = yDir;
            randomMove  = randMove;
        }
        public void setRandomColor(boolean randomColor)
        {
            this.randomColor = randomColor;
            switch (myRand.nextInt(3))
            {
                case 0:  color = Color.BLUE;
                         break;
                case 1:  color = Color.GREEN;
                         break;
                case 2:  color = Color.RED;
                         break;
                default: color = Color.BLACK;
                         break;
            }
        }
        public void setSize(int width, int height)
        {
            this.width  = width;
            this.height = height;
        }
    }
}

由于您的阵列仅包含要绘制的点,因此您没有任何有关每个点的速度的信息。您能做的最好的是创建一个随机数量,每次更改其位置时都应移动每个点。每次移动点时,距离将是随机的。

如果您想要更恒定的速度,则需要创建第二个数组以包含每个点每次都应移动的距离。

每当您希望新属性成为要绘制的对象时,每当您希望新属性是唯一的,这会变得凌乱。这就是为什么创建具有多个属性的自定义对象的方法更容易管理。

相关内容

  • 没有找到相关文章

最新更新