Я работаю над домашним заданием для класса, и его поздно, потому что я не могу понять материал, несмотря на все исследования, которые я делаю. Я новичок и не знаю много на пути к java. Кроме того, это мой первый пост, поэтому, пожалуйста, прощайте, когда вы читаете это.Как рисовать несколько объектов, которые перемещаются с разных скоростей в Java?
Я основываюсь на исходном тексте из моего учебника, который я недавно обновил для прошлой домашней работы, но теперь я пытаюсь создать класс, который рисует несколько квадратов и перемещает эти объекты независимо и с разной скоростью. Им все также придется отскакивать от стен. Я выполнил инструкции и создал два массива, которые будут содержать случайные значения x и y от 1 до 10. Однако я борюсь с массивами, и я уверен, что я делаю это неправильно. Итак, я хотел бы получить некоторую обратную связь, чтобы узнать, правильно ли я настроил ее.
У меня есть 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();
}
}
}
}
Благодарим за помощь! Ваш код, безусловно, более логичен, чем то, что я прошу сделать в инструкциях. Тем не менее, я боюсь, что я смогу больше поработать над материалом, если не буду следовать рекомендациям. Кроме того, не будьте готовы к будущим проектам, которые могут включать в себя один и тот же материал для этой домашней работы. Должен ли я просто создать еще два массива, чтобы справиться со скоростью движения x и y? Или я могу создать один массив, который обрабатывает это для каждого квадрата, который нарисован? Спасибо еще раз за помощь! – Jfwhyte8
@ Jfwhyte8, я не могу ответить на ваш вопрос, потому что я не понимаю ваши рекомендации или то, что пример пытается учить. – camickr
Спасибо за помощь, и я сожалею, что сейчас возвращаюсь к вам. Жизнь была занята, мягко говоря. Моя цель - добавить анимацию с помощью таймера, чтобы квадраты перемещались при рисовании. Мне нужно сделать каждое квадратное перемещение на случайных скоростях (в направлениях х и у), и мне нужно, чтобы квадраты «отскакивали» соответственно со всех четырех сторон экрана. Кроме того, мой учитель сказал, что мы должны использовать 2 массива размером 1000 для хранения случайных значений от 1 до 10 для движений X и движений Y. Это должно позволить прямоугольникам иметь независимые скорости движения. – Jfwhyte8