2016-08-16 1 views
-1

sur la figure 1.Animation d'une liste de points pour passer d'une L'animation Je travaille sur la réalisation est illustré ci-dessous emplacement de contact donné

1) J'ai une liste contenant des points sur un plan 2D (à gauche) qui Je travaille sur l'animation.

2) Un contact est effectué à l'emplacement x, et un cercle invisible est tracé (au milieu). Je veux que tous les points contenus dans ce cercle s'éloignent du centre (x).

3) Un dernier exemple de résultat (à droite)

Je prévois l'application de cette manière que je peux fournir une liste de points, l'emplacement contact, numFrames et force appliquée sur chaque point par trame. Un tableau de longueur numFrames est renvoyé, chaque élément de tableau étant une liste déjà animée.

Étant donné que je prévois d'implémenter cette fonction tactile à l'écran, il est possible qu'un autre contact se produise alors que la première animation tactile est déjà en cours. Comment puis-je gérer ces collisions?

Figure 1: 2D Point Animation

+0

Je ne comprends pas si vous avez besoin de la mise en œuvre des points en aller ou tout simplement besoin d'un conseil pour gérer co llisions – lelloman

+0

J'ai besoin des deux s'il vous plaît – Slvrfn

+0

hum je peux vous aider avec la première animation mais les collisions ... humm quel ordre de grandeur est le nombre de points dans la vue? – lelloman

Répondre

1

voici mes 2 cents, vous avez besoin d'une liste de points, ces points devraient avoir une position, une vitesse et une méthode pour mettre à jour la position. quelque chose comme ça

public class Point { 
    public float x, y; 
    public boolean isMoving; 
    private float dx,dy; 

    public Point(float x, float y){ 
     this.x = x; 
     this.y = y; 
    } 

    public boolean move(float maxWidth, float maxHeight){ 
     if(!isMoving) return false; 

     // update the position 
     x += dx; 
     y += dy; 

     dx /= FRICTION; 
     dy /= FRICTION; 

     // bounce...? 
     if(x < 0 || x > maxWidth){ 
      dx *= -1; 
     } 
     if(y < 0 || y > maxHeight){ 
      dy *= -1; 
     } 

     if(Math.abs(dx) < MOVEMENT_THRESHOLD && Math.abs(dy) < MOVEMENT_THRESHOLD){ 
      isMoving = false; 
     } 

     return isMoving; 
    } 
} 

sur chaque événement tactile vous appliquer une force à chaque point dans le rayon et régler leur vitesse

for(Point point : mPoints){ 
    float distance = point.distance(x,y); 

    if(distance > mTouchRange) continue; 

    float force = (float) Math.pow(1 - (distance/mTouchRange), 2) * mForceFactor; 
    float angle = point.angle(x,y); 

    point.dx -= Math.cos(angle) * force; 
    point.dy -= Math.sin(angle) * force; 
    point.isMoving = true; 
} 

alors vous avez besoin d'une animation qui appellent mouvement sur chaque image et arrête eventully lorsque il n'y a pas de points en mouvement

vous trouverez l'exemple complet here

+0

C'est très bien! Mais je ne suis pas sûr que ce soit la gestion des collisions dont j'ai besoin. Pendant l'animation, les points sont déplacés de manière incrémentielle. Si une animation tactile est en cours, comment pourrais-je gérer une seconde animation si certains points sont partagés dans les régions d'animation? – Slvrfn

+0

le problème avec la gestion des collisions est que vous devez calculer la distance de chaque point de chaque autre point, ce qui augmenterait le calcul exponentiellement. une façon d'éviter cela serait de diviser votre espace en tuiles et de calculer des collisions uniquement pour les points situés dans la même tuile ou dans une case adjacente, de cette façon vous augmentez la complexité du code par beaucoup – lelloman

+0

J'ai trouvé une solution simple à mon problème problème. Et votre message m'a aidé à atteindre cette conclusion. Je ne m'inquiétais pas de la collision des points individuels, mais de la manipulation de forces multiples sur un point. La gestion des collisions peut être obtenue en ayant plus d'une force sur un point donné dans l'ordre. La position du point après la série de transformations de force est la même que si les forces avaient agi en même temps. – Slvrfn