Как остановить / ограничить выполнение какого-либо метода (~ когда объект уже вызывается) - PullRequest
2 голосов
/ 17 октября 2010

Я застрял в ситуации, когда мне нужно перемещать шары в многопользовательском режиме, я использую RMI в распределенной анимации движущихся шариков.

Моя цель состоит в том, чтобы перемещать несколько шариков таким образом, чтобы несколько клиентов наблюдали одно и то же движение / положение шариков, используя объект-шарик, который является удаленным объектом.

Моя проблема: Я вызываю функцию перемещения, которая является удаленной, и увеличение числа клиентов не приводит к вызову этой функции более часто, и это приводит к увеличению скорости мяча из-за увеличения вызовы этого метода от разных клиентов.

Может кто-нибудь, пожалуйста, порекомендуйте мне, как я могу справиться с этой проблемой, чтобы, когда мяч уже перемещался на одном клиенте, тогда другой шар не вызывал функцию, а просто использовал это.

вот код:

public void start() {
        Play = true;
        Thread t = new Thread(this);
        t.start();
    }

public void run() {

    while (Play == true) {
        runball();
        pit.repaint();
        try {
            Thread.sleep(50);
        } catch (InterruptedException ie) {
            stop();
        }
    }
}

public void runball() {

    try {
            aBall.setBounds(pit.getWidth(), pit.getHeight());
            aBall.move();
            }

        catch (Exception e) {
            e.printStackTrace();
        }
}

и у меня есть метод удаленного перемещения:

public  void move() throws RemoteException {
        // ... Move the ball at the give velocity.
        m_x += m_velocityX;
        m_y += m_velocityY;

    if (m_x < 0) { // If at or beyond left side
        m_x = 0; // Place against edge and
        m_velocityX = -m_velocityX;

    } else if (m_x > m_rightBound) { // If at or beyond right side
        m_x = m_rightBound; // Place against right edge.
        m_velocityX = -m_velocityX;
    }

    if (m_y < 0) { // if we're at top
        m_y = 1;
        m_velocityY = -m_velocityY;

    } else if (m_y > m_bottomBound) { // if we're at bottom
        m_y = m_bottomBound;
        m_velocityY = -m_velocityY;

    }

}

Может кто-нибудь подсказать, пожалуйста, в этом дизайне есть какая-то проблема, и я неправильно использую RMI? или порекомендуйте мне какой-нибудь дизайн, с помощью которого я смогу достичь своей цели.

спасибо большое,

jibby

1 Ответ

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

Я не думаю, что ваши клиенты должны указывать серверу перемещать шары.

Вместо этого должен быть серверный поток, который перемещает мяч с необходимой скоростью. Клиенты должны просто спрашивать сервер, где сейчас находится мяч.

...