鼠标移动传感器方法调用

4

我遇到了一个问题,无论我多长时间研究类和超类的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);

        }

}

任何关于我做错的原因/内容的澄清都会很有帮助,谢谢。
4个回答

1
你的类已经可以作为鼠标监听器使用——你只需要告诉一些组件向你发送鼠标事件。为了实现这一点,你需要实现MouseMotionListener,而这一步你已经完成了,所以你已经大功告成了。
唯一剩下的事情是在JFrame、JDialog或任何你正在使用的窗口上调用方法addMouseMotionListener(this)。
将来,值得设置一个独立的类作为监听器,以保持你的代码简洁;最常见的解决方案称为匿名内部类,你可能想要Google一下。但是随着你的截止日期的临近,你已经拥有的东西也可以很好地工作。

0

mouseMoved()更新挡板位置后,您通常会在显示组件上调用repaint()。在GraphicsProgram中是否有任何相关内容?


0

看起来所有的类都属于你的应用程序,所以我猜你正在使用AWT或Swing。

尝试在挡板上调用repaint()。


0

对于“Etaoin”提出的额外评论,如果你有时间并且认真对待面向对象编程,可以搜索一下面向对象中的“is-a”和“has-a”关系。

如果“is-a”关系成立(苹果“is-a”水果),那么在类上使用implements是合法的;否则,如果是“has-a”关系(汽车“has-a”轮子,但汽车“is-not-a”轮子),则implements不适用——你需要使用组合,也就是类的成员变量。

在你的代码中,你能说Breakout类“is-a”MouseMotionListener吗?答案是“不行”,顺便说一句,Breakout是一个游戏或应用程序,而MOuseMotionListener是实现的一部分

正如“Etaoin”所说,你应该将MouseMotionListener实现为内部类,尽管我更喜欢私有内部类,而不是匿名类(这样可以使构造函数简短明了,等等原因)。

当你理解面向对象编程时,它非常强大,但需要真正努力才能从过程式思维中进行“范式转换”。


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