Как повернуть что-то вверх в зависимости от положения мыши в Java - PullRequest
0 голосов
/ 16 апреля 2020

Добрый день, ребята, я пытаюсь повернуть многоугольник в зависимости от положения мыши, но я не могу понять, как повернуть многоугольник вверх на основе моей мыши y. Я использую MouseMotionListener. Я пытался делать это до сих пор:

    public void mouseMoved(MouseEvent m){
             int yantes= m.getY();
             while (true){
                int y = m.getY();
                repaint();
                if (y - yantes > 0){
                  rotation++;
                  if (rotation > 360) rotation = 0; 
                  repaint();
                  break;    
                } else {
                    rotation--;
                    if (rotation < 0) rotation = 359; 
                    repaint();
                    break;  
                }
            }

        }

Переменная yantes пытается вычислить y до движения, а y y после движения.

1 Ответ

0 голосов
/ 17 апреля 2020

В вашем комментарии вы написали:

Я использую книгу, которая использовала Java 6

Вы имеете в виду book Начало Java SE 6 Программирование игр, третье издание ?

A java applet - это Контейнер и JPanel , поэтому вы можете достичь тех же результатов, расширив класс JPanel, а не Applet. Это означает, что вы можете написать обычное java приложение без необходимости HTML или веб-браузера.

Вместо переопределения метода paint() в Applet, вам необходимо переопределить метод paintComponent() в класс JPanel.

Приведенный ниже код демонстрирует вращение квадрата путем перемещения мыши. Он вращает квадрат вокруг центральной точки квадрата. Когда вы помещаете мышь внутрь JPanel и перемещаете ее влево, квадрат вращается против часовой стрелки. Когда вы перемещаете мышь вправо, квадрат вращается по часовой стрелке. Если вы перемещаете мышь вверх и вниз, то есть параллельно оси y, квадрат не поворачивается.

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class Rotating extends JPanel implements Runnable, MouseMotionListener {
    private int  theta;
    private int  lastX = Integer.MIN_VALUE;
    private BasicStroke  stroke;
    private JFrame  frame;

    /**
     * Creates and returns instance of this class.
     */
    public Rotating() {
        stroke = new BasicStroke(2.0f);
        addMouseMotionListener(this);
        setPreferredSize(new Dimension(600, 600));
    }
/* Start 'MouseMotionListener' interface methods. */
    @Override // javax.swing.event.MouseInputListener
    public void mouseDragged(MouseEvent mousEvnt) {
        // Do nothing.
    }

    @Override // javax.swing.event.MouseInputListener
    public void mouseMoved(MouseEvent mousEvnt) {
        int newX = mousEvnt.getX();
        if (lastX == Integer.MIN_VALUE) {
            lastX = newX;
        }
        if (newX < lastX) {
            theta--;
            if (theta < 0) {
                theta = 359;
            }
        }
        else if (newX > lastX) {
            theta++;
            if (theta > 360) {
                theta = 0;
            }
        }
        lastX = newX;
        repaint();
    }
/* End 'MouseMotionListener' interface methods. */
/* Start 'Runnable' interface methods. */
    @Override
    public void run() {
        showGui();
    }
/* End 'Runnable' interface methods. */
    @Override // javax.swing.JComponent
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (g instanceof Graphics2D) {
            Graphics2D g2d = (Graphics2D) g;
            g2d.rotate(Math.toRadians(theta), 300, 300);
            g2d.setStroke(stroke);
            g2d.drawRect(200, 200, 200, 200);
        }
    }

    private void showGui() {
        frame = new JFrame("Rotating");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(this, BorderLayout.CENTER);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Rotating());
    }
}

Обратите внимание, что при переопределении метода paintComponent() почти всегда необходимо сначала вызвать метод paintComponent() в суперклассе.

...