2012-03-07 5 views
2

私はトップダウンシューティングゲームを試してみるためにベクトルと回転についてもっと学びたいと思っています。今私はマウスカーソルにイメージポイントを作ろうとしています。画像の半分にしか作用しません。なぜなら、角度が小さくなる前に180度になるためです。どのようにして180度を超えて角度を上げることができますか?私の質問がちょっと混乱してコードを実行するだけで、私の問題が見えます。マウスカーソルでイメージポイントを作る

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.MouseInfo; 
import java.awt.Point; 
import java.awt.PointerInfo; 
import java.awt.geom.AffineTransform; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.vecmath.Vector2d; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Test extends JPanel implements Runnable{ 
    BufferedImage img; 
    double angle; 
    int imgw; 
    int imgh; 
    JFrame f; 
    PointerInfo cursor = MouseInfo.getPointerInfo(); 
    Point point = new Point(cursor.getLocation()); 
    AffineTransform at = new AffineTransform(); 

    public Test(JFrame f){ 
     this.f = f; 
     setSize(400, 400); 

     try { 
      img = ImageIO.read(new File("res/rocket.png")); 
     } catch (IOException e) {} 

     imgw = img.getWidth(); 
     imgh = img.getHeight(); 

     Thread t = new Thread(this); 
     t.start(); 
    } 

    public static void main(String[] Args){ 
     JFrame frame = new JFrame(); 

     frame.add(new Test(frame)); 
     frame.setVisible(true); 
     frame.setSize(400,400); 
    } 

    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 

     Graphics2D g2 = (Graphics2D)g; 
     g2.drawImage(img,at,this); 
    } 

    public void run(){ 
     while(true){ 
      cursor = MouseInfo.getPointerInfo(); 
      point = new Point(cursor.getLocation()); 
      SwingUtilities.convertPointFromScreen(point, f); 

      Vector2d mouse = new Vector2d(point.getX(),point.getY()); 
      Vector2d rocket = new Vector2d(100,100); 
      Vector2d facing = new Vector2d(0, -1); 

      mouse.sub(rocket); 
      mouse.normalize(); 
      facing.normalize(); 

      angle = mouse.angle(facing); 
      System.out.println(Math.toDegrees(angle)); 
      at.setToTranslation(100,100); 
      at.rotate(angle, imgw/2, imgh/2); 
      repaint(); 

      try {Thread.sleep(25); 
      } catch (InterruptedException e) {} 
     } 
    } 
} 
+0

*「私の質問がちょっと混乱してコードを実行しただけで、私の問題が表示されます」*コードにはインポートがありません。 rocket.png'。どのように地球上で私たちは '問題を見て'期待しています。もっと早く助けを求めるには、[SSCCE](http://sscce.org/)を投稿してください。イメージへのホットリンクまたはJREイメージからのイメージへのリンク。 –

+0

@AndrewThompson私は輸入品を追加しました。なぜ私がそれを忘れたか分からない。私が使用している画像は次のとおりです:http://findicons.com/files/icons/1495/space/32/rocket_ship.png私はマウスカーソルで先端点を作ろうとしています。 – user1150769

+0

+1の完全な例 –

答えて

3

Vector2dの角法は、少しハックでthe return value is constrained to the range [0,PI].が、私はポインタがロケット

if(point.getX()<100){ 
      angle=(Math.PI*2-angle); 
} 
に残っている場合の角度を調整することで、あなたが探しているものを得ることができたと述べています

[EDIT]またはそれ以上は、Mathによって角度を計算すると、すべての

Point procket=new Point(100,100); 
angle=(Math.atan2(point.getY()-procket.getY(), point.getX()-procket.getX())+(Math.PI/2)); 

pointがあなたの元のマウスポインタであることを簡素化ポイントと参照軸を調整するための余分なPI/2)

+0

うわー、ありがとう!それは今、完璧に動作します。 – user1150769

関連する問題