鼠标单击 Java

3

我跟随一个关于在Java中创建迷宫游戏的教程。完成后,我决定添加一些东西(主菜单、更多关卡等)。我目前被主菜单卡住了,因为我无法使鼠标输入起作用。我试图在“开始游戏”框中左键单击时切换到屏幕=1。这是该类的当前代码。

package Maze;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class Board extends JPanel implements ActionListener{
    private Timer timer;    
    private Map m;
    private Player p;
    private int screen = 0;
    private String Message = "";
    private Font font = new Font("Serif", Font.BOLD, 48);
    private Font start = new Font("Serif", Font.BOLD, 36);
    private Rectangle start2 = new Rectangle(135,350,180,55);


    public Board(){
        m = new Map();
        p = new Player();
        addKeyListener(new Al());
        addMouseListener(new A2());
        setFocusable(true);     
        timer = new Timer(25,this);
        timer.start();
    }
    public void actionPerformed(ActionEvent e){ 
        if(m.getMap(p.getTileX(),p.getTileY()).equals("f")){
            Message = "Winner";
            screen = 10;
        }
        repaint();
    }
    public void paint(Graphics g){
        super.paint(g);
        if(screen==0){
            g.setColor(Color.BLACK);
            g.fillRect(0, 0, 464, 485);
            g.setColor(Color.RED);
            g.setFont(font);
            g.drawString("Maze Game", 100,50);
            g.setFont(start);
            g.setColor(Color.WHITE);
            g.drawString("Created by: ", 135,90);
            g.drawString("Chad Jordan", 125,130);
            g.setColor(Color.PINK);
            g.fillRect(start2.x, start2.y, start2.width, start2.height);
            g.setColor(Color.WHITE);
            g.drawString("Start Game", start2.x, start2.y+40);

        }

        if((screen==1)){
            for(int y = 0; y<14;y++){
                for(int x=0; x<14; x++){
                    if(m.getMap(x, y).equals("g")){
                        g.drawImage(m.getGrass(),  x*32, y*32, null);
                    }
                    if(m.getMap(x, y).equals("w")){
                        g.drawImage(m.getWall(),  x*32, y*32, null);
                    }
                    if(m.getMap(x,y).equals("f")){
                        g.drawImage(m.getFinish(), x*32, y*32, null);
                    }
                }
            }
            g.drawImage(p.getPlayer(), p.getTileX()*32, p.getTileY()*32, null);
        }
        if(screen==10){
            g.setColor(Color.BLACK);
            g.setFont(font);
            g.drawString(Message, 150,200);
        }

    }

    public class A2 extends MouseAdapter{
        public void MousePressed(MouseEvent e){
            int mx = e.getX();
            int my = e.getY();
            System.out.println("2");
            if((screen ==0) && start2.contains(mx,my)){
                screen=1;
                System.out.println("1");
            }
        }
        public void mouseClicked(MouseEvent e) {

        }
        public void mouseEntered(MouseEvent e) {

        }
        public void mouseExited(MouseEvent e) {

        }
        public void mousePressed(MouseEvent e) {

        }
        public void mouseReleased(MouseEvent e) {

        }
    }

    public class Al extends KeyAdapter{
        public void keyPressed(KeyEvent e){
            int keycode = e.getKeyCode();
            if(( keycode == KeyEvent.VK_W) || (keycode == KeyEvent.VK_UP)){
                if(!m.getMap(p.getTileX(),p.getTileY() -1).equals("w")){
                    p.move(0, -1);
                }
            }
            if(( keycode == KeyEvent.VK_A) || (keycode == KeyEvent.VK_LEFT)){
                if(!m.getMap(p.getTileX()-1,p.getTileY()).equals("w")){
                p.move(-1, 0);
                }
            }
            if(( keycode == KeyEvent.VK_D) || (keycode == KeyEvent.VK_RIGHT)){
                if(!m.getMap(p.getTileX()+1,p.getTileY()).equals("w")){
                    p.move(1, 0);
                }
            }
            if(( keycode == KeyEvent.VK_S) || (keycode == KeyEvent.VK_DOWN)){
                if(!m.getMap(p.getTileX(),p.getTileY() +1).equals("w")){
                    p.move(0, 1);
                }
            }
        }
        public void keyReleased(KeyEvent e){

        }
        public void keyTyped(KeyEvent e){

        }   
    }
}

我使用了"System.out.println("1");"来查看鼠标按下是否被注册,但它没有打印出来。

当您将 System.out.println("1"); 放在 if 语句之外时,它仍然不会打印吗?还有,为什么要打印呢?只需设置断点并调试即可(即使不使用集成开发环境,但它会有所帮助...)。 - Eran Medan
3个回答

7

我看到你的问题是大小写问题

你在实现MousePressed时使用了大写字母M

       public void MousePressed(MouseEvent e){
            int mx = e.getX();
            int my = e.getY();
            System.out.println("2");
            if((screen ==0) && start2.contains(mx,my)){
                screen=1;
                System.out.println("1");
            }
        }

还有一个小写的m:

    public void mousePressed(MouseEvent e) {

    }

只需将大写字母M改为小写字母m,并移除多余的mousePressed调用。

例如:

 public class A2 extends MouseAdapter{
    public void mousePressed(MouseEvent e){
        int mx = e.getX();
        int my = e.getY();
        System.out.println("2");
        if((screen ==0) && start2.contains(mx,my)){
            screen=1;
            System.out.println("1");
        }
    }
    public void mouseClicked(MouseEvent e) {

    }
    public void mouseEntered(MouseEvent e) {

    }
    public void mouseExited(MouseEvent e) {

    }
    public void mouseReleased(MouseEvent e) {

    }
}

1
谢谢,这就是问题所在。我已经为此工作了几个小时>< - Chad

4
您遇到的主要问题是将鼠标按下的方法命名不正确。
请更改为:
public void MousePressed(MouseEvent e)

To

public void mousePressed(MouseEvent e)

我建议您使用@Override注解,如果您犯了这个错误,它将导致编译器错误。

我还鼓励使用键绑定API而不是KeyListener和paintComponent而不是paint。

在更改屏幕变量后,您可能还需要调用repaint以更新屏幕。


是的,加1分是因为提到了@Override - Eran Medan

-1

public void nousePressed(MouseEvent e) 不是 public void MousePressed(MouseEvent e)


1
问题已经得到回答,而你的回答中有一个打字错误。 - Tony BenBrahim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接