5

一連の長方形を垂直にスクロールしようとしています。各長方形は、次の長方形から一定の距離を持っています。最初の四角形は画面の上端から 10 ピクセル未満にしないでください。同様に、最後の四角形はテキスト ボックスの上に 20 ピクセル以上離してはなりません。つまり、Windows Phone の SMS アプリケーションを模倣しています。

以下の方法は、理論的には四角形を動的にスクロールする必要がありますが、場合によっては、一部の四角形が本来よりも互いに近くなります (最終的に重なります)。画面のフリックが遅いと効果が大きくなるようです。

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

私はベクトルを本当に理解していないので、これがばかげた質問であれば申し訳ありません。

4

1 に答える 1

0

あなたが達成しようとしていることを完全には理解していません。しかし、私はあなたのコードに問題があることを発見しました: あなたの線形補間 ( Vector2.Lerp) は本当に意味がありません (または何か不足していますか?):

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, ...)
于 2013-06-07T08:19:14.920 に答える