MouseListener "наполовину работает" в моем апплете

Поэтому я исследовал Applets и использовал Canvas и BufferStrategy в апплете. Я получил его в буфер и показать правильно, но я думаю, что это как-то мешает MouseListener. Когда я запускаю апплет и изменяю размер экрана, MouseListener работает вне моего указанного холста. Поэтому, когда я перемещаю мышь над тем местом, где она рисует, координаты мыши замирают. Затем, когда я убираю мышь с холста, это работает. Так что с MouseListener все в порядке. Я все равно включу это.

Класс MouseMotion:

public class MouseMotion implements MouseMotionListener{
    private int x;
    private int y;
    public MouseMotion()
    {
        x = 0;
        y = 0;
        System.out.println("MouseMotion initialized");
    }

    public void mouseDragged(MouseEvent e) {}

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

    //Return methods...
}

Мышь класс:

public class Mouse implements MouseListener{
    private int clickedX;
    private int clickedY;
    private int clickedButton;

    private boolean pressed;
    private int pressedX;
    private int pressedY;
    private int pressedButton;

    public Mouse()
    {
        //Instantiates all the variables
        System.out.println("Mouse initialized");
    }

    public void mouseClicked(MouseEvent e) {
        clickedX = e.getX();
        clickedY = e.getY();
        clickedButton = e.getButton();
    }

    public void mousePressed(MouseEvent e) {
        pressed = true;
        pressedX = e.getX();
        pressedY = e.getY();
        pressedButton = e.getButton();
    }

    public void mouseReleased(MouseEvent e) {
        pressed = false;
        pressedX = 0;
        pressedY = 0;
        pressedButton = 0;
    }

    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}

    //Methods that return each variable...
}

Класс AppletMain:

    public class AppletMain extends Applet implements Runnable{

    //Constants
    private final int WIDTH = 720;
    private final int HEIGHT = WIDTH / 16 * 9;

    //Applet objects
    private BufferStrategy bs;
    private Canvas canvas;

    //Game loop variables
    ...

    //Engine objects
    private Mouse mouse;
    private MouseMotion mouseMotion;

    public void init()
    {
        canvas = new Canvas();

        mouse = new Mouse();
        mouseMotion = new MouseMotion();
        addMouseListener(mouse);
        addMouseMotionListener(mouseMotion);
    }

    public void render()
    {
        //Setup graphics
        Graphics2D g = (Graphics2D)bs.getDrawGraphics();

        g.clearRect(0,0,WIDTH,HEIGHT);

        //Just prints out the debugging stuff
        g.setColor(Color.BLACK);
        g.drawRect(0,0,WIDTH-1,HEIGHT-1);
        g.drawString("TPS: " + Integer.toString(tps) + " FPS: " + Integer.toString(fps), 2,20);
        g.drawString("MouseMotion: X - " + Integer.toString(mouseMotion.getX()) + " Y - " + Integer.toString(mouseMotion.getY()), 2,40);
        g.drawString("Mouse(PRESSED): X - " + Integer.toString(mouse.getPressedX()) + " Y - " + Integer.toString(mouse.getPressedY()) + " button - " + Integer.toString(mouse.getPressedButton()), 2,60);
        g.drawString("Mouse(CLICKED): X - " + Integer.toString(mouse.getClickedX()) + " Y - " + Integer.toString(mouse.getClickedY()) + " button - " + Integer.toString(mouse.getClickedButton()), 2,80);

        //Cleanup graphics
        g.dispose();
        bs.show();
    }

    public void tick()
    {
        //Ticks the game
    }

    public void start()
    {
        if(bs == null)
        {
            setIgnoreRepaint(true);
            canvas.setIgnoreRepaint(true);
            canvas.setSize(WIDTH,HEIGHT);
            setLayout(null);
            add(canvas);
            canvas.setLocation(0,0);

            canvas.createBufferStrategy(3);
            bs = canvas.getBufferStrategy();
        }

        new Thread(this).start();

        canvas.requestFocus();
    }

    public void stop()
    {
        running = false;
    }

    public void destroy()
    {
        if(running)
            running = false;
    }

    public void run()
    {
        init();
        //Game loop that calls tick() and render() 60 times per second
    }
}

В своем коде я нарисовал черный прямоугольник вокруг холста, и, как я уже говорил, когда моя мышь входит в черный ящик, координаты перестают изменяться. "Fps" и "tps" продолжают работать, которые увеличиваются игровым циклом, так что я знаю, что он все еще работает. Когда мышь выходит из поля, координаты снова начинают меняться, когда я перемещаю ее по окну.

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

0 ответов

Другие вопросы по тегам