2013-03-24 25 views
5

Tôi đang cố gắng cuộn một loạt hình chữ nhật theo chiều dọc. Mỗi hình chữ nhật có một khoảng cách cố định từ tiếp theo. Hình chữ nhật đầu tiên không bao giờ được dưới 10 pixel từ phía trên cùng của màn hình trong khi tương tự như hình chữ nhật cuối cùng không bao giờ được nhiều hơn 20 pixel trên một hộp văn bản. Nói cách khác, tôi bắt chước ứng dụng SMS trong Windows Phone.Kinetic di chuyển một Danh sách <Rectangle> trong XNA

Phương pháp dưới đây, theo lý thuyết, di chuyển hình chữ nhật theo phương diện, và trong một số trường hợp, một số hình chữ nhật gần nhau hơn chúng nên chồng chéo lên nhau. Hiệu ứng dường như được phóng đại khi các cảnh quay trên màn hình chậm.

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); 
    } 
} 

Tôi thực sự không hiểu Vectors vì vậy tôi xin lỗi nếu đây là câu hỏi ngu ngốc.

Trả lời

0

Tôi không thực sự hiểu rõ những gì bạn đang cố gắng đạt được. Nhưng tôi tìm thấy trong mã của bạn một vấn đề: suy tuyến tính của bạn (Vector2.Lerp) không thực sự có ý nghĩa (hay tôi thiếu một cái gì đó?):

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

Vâng về cơ bản tôi chỉ muốn để có thể kinetically di chuyển một danh sách các Các đối tượng hình chữ nhật dựa trên các đầu vào cảm ứng. Đây là một triển khai XNA của một giao diện rất giống với một ứng dụng SMS có luồng. Ngoài ra tôi đã không hoàn toàn hiểu câu trả lời của bạn; Tôi thêm điều kiện if vì tôi đọc ở đâu đó rằng 'Lerp' sẽ không đạt được mục tiêu, chỉ nhận được rất gần với nó, do đó, ngưỡng' omega' là ở đó để nó đủ gần với mục tiêu nó chỉ gán nó. Nó có thể vẫn là sai mặc dù. –