Вызов метода MouseMotion Sensor - PullRequest
4 голосов
/ 28 апреля 2010

Я столкнулся с проблемой, для которой, независимо от того, как долго я изучаю 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 голос
/ 28 апреля 2010

Ваш класс полностью настроен для использования в качестве прослушивателя мыши - вам просто нужно указать какой-то компонент для отправки вам MouseEvents. Чтобы сделать это, вам нужно реализовать MouseMotionListener, что вы уже сделали, так что вы в большинстве случаев там.

Все, что осталось сделать, - это вызвать метод addMouseMotionListener(this) в вашем JFrame, JDialog или любом другом используемом вами окне.

В будущем, возможно, стоит создать отдельный класс, который будет служить слушателем, просто чтобы сохранить ваш код прямым; наиболее распространенное решение называется анонимный внутренний класс , который вы можете использовать в Google. Но с приближением вашего срока все, что у вас будет, будет работать нормально.

0 голосов
/ 24 октября 2010

Просто дополнительный комментарий к "Etaoin", когда у вас есть время и если вы серьезно относитесь к хорошему OO, выполните поиск по отношениям "is-a" и "has-a" в OO.

Если отношение «есть» является верным («яблоко» является «фруктом»), то вполне допустимо использовать implements в классе, в противном случае, если оно имеет отношение «имеет» (автомобиль) has-a "колесо, но автомобиль" is-not-a "wheel), тогда implements НЕ подходит - вам нужно использовать состав , другими словами переменную-член класса.

Можете ли вы сказать в своем коде, что Breakout класс "is-a" MouseMotionListener? Ответ "нет", кстати! Breakout "is-a" игра или приложение, но MOuseMotionListener является частью реализации .

Как сказал "Etaoin", вы должны реализовать MouseMotionListener как внутренний класс, хотя я предпочитаю закрытые внутренние классы, а не анонимные классы (чтобы конструктор был коротким и конкретным, среди прочих причин).

Когда вы «получаете» ОО, оно великое и очень мощное, но требует реальных усилий, чтобы «сместить парадигму» из процедурного мышления.

0 голосов
/ 28 апреля 2010

Похоже, что все классы принадлежат вашему приложению, поэтому я предполагаю, что вы работаете с AWT или Swing.

Попробуйте вызвать repaint () на весле.

0 голосов
/ 28 апреля 2010

После того, как mouseMoved() обновит расположение весла, вы обычно вызываете repaint() на компоненте дисплея.Есть ли что-то в GraphicsProgram по этому поводу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...