0

大家下午好,我正在尝试根据鼠标位置旋转多边形,但我不知道如何根据鼠标 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。

4

1 回答 1

0

在您的评论中,您写道:

我正在使用一本使用 Java 6 的书

您指的是《Beginning Java SE 6 Game Programming, Third Edition 》一书吗?

java applet是一个容器, JPanel也是一个,因此您可以通过扩展类JPanel而不是扩展来获得相同的结果Applet。这意味着您可以编写常规的 java 应用程序,而无需 HTML 或 Web 浏览器。

您需要覆盖类paint()中的方法,而不是覆盖其中的方法。AppletpaintComponent()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()超类中的方法。

于 2020-04-17T11:55:33.397 回答