Android прыгающий мяч - PullRequest
       10

Android прыгающий мяч

4 голосов
/ 23 декабря 2010

Так что я просто пытаюсь заставить шар отскочить вокруг экрана, который должен замедляться из-за силы тяжести и отражаться (отскакивать) от стены, как обычный шарик. Может кто-нибудь дать некоторые основы и ОЧЕНЬ простую реализацию этого? Другие примеры кажутся немного «преувеличенными» и выходят за рамки того, что я хочу сделать. Я пробовал это:

public void updateLogic() {

    if (x < -1) {

        xPos += (-x * gravity);
    } else if (x > 1) {

        xPos -= (x * gravity);
    }
    if (y > 1) {

        yPos += (y * gravity);
    } else if (y < -1) {

        yPos -= (-y * gravity);
    }
}

Это самое близкое, что я получил сам. Кстати, значения x и y взяты из акселерометра. Любая помощь будет высоко ценится, спасибо!

Ответы [ 3 ]

6 голосов
/ 23 декабря 2010

Я думаю, вам понадобятся три вещи для этого: силы (x и y, которые у вас есть), скорости (назовите их xVel и yVel) и позиции (xPos и ​​yPos, которые у вас также есть).Положение мяча обновляется (самым простым способом) следующим образом:

xPos += dt*xVel; 
yPos += dt*yVel;

xVel += dt*x;
yVel += dt*y;

Переменная 'dt' является временным шагом , который управляет скоростью перемещения мяча.Однако, если он установлен слишком большим, программа будет нестабильной!Попробуйте dt = 0.001 или около того, чтобы начать и постепенно увеличивать его.

Затем, чтобы шар отразился от стен, просто измените скорость, если он ударяет о стену:

if (xPos > xMax) {
    xPos = xMax;
    xVel *= -1.0;
} else if (xPos < 0.0) {
    xPos = 0.0;
    xVel *= -1.0;
}

и то же самое для y.«XPos = ...» просто для того, чтобы остановить движение мяча от края экрана.Если вы хотите, чтобы мяч каждый раз слегка ударялся о стену, измените «-1,0» на «-0,9» или что-то еще (это коэффициент восстановления ).

Надеюсь, это все.Удачи!

2 голосов
/ 23 декабря 2010

Некоторые комментарии к вашему актуальному коду:

  • Обе эти строки делают одно и то же:

    yPos -= (-y * gravity);
    yPos += (y * gravity);
    

    аналогично, обе эти строки делают одно и то же:

    xPos += (-x * gravity);
    xPos -= (x * gravity);
    
  • Вы не рассматриваете дела -1 <= x <= 1 или -1 <= y <= 1

Некоторые комментарии к понятиям:

  • Начните с одного мяча.
  • Вы хотите, чтобы шар имел две отдельные скорости (как положительную, так и отрицательную), одну в направлении x и одну в направлении y. В каждом кадре добавляйте эти скорости в положение мяча.
  • Затем добавьте обнаружение столкновений. Проверьте каждый кадр, если центр шара находится за пределами экрана. Если это так, заставьте его отскочить (самый простой способ сделать это - сделать положительную скорость мяча у-положительной, когда он отклоняется от наиболее отрицательного значения y, отображаемого на экране, и сделать то же самое для другого экрана - края) .
  • Улучшение обнаружения столкновений: посмотрите, сможете ли вы выяснить, как проверить, находится ли любая часть мяча вне экрана (подсказка: чтобы проверить, находится ли мяч слева от мяча на экране, вам нужно только проверить крайнюю левую координату шара)
  • Затем примите во внимание гравитацию - гравитация будет постоянным числом, вычитаемым из y-скорости каждый кадр, пока y-скорость не достигнет 0.
2 голосов
/ 23 декабря 2010

Youtube видео

Исходный код доступен на github .

  1. На вашу координату x гравитация не должна влиять.
  2. Я бы не советовал использовать акселерометры, пока вы не поймете, как физика работает для простого случая.

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

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

...