Создание изображения наведением курсора мыши - PullRequest
2 голосов
/ 07 марта 2012

Я пытаюсь узнать больше о векторах и вращении, чтобы я мог попробовать сделать шутер сверху вниз.Прямо сейчас я пытаюсь навести курсор на курсор мыши.Он работает только на одной половине изображения, потому что я могу получить угол 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) {}
        }
    }
}

1 Ответ

3 голосов
/ 07 марта 2012

Метод угла в 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 для регулировки оси отсчета) * +1010 *

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