游戏编程菜单,鼠标检测方法不起作用

时间:2015-05-21 03:19:23

标签: java slick2d

这是我的方法的代码,用于检测鼠标是否在我定义的矩形内。

 private boolean mouseOver(int mx,int my,int x, int y, int width, int height){



    if((x < mx  && mx < x + width)&&(y < my && my < y + height)){
        System.out.print(mx+"\n"+my+"\n"+x+"\n"+y+"\n"+width+"\n"+height+"\n");
    return true;

    }else 
       System.out.print(mx+"\n"+my+"\n"+x+"\n"+y+"\n"+width+"\n"+height+"\n");
        return false;


}

这是我定义矩形(带文字)的地方。

public void render(Graphics g){
    Font fnt = new Font("arial", 1, 50);
    Font fnt1 = new Font("arial", 1, 30);
    g.setColor(Color.white);

    g.setFont(fnt);
    g.drawString("Menu", 240,70);
    g.setFont(fnt1);
    g.drawString("Play", 270,190);
    g.drawRect(210, 150, 200, 64);
    g.drawString("Scores", 270,290);
    g.drawRect(210, 250, 200, 64);
    g.drawString("Quit", 270,390);
    g.drawRect(210, 350, 200, 64);
}

这是使用该方法的地方。

public void mousePressed(MouseEvent e){
    int mx = e.getY();
    int my = e.getX();
    //play button
    if (mouseOver(mx ,my ,210, 150, 200, 64)){
        game.gameState = STATE.Game;
    }
    //quit button
    if (mouseOver(mx ,my ,210, 350, 200, 64)){

        System.exit(1);

    }
}

当调用该方法时,我命令它吐出所需的字段,这是一个例子。

mx = 185 my = 344 x = 210 y = 350 width = 200 height = 64 该数据来自单击矩形内部的鼠标,因此如果它正常工作它应该返回true。 也许它会返回错误的鼠标坐标?

有什么想法吗? 如果这有任何区别,我会使用mac。

3 个答案:

答案 0 :(得分:4)

查看鼠标点在哪里使用Rectangle对象及其contains(Point p)方法的一种简单方法。

例如:

// constant section of your program
private static final STATE_RECTANGLE = new Rectangle(210, 150, 200, 64);
private static final QUIT_RECTANGLE = new Rectangle(210, 350, 200, 64);

// elsewhere
public void mousePressed(MouseEvent e){
    //play button
    if (STATE_RECTANGLE.contains(e.getPoint())) {
        game.gameState = STATE.Game;
    }
    //quit button
    if (QUIT_RECTANGLE.contains(e.getPoint())){
        System.exit(1);
    }
}

通过强制转换将Graphics对象转换为Graphics2D对象后,您甚至可以使用相同的矩形进行绘制。

但话虽如此,我们只是治疗一种症状而不是疾病,因为你的程序结构让我担心。对于一个你有太多魔术数字,并且很难调试错误。此外,您正在对数据进行硬编码,这会使您的程序变得僵硬,从而难以增强和扩展。此外,您将视图与模型完全混合,也使您的代码变得比以前复杂得多,因此很难进行调试,修改和增强。

答案 1 :(得分:3)

您的不平等运算符是错误的。

(mx < x  && mx < x + width)&&(my < y && my < y + height)

应该是:

(x < mx  && mx < x + width)&&(y < my && my < y + height)

之前,您只是检查鼠标的x和y位置是否低于矩形上的任何点。

答案 2 :(得分:1)

我解决了。我将x坐标数据发送到等式中的y值,反之亦然。