2015-06-11 6 views
0

У меня проблема. Я хочу, чтобы иметь возможность масштабировать мой экран Graphics2D с помощью колеса мыши, но я хочу иметь возможность переводить Graphics2D так, чтобы он был прямо на месте, которое я масштабировал. Вот что происходит до сих пор: «http://cdn.makeagif.com/media/6-11-2015/E0kYGY.gif« Это правильно соответствует позиции игрока, но я хочу, чтобы он изменялся и изменялся с помощью прокрутки колеса мыши. Вот код, который я до сих пор сделать это:Java Graphics2D Translate and Scale

private AffineTransform getCamTransform() 
{ 
    AffineTransform t = new AffineTransform(); 
    float a = 400 - player.getX(); 
    float b = 250 - player.getY(); 
    t.translate(a, b); 
    /* 
    * Here's where I want to scale using the zoom 
    * variable and also translate the g2d according 
    * to the zoom variable. 
    */ 
    return t; 
} 

private double zoom = 2.0D; 

@Override 
public void mouseWheelMoved(MouseWheelEvent e) 
{ 
    zoom += e.getPreciseWheelRotation(); 
} 

Это лишь небольшой сегмент кода у меня есть. У меня есть метод, который рисует все на экране, но это просто возврат преобразования, которое должно быть применено к камере. Затем преобразование устанавливается на предыдущее преобразование Graphics2D.

Сообщите мне, если есть более простой способ сделать это, или я делаю все это неправильно. Я также хочу быть эффективным и на процессоре. Спасибо, кто отвечает!

+0

Почему вы не можете просто добавить e.scale (масштабирования) после того, как перевести? – StanislavL

+0

Потому что он не масштабируется во что-то конкретное. Он масштабируется в соответствии с точкой начала (0, 0). Не там, где игрок, поэтому вся графика перемещается в нижнюю правую. –

ответ

5

Основная идея заключается в том, что вы хотите, чтобы она выглядела так, как если бы графика оставалась центрированной в пределах области просмотра. Сначала я подумал о том, чтобы попытаться масштабировать точки перевода, и, возможно, это может сработать, но я мог бы заставить его работать (3-х летний, желающий читать книги, не дал мне много времени для экспериментов).

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

 double width = getWidth(); 
     double height = getHeight(); 

     double zoomWidth = width * zoom; 
     double zoomHeight = height * zoom; 

     double anchorx = (width - zoomWidth)/2; 
     double anchory = (height - zoomHeight)/2; 

     AffineTransform at = new AffineTransform(); 
     at.translate(anchorx, anchory); 
     at.scale(zoom, zoom); 
     at.translate(-100, -100); 

таким образом, anchorx/y представляют количество результирующих графики будут нужны быть компенсированы, основываясь на видимых областях ширины и высоту, так что изображение будет оставаться «в центре "внутри него ...

Scroll

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseWheelEvent; 
import java.awt.geom.AffineTransform; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.text.NumberFormat; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private double zoom = 1d; 
     private BufferedImage img; 

     public TestPane() { 
      try { 
       img = ImageIO.read(new File("...")); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
      addMouseWheelListener(new MouseAdapter() { 
       @Override 
       public void mouseWheelMoved(MouseWheelEvent e) { 
        if (e.getPreciseWheelRotation() < 0) { 
         zoom -= 0.1; 
        } else { 
         zoom += 0.1; 
        } 
//     zoom += e.getPreciseWheelRotation(); 
        if (zoom < 0.01) { 
         zoom = 0.01; 
        } 

        repaint(); 

       } 
      }); 
     } 

     public String format(double value) { 
      return NumberFormat.getNumberInstance().format(value); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 

      double width = getWidth(); 
      double height = getHeight(); 

      double zoomWidth = width * zoom; 
      double zoomHeight = height * zoom; 

      double anchorx = (width - zoomWidth)/2; 
      double anchory = (height - zoomHeight)/2; 

      AffineTransform at = new AffineTransform(); 
      at.translate(anchorx, anchory); 
      at.scale(zoom, zoom); 
      at.translate(-100, -100); 

      g2d.setTransform(at); 
      g2d.drawImage(img, 0, 0, this); 

      g2d.dispose(); 
     } 

    } 

} 

Там, наверное, действительно огромная математическая формула, которую вы могли бы использовать вместо этого, но меня немым;)

+0

Удивительный! Это абсолютно ответили на вопрос! И он отлично работает! Большое спасибо! Если бы я смог дать вам точку, я бы, но, видимо, я не смог. Извини за это! –

+0

Вау, я должен сказать, что я удивлен, помог в вашем случае, но рад, что это сделал;) – MadProgrammer