我遇到了一个问题,无论我多长时间研究类和超类的API,我都想不出来。
假设我想设计一种游戏,其中鼠标运动控制用于反弹球的块的运动,然后销毁多色砖。
你如何专门让这个块“听”鼠标? 以下代码是我试图获得预期结果的代码。
/** Breakout Program*/
public class Breakout extends GraphicsProgram implements MouseMotionListener {
...
/** The Paddle Itself */
private GRect paddle = new GRect(0, HEIGHT-PADDLEBOTTOM_OFFSET, PADDLEWIDTH, PADDLEHEIGHT);
...
/** Run the Breakout program. */
public void run() {
paddle.setFillColor(Color.BLACK);
paddle.setFilled(true);
add(paddle);
paddle.addMouseListener(this);
...
}
/** Move the horizontal middle of the paddle to the x-coordinate of the mouse position -
* -but keep the paddle completely on the board. */
public void mouseMoved(MouseEvent e) {
GPoint p= new GPoint(e.getPoint());
double x = p.getX();
paddle.setLocation(x, HEIGHT-PADDLEBOTTOM_OFFSET);
}
}
任何关于为什么/我做错误的做法的澄清都会有所帮助,谢谢。
答案 0 :(得分:1)
您的类已设置为用作鼠标侦听器 - 您只需要告诉某些组件向您发送MouseEvents。为了做到这一点,你需要实现你已经完成的MouseMotionListener,所以你大部分都在那里。
剩下要做的就是在你的JFrame,JDialog或你正在使用的任何窗口上调用方法addMouseMotionListener(this)
。
将来,为了保持代码的正确性,可能需要设置一个单独的类作为监听器;最常见的解决方案称为匿名内部类,您可能需要Google。但随着你的截止日期临近,你所得到的将会很好。
答案 1 :(得分:0)
在mouseMoved()
更新paddle位置后,您通常会在显示组件上调用repaint()
。 GraphicsProgram
对此有何看法?
答案 2 :(得分:0)
看起来所有类都属于您的应用程序,因此我猜您正在使用AWT或Swing。
尝试在球拍上调用repaint()。
答案 3 :(得分:0)
对“Etaoin”的额外评论,当你有时间并且如果你认真做好OO时,请在OO中搜索“is-a”和“has-a”关系。
如果“is-a”关系成立(苹果“is-a”果实)那么它合法使用该类的implements
,否则如果它是“有一个”关系(a汽车“有一个”轮子,但汽车“不是一个”轮子然后implements
是不合适的 - 你需要使用组合,换句话说,一个成员变量上课。
在您的代码中,您是否可以说Breakout
类“是”MouseMotionListener
?答案是“不”,BTW! Breakout
“是一个”游戏,或者是一个应用程序,但MOuseMotionListener是实现的一部分。
正如“Etaoin”所说,你应该将MouseMotionListener实现为一个内部类,虽然我更喜欢私有内部类,而不是匿名类(以保持构造函数的简洁和重点,以及其他原因)。
当你“获得”OO时,它的伟大而且非常强大,但却真正努力使程序化思维的“范式转变”。