无法让我的 MouseListener 为高中的口袋妖怪游戏工作

Posted

技术标签:

【中文标题】无法让我的 MouseListener 为高中的口袋妖怪游戏工作【英文标题】:Having trouble getting my MouseListener to work for a Pokemon game for high school 【发布时间】:2019-08-30 04:59:31 【问题描述】:

我有一个游戏类,其中大部分渲染和框架都已完成。我有一个鼠标监听器类。我还有一个名为 Menu 的类,它在画布上绘制菜单。我希望它在我点击“开始”按钮时真正开始游戏,但似乎 MouseListener 没有收到鼠标点击。

我尝试在整个 Game 课程的许多地方添加 addMouseListener(new MouseInput()) 行,但它不起作用。

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) 为了尽快获得更好的帮助,edit 添加minimal reproducible example 或Short, Self Contained, Correct Example。 2) 请对代码和代码 sn-ps、html/XML 等结构化文档或输入/输出使用代码格式。为此,请选择文本并单击消息发布/编辑表单顶部的 按钮。 3) 源代码中的一个空白行是永远需要的。 之后或 之前的空行通常也是多余的。 【参考方案1】:

如果您使用的是BufferStrategy,请不要在JFrame 上拨打super.paint(g);。只需直接绘制到缓冲区即可。您还应该将MouseListener 添加到Canvas,而不是框架。

Canvas 布局在窗口的框架边界内,这意味着它将偏移并且小于实际框架本身。

鼠标事件会自动转换为源坐标上下文,这意味着,您当前正在尝试将来自框架坐标上下文的值与 Canvas 使用的不同值进行比较

一个问题:如果缓冲区没有诸如fillRect()之类的“图形方法”,我将如何直接绘制到缓冲区?

Graphics g = bufferStrategy.getDrawGraphics() 为您提供Graphics 上下文,然后您直接对其进行绘制。

你不想(永远)直接调用paint,因为它可以被系统调用,你可能会遇到竞争条件和其他问题

Swing 使用不同的绘制算法,您已通过使用 BufferStrategy 选择退出,这意味着您不能再使用“正常”的 Swing 绘制过程,而是必须自己编写

【讨论】:

非常感谢,这真的很有帮助。一个问题:如果缓冲区没有诸如fillRect()之类的“图形方法”,我将如何直接绘制到缓冲区? Graphics g = bufferStrategy.getDrawGraphics(); 为您提供Graphics 上下文,然后您直接对其进行绘制。你不想(永远)直接调用paint,因为它可以被系统调用,你可能会遇到竞争条件和其他问题

以上是关于无法让我的 MouseListener 为高中的口袋妖怪游戏工作的主要内容,如果未能解决你的问题,请参考以下文章

可编辑 JavaFX ComboBox 上的 MouseListener

当在子组件中添加其他 MouseListener 时,父组件的 MouseListener 在子组件中不起作用

我仍然无法让我的 UI 滚动视图滚动! iOS

Tony的口胡呼呼(。-ω-)zzz

无法让我的 .html 文件保存在 chrome 中

使用 acm.graphics 时 mouseListener 的语法是啥