Android粒子系统融合单点

时间:2011-09-29 01:25:48

标签: android graphics draw particles

好的我在Android中有一个粒子系统。

现在我使用500个左右的粒子,它们在屏幕上随机移动。我设置它以便触摸(实际上现在运动)。所有的粒子都会接近你的手指。问题在于它们以静态角度接近(不是从接触点进入它们的角度)。

任何人都有算法确定如何均匀接近一个点?我尝试在randians中获得角度然后转换等等......变得非常混乱。这个简单的方法表明我以正确的速度移动..但这是一个简单的45角度方法。 (请记住,android没有负x,y坐标..左上角是0,0 ..右下角是(max,max)。函数采用ontouch(x,y)坐标.bx,by粒子坐标。

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 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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

这有用吗?我刚刚把它写出来,没有试过或者没想过。