游戏编程菜单,鼠标检测方法不起作用
Programming Menu for Game, Mouse detection method not working
这是我的方法的代码,它应该检测鼠标点击是否在我定义的矩形内。
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 我的 = 344 x = 210 y = 350 宽度 = 200 高度 = 64
该数据来自在矩形内单击鼠标,因此如果它正常工作,它应该返回 true。
可能是返回了错误的鼠标按下坐标?
有什么想法吗?
如果有任何区别,我正在使用 mac。
你的不等式运算符是错误的。
(mx < x && mx < x + width)&&(my < y && my < y + height)
应该是:
(x < mx && mx < x + width)&&(y < my && my < y + height)
之前,您只是检查鼠标的 x 和 y 位置是否低于矩形上的任何点。
查看鼠标点位置的一种简单方法是使用矩形对象及其 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 对象后,您可以而且甚至应该使用相同的 Rectangle 进行绘制。
但话虽如此,我们只是治标不治本,因为您的程序结构让我担心。其一,你有太多神奇的数字,并且有难以调试错误的风险。此外,您正在对数据进行硬编码,这会使您的程序变得僵硬,因此难以增强和扩展。此外,您将视图与模型完全混合在一起,这也使您的代码比它必须的复杂得多,因此很难调试、修改和增强。
我解决了。我将 x 坐标数据发送到等式中的 y 值,反之亦然。
这是我的方法的代码,它应该检测鼠标点击是否在我定义的矩形内。
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 我的 = 344 x = 210 y = 350 宽度 = 200 高度 = 64 该数据来自在矩形内单击鼠标,因此如果它正常工作,它应该返回 true。 可能是返回了错误的鼠标按下坐标?
有什么想法吗? 如果有任何区别,我正在使用 mac。
你的不等式运算符是错误的。
(mx < x && mx < x + width)&&(my < y && my < y + height)
应该是:
(x < mx && mx < x + width)&&(y < my && my < y + height)
之前,您只是检查鼠标的 x 和 y 位置是否低于矩形上的任何点。
查看鼠标点位置的一种简单方法是使用矩形对象及其 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 对象后,您可以而且甚至应该使用相同的 Rectangle 进行绘制。
但话虽如此,我们只是治标不治本,因为您的程序结构让我担心。其一,你有太多神奇的数字,并且有难以调试错误的风险。此外,您正在对数据进行硬编码,这会使您的程序变得僵硬,因此难以增强和扩展。此外,您将视图与模型完全混合在一起,这也使您的代码比它必须的复杂得多,因此很难调试、修改和增强。
我解决了。我将 x 坐标数据发送到等式中的 y 值,反之亦然。