2011-09-29 35 views
1

好吧我有一個粒子系統在Android。Android粒子系統融合單點

現在我用500級左右的粒子,它們隨意在屏幕上移動。我把它設置好以便接觸(現在實際上是運動)。所有的粒子都會接近你的手指。問題在於他們正在以一個靜態角度接近(而不是從他們接觸的角度)。

任何人都有的算法來確定如何均勻地接近一個點?我嘗試在randians中獲得角度,然後轉換等等。真的很混亂。這種簡單的方法表明我以正確的步調移動......但它是一種簡單的45度角方法。 (請記住在android中沒有負x,y座標..和左上角是0,0 ..右下角是(max,max)。函數採用ontouch(x,y)座標。顆粒coordiantes

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; 
     }   
} 
+0

平均而言,你的意思是一個更好的過渡,而不是直接指向觸摸點?像往中心的圓形運動一樣? – Jack

+0

如果你看看代碼是如何在它碰到原點的x軸或y軸後以45度的角度接近觸點的話。它會轉到原點。實際上每個粒子應該以直線方式接近點或原點。 – DJPlayer

回答

2

,它假定觸摸樸素代碼是在屏幕的中心:

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; 
+0

omg !!這太容易了,我只是很尷尬。我得到角度,轉換弧度,使用罪和cos等..哦btw ..改變你的代碼b.x - = .....;並通過 - = ......「謝謝。因爲我把我的頭埋在恥辱之中.. – DJPlayer

+0

對於集中式觸摸是非常容易的,但是現在我已經添加了可能不居中的觸摸的代碼,請參閱代碼中的第一個函數如下。很高興它幫助! – Serdalis

+0

我實現的一個好的部分。我注意到,我的平板電腦屏幕上(所以我有很多的房地產上播放)。當你觸摸時,縮小區域幾乎類似於我所做的就是將速度調節器設置爲基於從接觸點到粒子的距離進行計算,因此遠離對象的距離會比靜態速度更快,從而使收斂看起來更加圓滑,而不是「方形」 。可能會拋出一個非常受控制的數字,以防止它看起來幾何。 – DJPlayer

1

以粒子的位移與收斂點爲起點的載體:

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 

運作的?我只是寫了這個,沒有嘗試或沒有。