Как заставить графику появляться случайным образом и исчезать при столкновении с другим графиком? - PullRequest
0 голосов
/ 21 октября 2011

Я написал некоторый код для перемещения графики (которая окружена прямоугольником), и я пытаюсь нарисовать другой овал (с прямоугольником вокруг него), который будет генерироваться случайным образом.Сейчас он генерирует WAY быстро, и я не хочу использовать Thread.sleep;потому что он перестанет слушать ключи (насколько я знаю?).Так что любой, кто хорошо разбирается в многопоточности, может помочь мне сделать это или знать, как сделать графическое изображение, пока оно не будет затронуто подвижной графикой.

Генератор графики в основном классе:

public void paintComponent(Graphics g){
    //System.out.println("X = " + al.x + ", Y = " + al.y);
    boolean intersect = false;
    int points = 0;

    g.drawString("Points: " + points, 5, 445);

    Rectangle r1 = new Rectangle(al.x, al.y, 10, 10);
    g.setColor(Color.BLACK);
    g.fillOval(al.x, al.y, 10, 10);

    Random randX = new Random();
    Random randY = new Random();
    int xInt = randX.nextInt(590);
    int yInt = randY.nextInt(440);

    Rectangle dCoin = new Rectangle(xInt, yInt, 10, 10);
    g.setColor(Color.YELLOW);
    g.fillOval(xInt, yInt, 10, 10);


        /*
         * (???)
         * 
         * for(int idx = 1; idx == 1; idx++){
         *      if(xInt < 590 && yInt < 440){
         *      }
         *  }
         *
         * Check if graphic collides with another:
         * 
         * if(r1.intersects(r2)){
         *      doSomething;
         * }
         *
         */
        repaint();
    }

}

Кстати: r1 окружает подвижную графику, а r2 - прямоугольник, окружающий случайно сгенерированную графику.Мне пришлось сделать невидимые прямоугольники вокруг овалов, чтобы получить метод r1.intersects (r2).

1 Ответ

1 голос
/ 24 октября 2011

Вы должны использовать класс Swing Timer для периодической генерации ActionEvent с в потоке диспетчеризации событий. Это позволяет избежать проблемы, из-за которой приложение перестает реагировать на нажатия клавиш и другие действия пользователя.

Обратный вызов actionPerformed - это крюк в вашем маршруте для перемещения и перекраски объектов, которые вы хотите оживить. В подпрограмме анимации вы можете записать время, прошедшее с момента последнего вызова метода для поддержания желаемой скорости.

Timer timer = new Timer(1000, new ActionListener() {
  long lastTime = System.currentTimeMillis();

  public void actionPerformed(ActionEvent evt) {
    long timeNow = System.currentTimeMillis();
    long timeEllapsed = timeNow - lastTime;
    lastTime = timeNow;

    if (timeEllapsed > 0L) {
      for (Moveable mv : moveables) {
        mv.updatePosition(timeEllapsed);
      }

      for (Drawable d : drawables) {
        d.repaint();
      }
    }
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...