2013-03-24 8 views
5

Sto provando a scorrere una serie di rettangoli verticalmente. Ogni rettangolo ha una distanza fissa dalla successiva. Il primo rettangolo non deve mai essere inferiore a 10 pixel dalla parte superiore dello schermo, mentre allo stesso modo l'ultimo rettangolo non deve mai essere più di 20 pixel sopra una casella di testo. In altre parole, sto simulando l'applicazione SMS in Windows Phone.Cinetica che scorre una lista <Rectangle> in XNA

Il metodo di seguito dovrebbe, in teoria, far scorrere i rettangoli cineticamente, e mentre lo fa, in alcuni casi alcuni dei rettangoli si avvicinano l'un l'altro di quanto dovrebbero (eventualmente sovrapposti). L'effetto sembra essere ingrandito quando i film sullo schermo sono lenti.

private void Flick() 
{ 
    int toMoveBy = (int)flickDeltaY; 
    //flickDeltaY is assigned in the HandleInput() method as shown below 
    //flickDeltaY = s.Delta.Y * (float)gameTime.ElapsedGameTime.TotalSeconds; 

    for (int i = 0; i < messages.Count; i++) 
    { 
     ChatMessage message = messages[i]; 
     if (i == 0 && flickDeltaY > 0) 
     { 
      if (message.Bounds.Y + flickDeltaY > 10) 
      { 
       toMoveBy = 10 - message.Bounds.Top; 
       break; 
      } 
     } 
     if (i == messages.Count - 1 && flickDeltaY < 0) 
     { 
      if (message.Bounds.Bottom + flickDeltaY < textBox.Top - 20) 
      { 
       toMoveBy = textBox.Top - 20 - message.Bounds.Bottom; 
       break; 
      } 
     } 
    } 
    foreach (ChatMessage cm in messages) 
    { 
     Vector2 target = new Vector2(cm.Bounds.X, cm.Bounds.Y + toMoveBy); 
     Vector2 newPos = Vector2.Lerp(new Vector2(cm.Bounds.X, cm.Bounds.Y), target, 0.5F); 
     float omega = 0.05f; 
     if (Vector2.Distance(newPos, target) < omega) 
     { 
      newPos = target; 
     } 
     cm.Bounds = new Rectangle((int)newPos.X, (int)newPos.Y, cm.Bounds.Width, cm.Bounds.Height); 
    } 
} 

Realmente non capisco Vettori quindi mi scuso se questa è una domanda stupida.

risposta

0

In realtà non capisco perfettamente cosa si stia cercando di ottenere. Ma ho trovato nel codice un problema: il vostro interpolazione lineare (Vector2.Lerp) non fa davvero senso (o mi sto perdendo qualcosa?):

Vector2 target = new Vector2(cm.Bounds.X, cm.Bounds.Y + toMoveBy); // <-- the target is Y-ToMoveBy different from the actual Y position 
Vector2 newPos = Vector2.Lerp(new Vector2(cm.Bounds.X, cm.Bounds.Y), target, 0.5F); // <-- this line is equivalent to say that newPos will be new Vector2(cm.Bounds.X, cm.Bounds.Y + toMoveBy/2); 
float omega = 0.05f; 
if (Vector2.Distance(newPos, target) < omega) // So the only chance to happen is toMoveBy == 0.10 ??? (because you modify `cm` each time `Flick()` is called ? - see next line) 
{ 
    newPos = target; 
} 
cm.Bounds = new Rectangle((int)newPos.X, (int)newPos.Y, cm.Bounds.Width, cm.Bounds.Height); // <-- Equivalent to new Rectangle((int)cm.Bounds.X, (int)cm.Bounds.Y + toMoveBy/2, ...) 
+0

Beh in fondo voglio solo essere in grado di scorrere un elenco di cineticamente Oggetti rettangolari basati su input tattili. Questa è un'implementazione XNA di un'interfaccia molto simile a un'applicazione SMS filettata. Inoltre non ho capito bene la tua risposta; Ho aggiunto la condizione if, perché ho letto da qualche parte che 'Lerp' non raggiungerà il bersaglio, ma ci avvicineremo molto, quindi la soglia' omega' è lì in modo che quando si avvicina abbastanza al bersaglio, lo assegna. Potrebbe comunque essere sbagliato. –

Problemi correlati