Анимация вращения изображения - PullRequest
3 голосов
/ 15 марта 2012

Возможно, вопрос с простым ответом.Я пытаюсь оживить корабль (стиль астероидов).Прямо сейчас я просто использую метод поворота Graphics2D.Тем не менее, сейчас это просто размывает мое изображение.Какой самый простой способ сделать это и заставить его работать правильно?(Метод getImage вызывается каждый раз, когда обновляется экран, а метод rotate вызывается каждый раз, когда пользователь нажимает влево или вправо. bi1 - считанное ранее изображение с буферизацией)

Ответы [ 6 ]

2 голосов
/ 19 июня 2012

Вы можете попробовать поиграть с Graphics.setRenderingHint () и установить более высокое качество, но кроме этого вы ничего не можете сделать, чтобы заставить его работать «правильно».

Если качество, обеспечиваемое Graphics2D, не удовлетворяет вашим требованиям, создайте повернутые изображения вашего «космического корабля» с помощью графической программы и выберите правильное предварительно повернутое изображение в зависимости от облика корабля. Таким образом, качество больше зависит не от графического API, а только от вашей графической программы (и от того, сколько усилий вы вложили в создание повернутых изображений). Вы должны выбрать гранулярность (количество предварительно визуализированных изображений) для угла, нормальные числа обычно находятся в диапазоне от 16 до 64.

2 голосов
/ 18 июня 2012

попробуйте с помощью аффинного преобразования:

  public void paint(Graphics g) {
      // clear off screen bitmap
      super.paint(g);
      // cast graphics to graphics 2D
      Graphics2D g2 = (Graphics2D) g;
      AffineTransform tfm = new AffineTransform();
      tfm.rotate(0,0,0);
      g2.setTransform(tfm);
      g2.drawImage(backImage, 0, 0, this);
      tfm.rotate(Math.toRadians(player.angle+90), player.x+32, player.y+32);
      g2.setTransform(tfm);
      g2.drawImage(tank, player.x, player.y, this);       
  }

http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/geom/AffineTransform.html

1 голос
/ 21 июня 2012

Я согласен с предложением Graphics2D.setRenderingHint().Попробуйте KEY_INTERPOLATION с VALUE_INTERPOLATION_BILINEAR.

Кроме того, попробуйте увеличить исходное изображение в 4 раза больше, чем вы хотите нарисовать, и затем используйте Graphics2D.scale(1/multiple) в дополнение к повороту.

Причина: без масштабирования диагональ пикселя в 1,4+ раза больше края, поэтому при повороте приближается к нечетным кратным 45 градусам, 14+ пикселей в изображении отрисовываются со ссылкой натолько 10 в исходном изображении.Это добавляет неровности к результату.

Другой подход заключается в использовании BufferedImage для источника и получателя:

    tx = new AffineTransform();
    tx.rotate(theta, xCenter, yCenter)
    op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
    BufferedImage destImg = op.filter(srcImg, null);

Наконец, переключение на OpenGL (например, с JOGL или LWGL) обеспечивает все виды контроля надсглаживание и многое другое.С другой стороны, это открывает двери для несовместимости оборудования, поскольку многие графические драйверы имеют OpenGL ошибок IME.

0 голосов
/ 25 июня 2012

вы можете использовать getRotateInstance(double theta)

public void paint(Graphics g) {
    ...
    Graphics2D g2d = (Graphics2D)bi1.getGraphics();
    AffineTransform af = new AffineTransform(
       AffineTransform.getRotateInstance(theta, x, y));
    g2d.setTransform(af);
    g2d.drawImage(bi1, af, this);
}

документы: AffineTransform (getRotateInstance)

0 голосов
/ 24 июня 2012

Вы рисуете в графическом контексте BufferedImage, в котором хранится изображение вашего корабля.

Использование метода поворота должно работать, если вы рисуете в графическом контексте компонента пользовательского интерфейса, отображающего игру.или контекст какого-то другого буфера.

0 голосов
/ 19 июня 2012

Вы дали попробовать BufferedImage ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...