Гравитационный симулятор в Java - PullRequest
1 голос
/ 18 января 2012

В этой программе я моделирую гравитацию.Все работает, но когда мяч больше не движется, он продолжает подпрыгивать на 1-5 пикселей в зависимости от установленного мной значения силы тяжести.Как я могу остановить мяч, когда энергия потеряна?Я хочу, чтобы xSpeed ​​стал 0, а шар оставался в фиксированной позиции.

Редактировать: Гравитация варьируется от 1 до 100. Пользователь может изменять гравитацию.

energyLoss = 0,9 и dt = 0,2

// right and left wall collision
        if (x + xSpeed > this.getWidth() - radius - 1) {
            x = this.getWidth() - radius - 1;
            xSpeed = -xSpeed;
        } else if (x + xSpeed < 0 + radius) {
            x = 0 + radius;
            xSpeed = -xSpeed;
        } else
            x += xSpeed;

        if (y == this.getHeight() - radius - 1) {

        }

        if (y > this.getHeight() - radius - 1) {
            y = this.getHeight() - radius - 1;
            ySpeed *= energyLoss;
            ySpeed = -ySpeed;

            // friction with the ground
            xSpeed *= xFriction;
            if (Math.abs(xSpeed) < .4)
                xSpeed = 0;

        } else {
            ySpeed += gravity * dt; // velocity formula
            y += ySpeed * dt + .5 * gravity * dt * dt; // position formula
        }

        repaint();

Ответы [ 2 ]

2 голосов
/ 18 января 2012

Упрощенный ответ

После этой строки:

ySpeed *= energyLoss;

Изменить эту строку:

ySpeed = -ySpeed;

На что-то вроде этого:

if (ySpeed < SomeMinimumValue)
{
    ySpeed = 0;
}
else // invert speed, i.e. change direction.
{
    ySpeed = -ySpeed;
}

Редактировать;Вторая попытка:

if (Math.abs(ySpeed) < SomeMinimumValue)
... as above.

Меньше кода, больше разговоров

Похоже, что проблема заключается в том, что мяч падает на "землю" с низкой скоростью y и / x.Если это так, вам нужно обнулить скорость при ударе о «землю» с достаточно низкой скоростью y или x;нулевая скорость y, если скорость y достаточно низкая, и нулевая скорость x, если скорость x достаточно низкая, не обязательно обе в одно и то же время.Вам также необходимо убедиться, что вы не обнуляете скорость x при ударе y и не обнуляете скорость y при ударе x.

1 голос
/ 18 января 2012

Самым простым способом решения этой проблемы является обнаружение особого случая, когда шар находится на стене с 0 (или очень маленькой) скоростью Y. Это в основном то, что предлагает DwB.

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

Примерно так:

// right and left wall collision
    if (x + xSpeed > this.getWidth() - radius - 1) {
        x = this.getWidth() - radius - 1;
        xSpeed = -xSpeed;
    } else if (x + xSpeed < 0 + radius) {
        x = 0 + radius;
        xSpeed = -xSpeed;
    } else
        x += xSpeed;

    if (y == this.getHeight() - radius - 1 
        && ySpeed == 0) { // Check speed too here!
        // Do nothing for Y.
        // friction with the ground
        xSpeed *= xFriction;
        if (Math.abs(xSpeed) < .4)
            xSpeed = 0
    }
    else if (y > this.getHeight() - radius - 1) {
        y = this.getHeight() - radius - 1;
        ySpeed *= energyLoss;
        if (Math.abs(ySpeed) < SomeMinimumValue)
            ySpeed = 0;
        else // invert speed, i.e. change direction.
            ySpeed = -ySpeed;

        // friction with the ground
        xSpeed *= xFriction;
        if (Math.abs(xSpeed) < .4)
            xSpeed = 0;

    } else {
        ySpeed += gravity * dt; // velocity formula
        y += ySpeed * dt + .5 * gravity * dt * dt; // position formula
    }

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