首页 > 解决方案 > 使 Graphics.drawLine 跟随鼠标而不扩展

问题描述

我正在制作一个基本的泡泡射击游戏来练习我的编码,我正在尝试制作指针,以便它可以瞄准我想要它射击的地方,我有线条移动跟随我的鼠标,但它会延伸一个它变得更远从中心。我想几乎像有一个支点一样转动。

public static void pointer(Graphics g) {
    g = panel.getGraphics();
    g.drawLine(325, 530, x, 450);
    g.fillRect(325, 530, x, 450);

}

public static void UI() {
    frame = new JFrame("Bubble shooter");
    panel = new JPanel();

    panel.setBackground(Color.white);
    panel.setLayout(null);

    frame.setSize(650,550);
    frame.setResizable(false);
    frame.setVisible(true);
    //frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new BorderLayout());
    frame.addMouseMotionListener(new MouseMotionListener() {

        @Override
        public void mouseDragged(MouseEvent e) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseMoved(MouseEvent e) {
            mouseMoving = true;

            x = e.getX();

            System.out.println("X: " + e.getX());
            System.out.println("Y: " + e.getY());

        }

    });

我试图让这条线跟随我的鼠标而不会增长或缩小到一个枢轴点。相反,该线不通过设置的 y 坐标,而是延伸到跟随鼠标。

标签: javagraphicsgame-physics

解决方案


您的代码中有一些错误:

  • 您需要将面板添加到框架。
  • 你需要调用你的绘图方法。
  • 您需要在绘图时设置颜色。
  • 您应该通过面板的当前大小而不是恒定点来计算第一个点。

这是一个工作代码:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

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

public class MouseTest {
    int x = -1;
    int y = -1;

    public void pointer(Graphics g) {
        if (x < 0) {
            return;
        }
        g.setColor(Color.BLUE);
        Rectangle bounds = g.getClipBounds();
        int startX = (int) (bounds.getWidth() / 2);
        int startY = (int) bounds.getHeight();
        g.drawLine(startX, startY, x, y);
    }

    public void UI() {
        JFrame frame = new JFrame("Bubble shooter");
        JPanel panel = new JPanel() {
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                pointer(g);
            }
        };

        panel.setBackground(Color.white);
        panel.setLayout(null);

        frame.setSize(650,550);
        frame.setResizable(false);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());
        frame.add(panel);
        frame.addMouseMotionListener(new MouseMotionListener() {
            @Override
            public void mouseDragged(MouseEvent e) {
            }

            @Override
            public void mouseMoved(MouseEvent e) {
                x = e.getX();
                y = e.getY();
                panel.repaint();
            }
        });
    }

    public static void main(String[] args) {
        MouseTest mouseTest = new MouseTest();
        mouseTest.UI();
    }
}

推荐阅读