Система частиц Android сходится в одной точке - PullRequest
1 голос
/ 29 сентября 2011

Хорошо, у меня есть система частиц в Android.

Прямо сейчас я использую 500 или около того частиц, и они случайно перемещаются по экрану. Я установил это так на ощупь (собственно движение прямо сейчас) что все частицы приблизятся к вашему пальцу. Проблема в том, что они приближаются под статическим углом (не принимая во внимание угол, который они находятся от точки касания).

У кого-нибудь есть алгоритм, чтобы определить, как равномерно приблизиться к точке? Моя попытка получить угол у рандианцев ... затем преобразовать и т. Д. Стала действительно грязной. Этот простой подход показал, что я двигаюсь в правильном темпе ... но это простой подход под 45 углом. (имейте в виду, что на Android нет отрицательных координат x, y .. и слева вверху 0,0 .. справа внизу (max, max). Функция принимает координаты касания (x, y). bx, by are координаты частицы.

public void moveParticles(float x, float y) {
    for (Particle b : Particles)
        {
         if (x <= b.x)
             b.x = b.x -1;
         else b.x = b.x +1;

          if (y <= b.y)
            b.y = b.y -1;
          else b.y = b.y +1;
         }          
}

Ответы [ 2 ]

2 голосов
/ 29 сентября 2011

Наивный код, предполагающий, что касание находится в центре экрана:

public void moveParticles(float x, float y) {
    for (Particle b : Particles) {
      b.x += ((b.x-x)/(x/2))*speedmodifier;
      b.y += ((b.y-y)/(y/2))*speedmodifier;
    }
}

Код с нормализованными скоростями каждой стороны оси касания:

public void moveParticles(float x, float y) {
    for (Particle b : Particles) {
      height_difference = screenheight-x;
      width_difference = screenwidth-y;
      height_ratio = (b.x < x) ? screen_height-height_difference : height_diffrence;
      width_ratio = (b.y < y) ? screenwidth-width_difference : width_difference;

      b.x += ((b.x-x)/height_ratio)*speedmodifier;
      b.y += ((b.y-y)/width_ratio)*speedmodifier;
    }
}

Шаги, чтобы сделать этот код: Вам необходимо получить соотношение экрана выше и ниже оси x и y, чтобы нормализовать скорость частиц от 0 до 1 независимо от того, где находится касание:

height_difference = screenheight-x;
width_difference = screenwidth-y;
height_ratio = (b.x < x) ? screen_height-height_difference : height_diffrence;
width_ratio = (b.y < y) ? screenwidth-width_difference : width_difference;

Как только мы получим эту информацию о нормализации, мы сможем использовать ее для нормализации скоростей частиц:

b.x += ((b.x-x)/height_ratio)*speedmodifier;
b.y += ((b.y-y)/width_ratio)*speedmodifier;
1 голос
/ 29 сентября 2011

Возьмем смещение частицы как вектор с точкой схождения в качестве источника:

x = particle.x - finger.x
y = particle.y - finger.y

Получить единичный вектор:

norm = sqrt(pow(x, 2.0) + pow(y, 2.0))
x = x / norm
y = y / norm

Смещение частицы по единичному вектору * -1 * коэффициент скорости:

particle.x -= x * speed
particle.y -= y * speed

Это работает?Я просто написал это, не пробовал или ничего.

...