2012-09-08 59 views
3

好吧,我試圖讓一個小行星類型的遊戲,我需要能夠旋轉圖像,使船的前面跟隨我的鼠標。我已經找了幾個小時,發現了幾件事,但沒有一件能夠滿足我的需求。旋轉圖像滋擾

如果有人知道如何做到這一點,請分享!

在此先感謝

這裏是代碼我現在已經

package Asteroids; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 

    import javax.swing.ImageIcon; 
    import javax.swing.JFrame; 

    @SuppressWarnings("serial") 
    public class Asteroids extends JFrame implements Runnable, MouseListener, 
      MouseMotionListener, KeyListener { 

     private Image dbImage; 
     private Graphics dbg; 
     int x, y, mx, my; 
     int a, b, c, degree; 
     double scale = 1.0; 
     ImageIcon shipIcon = new ImageIcon(this.getClass().getClassLoader() 
       .getResource("AstroidsShip.png")); 
     Image ship = shipIcon.getImage(); 

     public static void main(String[] args) { 
      Asteroids frame = new Asteroids(); 
      Thread thread = new Thread(frame); 
      thread.start(); 
     } 

     public Asteroids() { 
      addMouseListener(this); 
      addMouseMotionListener(this); 
      addKeyListener(this); 

      setTitle("Astroids"); 
      setSize(500, 500); 
      setBackground(Color.WHITE); 
      setResizable(false); 
      setLocationRelativeTo(null); 
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      setVisible(true); 

      x = getWidth()/2 - 10; 
      y = getHeight() - getHeight()/2; 
     } 

     public void run() { 
      while (true) { 
       try { 

       } catch (Exception e) { 

       } 
      } 
     } 

     public void paint(Graphics g) { 
      dbImage = createImage(getWidth(), getHeight()); 
      dbg = dbImage.getGraphics(); 
      paintComponent(dbg); 
      g.drawImage(dbImage, 0, 0, this); 
     } 

     public void paintComponent(Graphics g) { 
      g.drawString("POS: " + mx + ", " + my, 10, 40); 
      System.out.println(getAngle()); 
      g.drawImage(ship, x, y, this); 
      g.drawLine(x + 12, y + 10, mx, my); 
      repaint(); 
     } 

     public int getAngle() { 
      a = mx - (x + 12); 
      b = (y - 10) - my; 
      return degree = (int) Math.toDegrees(Math.atan2(b, a)); 
     } 

     @Override 
     public void keyTyped(KeyEvent e) { 

     } 

     @Override 
     public void keyPressed(KeyEvent e) { 

     } 

     @Override 
     public void keyReleased(KeyEvent e) { 

     } 

     @Override 
     public void mouseDragged(MouseEvent e) { 

     } 

     @Override 
     public void mouseMoved(MouseEvent e) { 
      mx = e.getX(); 
      my = e.getY(); 
     } 

     @Override 
     public void mouseClicked(MouseEvent e) { 

     } 

     @Override 
     public void mousePressed(MouseEvent e) { 

     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 

     } 

     @Override 
     public void mouseEntered(MouseEvent e) { 

     } 

     @Override 
     public void mouseExited(MouseEvent e) { 

     } 
    } 
+0

這個人可能會幫助你:http://www.youtube.com/watch?v=4wWLEeQSXLQ&feature=relmfu –

+0

我剛剛看過那個視頻,我已經知道如何移動這樣的對象。我需要做的是旋轉我的圖像,船,使它的前面總是看着鼠標。 – XliteRSPS

回答

3

您可以使用Java2D。它允許旋轉圖像並在圖像上執行許多其他很酷的操作。它也獲得了硬件加速支持(通過DirectX或OpenGL)。

Java2D內置於JRE中。

+0

我會但是問題是我不知道如何使用2D。我剛開始學習Java,我編寫了一個名爲XliteRSPS http://www.xlitersps.com的東西,它是一個RuneScape Private服務器,所以我沒有真正處理這些圖形,因爲它們都在遊戲客戶端。 – XliteRSPS

+0

以下是一些示例代碼:http://www.javareference.com/jrexamples/viewexample.jsp?id=88 - 它將與您在遊戲中已經使用的Graphics類一起使用。 – m4tx

+0

好吧,我有點不知道如何使用它。我現在遇到的問題是,當我逆時針轉動它時,它正在順時針旋轉。你知道是否有辦法讓它以另一種方式旋轉或單位圓? – XliteRSPS

2

裏面你的paintComponent方法,可以使代碼看起來像:

public void paintComponent(Graphics g) { 
    g.drawString("POS: " + mx + ", " + my, 10, 40); 
    System.out.println(getAngle()); 
    Graphics2D g2d = new (Graphics2D)g; 
    g2d.translate(X, Y); 
    g2d.rotate(DEGREES); 
    g2d.drawImage(ship, 0, 0, WIDTH, HEIGHT, this); 
    g.drawLine(x + 12, y + 10, mx, my); 
    repaint(); 
} 

對於更復雜的應用,你可以創建一個方法與所有你的船圖紙計算的:

public void paintComponent(Graphics g) { 
    g.drawString("POS: " + mx + ", " + my, 10, 40); 
    System.out.println(getAngle()); 
    drawShip(g); 
    g.drawLine(x + 12, y + 10, mx, my); 
    repaint(); 
} 

public void drawShip(Graphics g){ 
    Graphics2D g2d = (Graphics2D)g; 
    g2d.translate(X, Y); 
    g2d.rotate(DEGREES); 
    g2d.drawImage(ship, 0, 0, WIDTH, HEIGHT, this); 
} 
2

一方法是使用一個來自the methods of AffineTransform之一的旋轉實例,它接受X,Y座標的錨點。

+1

對於[示例](http://rabbitbrush.frazmtn.com/asteroids.html)。 – trashgod

+0

@trashgod嘿..小行星中間怎麼會出現小行星?不公平!儘管樂......;) –

+1

能量盾留作練習。 :-) – trashgod