Заставить Graphics.drawLine следовать за мышью без расширения - PullRequest
0 голосов
/ 10 апреля 2019

Я делаю простую игру-шутер, чтобы попрактиковаться в кодировании, и я пытаюсь сделать указатель так, чтобы он прицеливался туда, куда я хочу стрелять, у меня есть движение линии, чтобы следовать за моей мышью, но оно расширяет ееполучает дальше от центра.Я хочу повернуться почти так, как будто есть точка поворота.

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, а расширяется, чтобы следовать за мышью.

1 Ответ

0 голосов
/ 11 апреля 2019

В вашем коде есть ошибки:

  • Вам нужно добавить панель в рамку.
  • Вам нужно вызвать метод рисования.
  • Вам нужно установить цвет при рисовании.
  • Вы должны рассчитать первую точку по текущему размеру вашей панели вместо постоянной точки.

Вот рабочий код:

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();
    }
}
...