2012-10-10 34 views
1

你好,我非常好奇如何解決這個問題:我用Java中的fillArc,drawArc方法創建了一個pacman,現在我的屏幕上有一個pacman人總是向右看,無論它走向何方..我的問題是......有沒有一種方法可以逐漸改變對象或在Java中水平翻轉它?用Java中的算法改變圖形的角度/位置

我試圖使用AffineTransform,但我沒有得到我想要的文檔...我應該如何能夠實現這一點使用switch語句?我試圖做下面的事情,但是我被困在這個部分,因爲我不知道如何繼續。

DrawPacMan pacman = new DrawPacMan(); 
DrawPacMan ghost1 = new DrawPacMan(); 
DrawPacMan ghost2 = new DrawPacMan(); 

AffineTransform pac = new AffineTransform(); 

public void setPacManView(int waarde) { 
    // set the view of pacman 
    switch (waarde) { 
    case 0 : 
     // here one view of pacman 
     break; 
    case 1 : 
     // here one view of pacman 
     break; 
    case 2 : 
     // here one view of pacman 
     break; 
    case 3 : 
     // here one view of pacman 
     break; 

    } 
} 

public void paintComponent(Graphics g) { 

    super.paintComponent(g); 
    // pacman movement 
    diameter = 75; 
    pacman.drawPacMan(g, getHorPlaats(), getVerPlaats(), diameter, Color.yellow); 

    // ghosts movement 
    int g1x; 
    for(g1x = 0; g1x < 10; g1x++) { 

     pacman.drawGhost(g, g1x, 40, diameter, Color.red); 

    } 
    pacman.drawGhost(g, 170, 70, diameter, Color.blue); 


} 
+0

如果你有一個小的若干意見,如4只寫每個視圖到不同的JPG和顯示哪一個是必需的。 – lynks

+0

你有一個例子如何做到這一點?我只有4個視圖,上,下,左和右 – Reshad

回答

1

它是Swing/AWT嗎?如果是,AffineTransform可能是你要找的。

+0

它與Swing/AWT是的。我會看看它謝謝你! – Reshad

1

鑑於你只有4張圖片。我建議在paint/gimp/photoshop中創建4個jpgs,並將它們加載到您的程序中;

BufferedImage pacUp = ImageIO.read(new File("./images/pac_up.jpg")); 
BufferedImage pacDown = ImageIO.read(new File("./images/pac_down.jpg")); 
//etc 

然後繪圖開關看起來是這樣的(假設Graphics對象g);

switch(direction) { 
    case 0: g.drawImage(pacUp, x, y, null); 
    case 1: g.drawImage(pacDown, x, y, null); 
    case 2: g.drawImage(pacLeft, x, y, null); 
    case 3: g.drawImage(pacRight, x, y, null); 
} 
+0

,但是當它保存爲png/jpg時會影響我的動畫嗎? – Reshad

+0

如果你有動畫pacman,(通過讓他的嘴巴移動,我猜),那麼你有兩個選擇;您可以繪製4xframes PNG,也可以爲4個方向中的每一個複製繪圖/動畫代碼(實際上大多數方向對於所有方向都是通用的)。後一種方法是我想要的。 – lynks

6

嘗試類似...

enter image description here

演示被設計成允許圖像通過虛擬天使旋轉(角> 360),但基本概念是同...

public class TestFlipImage { 

    protected static final String IMAGE_PATH = "/path/to/your/image"; 

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

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

       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 

       BufferedImage image = null; 
       try { 
        image = ImageIO.read(new File(IMAGE_PATH)); 
       } catch (IOException ex) { 
       } 

       JPanel mainPane = new JPanel(new GridBagLayout()); 
       GridBagConstraints gbc = new GridBagConstraints(); 
       mainPane.add(new ImagePane(image, 0)); 
       mainPane.add(new ImagePane(image, 90)); 
       mainPane.add(new ImagePane(image, 180)); 

       frame.add(mainPane); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class ImagePane extends JPanel { 

     private BufferedImage masterImage; 
     private BufferedImage renderedImage; 

     public ImagePane(BufferedImage image, int angle) { 
      masterImage = image; 
      applyRotation(angle); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(renderedImage.getWidth(), renderedImage.getHeight()); 
     } 

     @Override 
     public Dimension getMinimumSize() { 
      return getPreferredSize(); 
     } 

     protected int getVirtualAngle(int angle) { 
      float fRotations = (float) angle/360f; 
      int rotations = (int) (fRotations - (fRotations/1000)); 

      int virtual = angle - (rotations * 360); 

      if (virtual < 0) { 
       virtual = 360 + virtual; 
      } 

      return virtual; 
     } 

     // The code is designed to rotate an image through 90 degree 
     // angles, but it can handle angle's less then 0 and greater then 
     // 360 degrees 
     public void applyRotation(int angle) { 
      // This will only work for angles of 90 degrees... 

      // Normalize the angle to make sure it's only between 0-360 degrees 
      int virtualAngle = getVirtualAngle(angle); 
      Dimension size = new Dimension(masterImage.getWidth(), masterImage.getHeight()); 
      int masterWidth = masterImage.getWidth(); 
      int masterHeight = masterImage.getHeight(); 

      double x = 0; //masterWidth/2.0; 
      double y = 0; //masterHeight/2.0; 

      switch (virtualAngle) { 
       case 0: 
        break; 
       case 180: 
        break; 
       case 90: 
       case 270: 
        size = new Dimension(masterImage.getHeight(), masterImage.getWidth()); 
        x = (masterHeight - masterWidth)/2.0; 
        y = (masterWidth - masterHeight)/2.0; 
        break; 
      } 
      renderedImage = new BufferedImage(size.width, size.height, masterImage.getTransparency()); 
      Graphics2D g2d = renderedImage.createGraphics(); 

      AffineTransform at = AffineTransform.getTranslateInstance(x, y); 

      at.rotate(Math.toRadians(virtualAngle), masterWidth/2.0, masterHeight/2.0); 
      g2d.drawImage(masterImage, at, null); 

      g2d.dispose(); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 

      Graphics2D g2d = (Graphics2D) g; 
      int width = getWidth() - 1; 
      int height = getHeight() - 1; 

      int x = (width - renderedImage.getWidth())/2; 
      int y = (height - renderedImage.getHeight())/2; 

      g2d.drawImage(renderedImage, x, y, this); 
     } 
    } 
} 

附加

你也可能想看看AffineTransform.rotate() - how do I xlate, rotate, and scale at the same time? WCH討論一種手段其水平和垂直軸翻轉圖像