views:

74

answers:

4

I have encountered a problem, for which no matter how long I study the API's of the class and superclasses, I can not figure out.

Suppose I wish to design a sort of a game where the mouse motion controls the motion of a block that is used to bounce a ball, which then destroys multi colored bricks.

How do you specifically make the block "listen" to the mouse? The below code is what I have attempted to achieve the desired results.

/** 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);

        }

}

Any clarification on why/what I am doing incorrectly would be helpful, thanks.

A: 

After mouseMoved() updates the paddle location, you would typically invoke repaint() on the display component. Is there anything in GraphicsProgram apropos to this?

trashgod
+1  A: 

Your class is all set to be used as a mouse listener -- you just have to tell some component to send you MouseEvents. In order to do that, you need to implement MouseMotionListener, which you've already done, so you're most of the way there.

All that's left to do is call the method addMouseMotionListener(this) on your JFrame, JDialog, or whatever window you're using.

In the future, it may be worth setting up a separate class to serve as the listener, just to keep your code straight; the most common solution is called an anonymous inner class, which you may want to Google. But with your deadline approaching, what you've got will work fine.

Etaoin
Thank you very much
Kevin Zhou
A: 

It looks like all of the classes belong to your application, so I am guessing you are working with AWT or Swing.

Try calling repaint() on the paddle.

Tim Bender
A: 

Just an extra comment to "Etaoin", when you get time and if you are serious about doing OO well, do a search on "is-a" and "has-a" relationships in OO.

If the "is-a" relationship holds true (an apple "is-a" fruit) then its legitimate to use the implements on the class, otherwise if its a "has-a" relationship (a car "has-a" wheel, but a car "is-not-a" wheel) then implements is NOT appropriate - you need to use composition, in other words a member variable of the class.

In your code, can you say that the Breakout class "is-a" MouseMotionListener? The answer is "no", BTW! Breakout "is-a" game, or is an application, but the MOuseMotionListener is part of the implementation.

As "Etaoin" has said, you should implement the MouseMotionListener as an inner class, though I prefer private inner classes, not anonymous classes (to keep the constructor short and to the point, among other reasons).

When you "get" OO, its great and very powerful, but takes real effort to make the "paradigm shift" from procedural thinking.

DecaniBass