Возникли проблемы с тем, чтобы заставить мой MouseListener работать для игры в покемонов для средней школы - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть класс для игры, в котором делается большая часть рендеринга и фреймворка. У меня есть класс для слушателя мыши. У меня также есть класс Menu, который рисует меню на холсте. Я хочу, чтобы он действительно запускал игру, когда я нажимал на кнопку «Пуск», но похоже, что MouseListener не получает щелчок мыши.

Я пытался поставить строку addMouseListener(new MouseInput()) во многих местах класса Game, но она не будет работать.

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class MouseInput implements MouseListener
{

    public void mousePressed(MouseEvent e) 
    {
    int mx = e.getX();
    int my = e.getY();
        if(Game.STATE == 0)
        {
            if(mx >= 415 && mx <= 615)
            {
                if(my >= 350 && my <= 425)  
                {
                    Game.STATE = Game.STATE + 1;
                }
            }

            if(mx >= 415 && mx <=615)
            {
                if(my >= 500 && my <= 575)
                {
                    System.exit(1);
                }

            }
        }
    }
}

// Игровой класс

public class Game extends JFrame implements Runnable
{

    private Canvas c = new Canvas();
    public static int STATE = 0;
    public static final int WIDTH = 1000;
    public static final int HEIGHT = 800;
    private Menu menu;
    private FightState fight;



    public Game()
    {
        //Forces program to close when panel is closed
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //sets position and size of Frame
        setBounds(0, 0, WIDTH, HEIGHT);

        //puts Frame in center of the screen
        setLocationRelativeTo(null);

        //adds canvas to game
        add(c);

        //Makes frame visible
        setVisible(true);

        //creates our object for buffer strategy
        c.createBufferStrategy(2);

//      adds the mouse listner;
        addMouseListener(new MouseInput());



    }


    public void update()
    {

    }

    //renders the graphics onto the screen
    public void render()
    {
        BufferStrategy bufferStrategy = c.getBufferStrategy();
        Graphics g = bufferStrategy.getDrawGraphics();
        super.paint(g);


        //instantiates the menu object
        menu = new Menu();
        //instantiates the FightState object
        fight = new FightState();

        //renders the menu
            if(STATE == 0)
            {
                menu.render(g);
            }
        //renders the fight stage
            if(STATE == 1)
            {
                fight.render(g);
            }   

            g.setFont(new Font("Monospaced", Font.PLAIN, 35));
            g.drawString("STATE: " + STATE, 10, 400);
            repaint();

            //checks if mouseListener is working
            System.out.print(STATE);

            g.dispose();
            bufferStrategy.show();

    }

    //game loop
    public void run()
    {
        BufferStrategy bufferStrategy = c.getBufferStrategy();

        long lastTime = System.nanoTime(); //long is an int that stores more space
        double nanoSecondConvert = 1000000000.0 / 60; //frames/sec
        double deltaSeconds = 0;




        while(true)
        {
            long now = System.nanoTime();

            deltaSeconds += (now-lastTime)/nanoSecondConvert;

            while(deltaSeconds >=1)
            {
                update();
                deltaSeconds = 0;
            }

            render();
            lastTime = now;
            System.out.println("STATE: " + STATE);
        }

    }


    //main method
    public static void main(String[] args)
    {
        Game game = new Game();
        Thread gameThread = new Thread(game);
        gameThread.start();
    }
}

1 Ответ

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

Не звоните super.paint(g); на JFrame, если вы используете BufferStrategy.Просто рисуйте прямо в буфер.Вы также должны добавить MouseListener к Canvas, а не к рамке.

Canvas выложен ВНУТРИ границ рамок окна, то есть он будет смещен и меньше фактическогосам кадр.

События мыши автоматически преобразуются в контекст координат источника, это означает, что вы в настоящее время пытаетесь сравнить значения, поступающие из контекста координат кадра, со значениями, используемыми Canvas, которые отличаются

Один вопрос: как бы я рисовал непосредственно в буфер, если в буфере нет «графических методов», таких как fillRect ()?

Graphics g = bufferStrategy.getDrawGraphics() дает вам контекст Graphics, вы затем рисуете прямо к нему.

Вы не хотите вызывать paint напрямую (когда-либо), так как это может быть вызвано системой, и вы можете столкнуться с условиями гонки и другими проблемами

Swing использует другой алгоритм рисования, из которого вы отказались, используя BufferStrategy, это означает, что вы больше не можете использовать "нормальный" процесс рисования Swing и вместо этого должны написать свой собственный

...